XSL - XSLT

Définition

XSLT (eXtensible Stylesheet Language Transformation) est un langage fonctionnel permettant de transformer n'importe quel document XML en un autre document XML.
Comme Xpath et XSL-FO, XSLT fait parti de la famille XSL.

Encore une fois, deux versions existent à ce jour (février 2012) : la version 1.0 de novembre 1999 et la version 2.0 du 23 janvier 2007. Encore une fois, c'est la première version qui reste la plus répandue même si le W3C encourage les systèmes à reconnaître les deux versions.




Principes de base

Le schéma de base représentant le fonctionnement de XSL peut se représenter comme suit :

Le langage XSLT permet de transformer un document XML en un autre document XML grâce à une feuille de style XSLT et un processeur XSLT. Les documents d'origine et de sortie doivent certes être au format XML, mais cela permet par exemple de transformer un document XML simple en une page xHTML.

Pour ce faire, le langage XSLT utilise une feuille de style XSLT qui permet de définir des "patrons" de transformation à appliquer à certaines parties du document XML. Afin de définir ces parties du document, XSLT utilise le langage Xpath vu précédemment.
On utilise souvent l'image d'un CSS pour décrire le fonctionnement de XSLT : une feuille XSLT est en quelque sorte au XML ce qu'une feuille CSS est au HTML.

Ainsi le fonctionnement de XSLT est très simple : on définie dans une feuille de style XSLT une liste de transformations associées à des expressions Xpath. Chaque partie du document XML en entrée sera transformée suivant le patron associé à l'expression Xpath à laquelle elle correspond.




Exemple simple

Pour comprendre comment écrire une feuille de style XSLT, étudions l'exemple suivant :

La première chose à comprendre ici, c'est qu'une feuille XSLT est avant tout une feuille XML ! Et oui, tout comme xHTML ou RSS, le langage XSLT est un langage dérivé du XML. Ainsi, toute feuille XSLT commence par la balise spéciale <?xml... pour définir la version XML utilisée ainsi que l'encodage.

Par la suite, comme tout document XML, la feuille de style XSLT ne possède qu'un seul noeud racine. Ici, il s'agit d'un noeud spécial indiquant que le document est ici une feuille XSLT.

Ensuite, une liste de patrons est définie, avec pour chacun d'entre eux une expression Xpath associée.

Dans cet exemple tout simple, un seul patron est défini et est lié à l'expression Xpath « / ». Cela signifie tout simplement que la racine du document source sera « remplacée » par ce qui se trouve dans la balise template. En d'autre mot, on transforme ici l'intégralité du document en ce qui se trouve dans la balise template : un document html.

Afin d'avoir tout de même une page en rapport avec le contenu du document XML, on utilise ici des balises spéciales XSLT permettant de récupérer des informations du fichier source. Ainsi, l'élement xslt for-each associé à l'expression XPath "livre" nous permet de parcourir tous les éléments "livre". La balise xsl:value-of nous permet quand à elle de récupérer le contenu de l'élément "titre". Notre transformation XSLT créé donc une page web listant les titres des livres contenus dans un fichier XML.

Détaillons maintenant les principales balises XSLT afin de mieux comprendre les possibilités offertes.




Les balises XSLT

Afin de générer un contenu dynamiquement en se basant sur le contenu du document XML source, XSLT définie plusieurs balises créant des comportements différents. Voici les plus utilisées :

balise Description
Template :
<xsl:template match="expression XPath">...</xsl:template>
La balise la plus importante du langage XSLT. C'est grâce à elle que l'on définie la transformation à effectuer. Cette balise permet de remplacer toutes les parties du document XML correspondantes à l'expression XPath par le contenu de la balise.
Value-of :
<xsl:value-of select="expression XPath"/>
Cette balise sera remplacée lors de la transformation par le contenu des éléments du document d'origine selectionnés par l'expression XPath. Ainsi, <xsl:value-of select="livre/auteur"/> deviendra le contenu de l'élément "auteur", fils de "livre" lors de la transformation.
For-each :
<xsl:for-each select="expression XPath">...</xsl:for-each>
Le contenu de cette balise sera exécuté une fois pour tous les éléments du document d'origine qui correspondent à l'expression XPath. On peut donc ici parcourir par exemple tous les éléments "livre" de notre fichier et décider à l'intérieur de la balise d'afficher le prix.
Sort :
<xsl:sort select = "expression XPath"/>
Placé à l'intérieur d'une balise for-each, la balise sort permet de trier les éléments listés par le for-each en fonction de l'élément sélectionné par l'expression XPath. Ainsi un <xsl:sort select="auteur"/> placé dans un for-each sur les "livre" permettra de parcourir la liste des "livre" triés par leurs auteurs
If :
<xsl:if test="condition">...</xsl:if>
Le contenu de la balise sera exécuté uniquement si la condition est vraie.
Apply :
<xsl:apply-templates select = "expression XPath"/>
Signifie au processeur XSLT de rechercher des templates et d'appliquers les transformations associées pour les éléments désignés par l'expression XPath. Si aucune expression n'est spécifié, le processeur recherchera des templates pour tous les éléments et sous-éléments courants.
Attention ! Si aucun template ne correspond pour un élément sélectionné par l'expression XPath, le processeur appliquera à cet élément une sorte de transformation "par défaut" qui consistera à remplacer l'élément par son contenu.

De nombreuses autres balises existent et permettent d'effectuer des transformations complexes. Néanmoins les balises ci-dessus suffisent généralement pour la majorité des cas.
Nous sommes maintenant en mesure d'étudier un cas plus complexe.




Un exemple plus concret

Très souvent XSLT est utilisé pour transformé un document XML en une page web affichable directement dans un navigateur. Cela permet de présenter des données contenus dans le fichier XML de manière plus "lisible". Voyons donc ici un exemple concret de A à Z.

Tout d'abord considérons le fichier XML suivant :

Il s'agit ici d'une simple feuille XML décrivant les membres d'une école (oui, c'est bien Hogwarts). On peut y voir des professeurs et des élèves. Tous possèdent un nom et un prénom, et les élèves possédent également des éléments "matière", décrivant les matières suivies. Ces noeuds matières possèdent quand à eux des attributs décrivant le nom de la matière, et la note obtenue par l'élève. On peut voir que le document, bien que valide, n'est pas forcément très bien écrit : les éléments noms et prénoms n'apparaissent pas toujours dans le même ordre, des noeuds "prof" se trouvent après les noeuds élèves etc. Néanmoins, grâce à XSLT, cela ne posera aucun problème.

Ecrivons maintenant une feuille de style XSLT pour transformer notre fichier XML en une page Web afin de présenter les informations d'une manière un peu plus "sexy" :



Après avoir utilisé un processeur XSLT, la transformation nous donne le fichier html suivant :

Ce qui donne dans un navigateur :

Nous voici donc avec une page HTML présentant les données du fichier XML. Les données sont ici triées et traitées afin d'obtenir un rendu dynamique. Evidemment l'exemple nous donne ici une page html assez pauvre, mais rien ne nous empêche de créer une feuille de style bien plus complexe pour créer une page web avec un rendu beaucoup plus propre, des couleurs etc.