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.
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
Voici
un exemple de fichier XML sur lequel va être appliqué
un processus de transformation, au travers de la référence
à la feuille de style XSLT
3.1.2
Document non régulier
Voici
un exemple de fichier XML sur lequel va être appliqué
un processus de transformation, au travers de la référence
à la feuille de style XSLT
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>
<head>
</head>
<xsl :apply-templates/>
</html>
</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
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
|