| Accueil ISD Equipe de recherche Laboratoire Paragraphe Enssib ECP Contact |
Accueil
Chapitre 4 : Les feuilles de style
1. LES FEUILLES DE STYLES: XSL ET CSS
XSL (eXtended Stylesheet Language) et CSS (Cascading StyleSheets) sont deux outils apparemment redondants mais en réalité très complémentaires.
CSS est apparu en 1997 et proposait de dissocier la mise en page du contenu du document HTML. Il introduisait entre autres, dans la version 2, la notion de type de média permettant de gérer des mises en pages différentes en fonction du média (imprimante, écran, ...). Par contre elle n'est supportée que par les dernières versions des navigateurs.
XSL est le format de feuille de style défini pour les documents HTML. Il offre des fonctionnalités similaires à CSS en y ajoutant d'autres fonctionnalités dont la transformation de données. Malheureusement XSL n'est pas encore totalement supporté par les navigateurs, y compris les dernières versions.
De fait aujourd'hui, si l'on souhaite malgré tout utiliser les feuilles de styles XSL sans pour autant être contraint par les limites des navigateurs actuels, il est possible d'opérer la mise en forme sur le serveur et de générer un document au format HTML qui sera envoyé au navigateur.
2. XSL
2.1. Présentation
XSL est une famille de spécifications comprenant :
o XSLT (XSL Transformation) pour le parcours et la transformation d'un document source XML vers un autre document XML,
o X-Path et les patterns pour la navigation dans l'arbre XML source,
o XSL-FO (XSL Formatting objects) pour décrire la présentation d'un document.
Au départ, il n'y avait pas cette séparation, et c'est pourquoi le terme générique XSL désigne aussi bien la phase de transformation que celle de formatage.
2.2. XSL et le W3C
XSLT 1.0 et XPATH 1.0 ont un statut de recommandation du 16 Novembre 1999, dont les spécifications sont disponibles à :
http://www.w3.org/TR/1999/REC-xslt-19991116
http://www.w3.ore/TR/1999/REC-xpath-19991116
XSL, qui contient la partie XSL-FO, a un statut de recommandation du 21 Novembre 2000, dont les spécifications sont disponibles à :
http://www.w3.org/TR/2001/REC-xsl-20011015
La feuille XSL est donc la feuille de style associée au document XML. Elle contient les règles de transformation, de présentation et de mise en forme des données.
La feuille XSL intègre des fonctionnalités plus puissantes que la feuille de style CSS. Elle permet en effet de préciser des règles d'enchaînements, des conditions, des calculs, etc. .
3. XSLT: LA TRANSFORMATION
XSLT (XML Stylesheet Language Transformation) a pour objectif de définir un langage pour effectuer des transformations sur des arbres XML.
La transformation produit en sortie un fichier XML de préférence XHTM, WML, SVG, ...
Elle s'applique sur un arbre XML provenant :
- d'un fichier XML,
- d'un message (flux) XML.
XSLT permet de gérer, a partir d'une source unique d'informations, des fichiers adaptés aux différents canaux de visualisation (PC, Mobile, WebTV, … )
XSL permet de réaliser différentes opérations telles que :
- Remplacement de balise
- Numérotation automatique (liste, chapitre, page, etc.)
- Génération automatique de table de matières, d'index, etc.
- Définition de macros
- Recherche et sélection d'éléments dans un document
- Ajout de chaînes de caractères
- Application de mise en forme paramétrée
- Etc.
3.1. Document régulier versus document non régulier
Nous pouvons distinguer, de part leur nature et leur traitement spécifique en XSLT, la notion de document régulier ou non régulier.
Les documents XML réguliers :
- Leur structure est la répétition d'un élément type
- La profondeur de l'arbre est déterminée
Les documents XML non réguliers
- Leur structure est constituée d'une imbrication arbitraire d'un ensemble d'éléments
- La profondeur de l'arbre est inconnue
3.1.1 Document régulier
3.1.2 Document non régulier
3.2. Le document XSLT et son référencement
Une feuille de style XSLT est un document XML qui commence par l'en-tête XML délimitée par : <xsl:stylesheet> ... </xsl:stylesheet>
Comme IE5 est basé sur le Working Draft de XSL, certaines incompatibilités avec la recommandation peuvent être rencontrées (pas de règles implicites, extensions propres à Microsoft) et le référencement en est différent.
- pour MSXML 3 ou 4 (IE6) ou les autres outils répondant à la recommandation
<xsl :stylesheet version = "1.0"
xmlns :xsl = "http://www.w3.org/1999/XSL/Transform " >
….
</xsl :stylesheet>
- pour IE5 sans mise à jour de MSXML (1 ou 2)
<xsl :stylesheet xmlns :xsl = "http://www.w3.org/TR/WD-XSL" >
….
</xsl :stylesheet>
Une feuille de style XSLT peut-être associée à un document XML à l'aide d'une instruction de traitement XML particulière
< ?xml-stylesheet… ?>
Les parseurs XML reconnaissent cette instruction et provoquent, lors du parsing du document XML, l'appel du processeur de transformation s'il existe.
Exemple de référencement d’une feuille de style :
< ?xml-stylesheet type = « text/xsl » href = « cartes.xslt » ?>
Les parseurs XML reconnaissent cette instruction et provoquent, lors du parsing du document XML, l’appel du processeur de transformation s’il existe.
3.3. Les règles de transformation
Les feuilles de styles XSLT sont fondées sur des structures nommées modèles (templates). Un template précise ce qui doit être recherché dans l'arbre source, et ce qui doit être placé dans l'arbre résultat, la transformation.
<xsl:template> définit une règle de transformation
à <xsl:template match= "expression">
instructions XSLT
éléments XML
texte littéral
</xsl: template >
Exemple de génération HTML
<xsl :template match = "/">
</html>
<html>
<head>
</head>
<xsl :apply-templates/>
</xsl :template>Tout ce qui n'est pas préfixé par <xsl : …>, est généré tel que dans l'arbre résultat, d'où le processus de transformation.
Match est une expression de sélection de nœuds sur lesquels s'applique la règle. Elle peut-être exprimée en XPath, dont voici quelques exemples :
/ racine du document
repertoire tous les éléments <repertoire>
* tous les nœuds de type éléments
repertoire fichier tous les éléments <repertoire> ou <fichier>
racine/fichier tous les éléments <fichier> avec <racine> comme parent
repertoire//fichier tous les éléments <fichier> avec <repertoire> comme ancêtre
@nom l'attribut nom du nœud (élément) courant
fichier/@nom l'attribut nom de l'élément <fichier>
fichier[@ nom="XML"] les éléments <fichier> dont l'attribut nom vaut "XML"
comment() les commentaires
text() les nœuds texte
node() les nœuds autres que racine(*)
3.4. Sélection de règle et parcours de l'arbre
Le processeur de transformation recherche les règles qui correspondent au nœud courant (match) et en cas de multiples règles, le processeur choisit la plus prioritaire.
La priorité est définie de manière explicite ou implicite
- Explicite grâce à l'attribut "priority" de l'élément <xsl:template>
- Implicite grâce à des priorités par défaut attribuées aux patterns
Les processeurs réagissent différemment si deux règles peuvent s'appliquer à un nœud.
Le parcours de l'arbre est réalisé au travers de l'ordre <xsl:apply-templates> qui sélectionne les descendants du nœud courant avec lesquels le traitement continue.
L'élément <xsl:apply-templates> permet de descendre dans l'arbre, en précisant au processeur de traiter les éléments fils du nœud courant.
L'attribut select permet de décrire, comme l'attribut match de l'élément <xsl:template>, une expression XPath afin de restreindre le traitement aux nœuds enfants. Sans attribut select, tous les sous-éléments, les textes et commentaires sont sélectionnés.
L'élément <xsl:value-of select= "expression"> récupère la valeur d'un objet en entrée, pour la renvoyer en sortie.
Les processeurs XSLT ont deux règles implicites pour garantir le parcours récursif de l'arbre et la production des nœuds texte en l'absence de règle applicable à ce nœud.
Règles implicites
<xsl :template match = "* | / ">
<xsl :apply-templates/>
</xsl :template>
<xsl :template match = "text () " >
<xsl :value-of select = " ."/>
</xsl :template>
Ces règles implicites doivent être écrites explicitement pour les transformations basées sur MSXML 1 &2 (WD).
3.5. La génération de noeuds
Pour générer un élément et ses attributs, il faut utiliser les mots suivants :
• <xsl:element name="NomElement"> ... </xsl:element>
• <xsl:attribute name="NomAttribut">Valeur</xsl: attribut>
Pour générer les objets autres que les éléments XML, il faut utiliser les éléments suivants :
à <xsl:pi> génération d'instruction de traitement
à <xsl:comment> génération de commentaires
à <xsl:text> génération de nœud de type texte
Par défaut, <xsl:text> préserve les espaces en sortie et permet de transformer ou non, en fonction de l'attribut 'disable-output-escaping', les méta-caractères & et < en '&' et '<'.
XSLT permet de copier un nœud de l'arbre source vers l'arbre destination par <xsl:copy>. Si l'on référence un attribut, il y a copie de son nom et sa valeur.
Les attributs de l’élément et ses nœuds fils ne sont pas copiés implicitement.
3.6 Fusion de feuilles de styles
XSLT permet de traiter, comme pour les DTD et XML Schema, la modularisation des feuilles de styles par deux techniques
- <xsl:import> pour importer une feuille de styles référencée par l'attribut
à href="NomFeuilleDeStyle.xslt" pour spécifier l’URI de la feuille
- <xsl:include > pour inclure, à l'endroit où cette instruction apparaît, la feuille de style référencée par l'attribut
à href=" Nom FeuilleDeStyle.xslt" pour spécifier l’URI de la feuille
<xsl:include> peut être n'importe où au premier niveau, mais après <xsl:import>
3.7. Format de sortie
XSLT permet de spécifier le format de sortie pour le document produit par le processeur <xsl:output > avec comme attributs :
- method = "xml" | "html" | "text" pour l'interprétation de l'arbre résultat
- version="valeur"
- encoding ="CodeCaractères" pour le jeu de caractères utilisé
- omit-xml-declaration = "yes" | "no" pour générer en xml la déclaration
- standalone = "yes" | "no" pour l'attribut dans la déclaration xml
- doctype-public = "FPIFichierDTD" pour générer une instruction <!DOCTYPE ... PUBLIC "FPIFichierDTD">
- doctype-system = "URIFichierDTD" pour générer une instruction <!DOCTYPE SYSTEM "URIFichierDTD">
- cdata-section-elements = "NomElements" pour générer une section CDATA
- indent = "yes" |"no" pour l'indentation de l'arbre (traitement optionnel)
Pour l'attribut method, voici les correspondances :
- xml : les caractères tels que &, &It; sont générés tels que, en sortie
- html : pour du HTML classique avec la possibilité de générer'<' pour javascript sans le remplacer par l'entité &It;
- text: seules les valeurs chaînes de l'arbre sont générées.
3-8 Récapitulation (partielle) des éléments de base de la syntaxe XSLT[4]
Une feuille de style XSL est un document XML dont l'élément racine est xsl:stylesheet
Règles "chablon"
<xsl:template match="Critère">
...
</xsl:template>stipule ce qui doit être produit en sortie pour tout élément du document XML qui correspondrait au critère indiqué par l'attribut match. Ce qui se trouve entre la balise d'ouverture et la balise de fermeture de l'élément xsl:template servira à produire la sortie correspondant l'élément XML qui aura satisfait au critère indiqué.
Le critère peut être plus ou moins précis et correspond à un sous-ensemble de la spécification XPath.
Si l'élément auquel s'applique ce chablon contient des sous-éléments qui doivent eux aussi être traités, il faudra imbriquer une règle xsl:apply-templates à l'intérieur de l'élément xsl:template.
<xsl:apply-templates />
stipule que toutes les règles portant sur des sous-éléments de l'élément courant doivent être appliquées.
<xsl:apply-templates select="Critère" />
stipule que, parmi les règles portant sur des sous-éléments de l'élément courant, seules doivent être appliquées celles qui portent sur les sous-éléments correspondants au critère indiqué.
<xsl:for-each select="Critère">
...
</xsl:for-each>permet une itération sur tous les éléments satisfaisant le critère indiqué. Le contenu de l'élément xsl:for-each doit stipuler ce qui doit être produit pour chaque occurrence d'éléments sélectionnés.
<xsl:value-of select="Critère" />
produit en sortie le contenu de l'élément stipulé par le critére. Si l'attribut select est omis, c'est l'élément courant qui est utilisé. xsl:value-of est généralement utilisé quand le contenu de l'élément sélectionné est du texte simple.
<xsl:copy>
...
</xsl:copy>produit en sortie un élément de nom identique à l'élément courant, mais sans y mettre encore de contenu ou d'attributs. Le contenu de l'élément xsl:copy doit donc stipuler comment le contenu de l'élément de sortie doit être "rempli". Cela sera typiquement fait avec <xsl:apply-templates />
Cet élément est pratique à utiliser quand on utilise dans le document XML des éléments dont le nom correspond à des balises HTML.
<xsl:if test="ExpressionBooléenne">
...
</xsl:if>exécute les règles imbriquées dans l'élément xsl:if uniquement si l'expression booléenne fournie est évaluée à vrai.
<xsl:choose>
<xsl:when test="ExpressionBooléenne">
...
</xsl:when>
<xsl:when test="ExpressionBooléenne">
...
</xsl:when>
<xsl:otherwise>
...
</xsl:otherwise>
</xsl:choose>fonctionne d'une manière similaire au xsl:if, mais permet de tester plusieures conditions et de prévoir une alternative quand toutes les conditions échouent.
<xsl:element name="NomElementSortie">
...
</xsl:element>produit en sortie un élément du nom indiqué par l'attribut name. Des éléments xsl:attribute peuvent être imbriqués pour ajouter des attributs à l'élément produit en sortie.
<xsl:attribute name="NomAttribut">
...
</xsl:attribute>produit en sortie un attribut qui sera inséré dans l'élément de sortie courant. Le contenu de l'élément xsl:attribute servira à définir la valeur que prendra l'attribut produit en sortie.
Un contenu typique de l'élément xsl:attribute est <xsl:value-of />
Eléments de résultat litéraux:
<NomElement NomAttribut="{UneExpression}">
...
</NomElement>produit en sortie un élément du nom indiqué avec un attribut dont la valeur sera le résultat de l'expression fournie. Le contenu de l'élément d'entrée servira à définir le contenu de l'élément de sortie.
Cette notation correspond à un raccourci d'écriture. Elle est équivalente à:
<xsl:element name="NomElement">
<xsl:attribute name="NomAttribut">
<xsl:value-of select="UneExpression" />
</xsl:attribute>
...
</xsl:element>Dans cet exemple, UneExpression peut être par exemple le nom d'un sous-élément de l'élément courant ou le signe @ suivi du nom d'un attribut de l'élément courant.
<xsl:sort select="Critère" order=...>
généralement imbriqué dans un xsl:apply-templates ou un xsl:for-each, trie les éléments concernés avant de les traiter, plutôt que de les traiter dans l'ordre d'apparition dans le document XML.
L'attribut order doit valoir "ascending" ou "descending"
4. XSL-FO: LE FORMATAGE
4.1 XSL-FO par l’exemple
Voici un exemple de fichier XSL-FO et la visualisation du fichier PDF résultat, produit par FOP
Exemple de document XSL-FO produit par une feuille de style XSLT sur un document XML
Accueil ISD Equipe de recherche Laboratoire Paragraphe Enssib ECP Contact