XSLT (pour eXtensible Stylesheet Language, Transformation, référence) est une norme qui décrit des méthodes permettant de transformer un document XML en un autre document XML, HTML, ou autre.
Un exemple très simple (extrait de la page principale où l'on trouvera un exemple complet d'exécution) montre le principe des transformations XSLT :
<xsl:template match="GENS">
<body>
<h1>Annuaire téléphonique</h1>
<table border="1">
<th width="50%" >Nom</th>
<xsl:apply-templates/>
</table>
</body>
<xsl:template match="PERSONNE">
<tr>
<td align="center"><xsl:value-of
select="child::NOM"/></td>
</tr>
</xsl:template>
Le processeur va rechercher tous les noeuds de l'arborescence de type <GENS>, générer la structure d'une table et une ligne d'en-tête, puis traiter le sous arbre en cherchant d'autres règles.
Rencontrant un noeud de type <PERSONNE>, il va créer une ligne de tableau contenant une seule colonne (en écrivant simplement <tr><td>...</td><tr>) et afficher la valeur du fils de type <NOM>.
Ce simple exemple montre bien le principe de XSLT. Il montre aussi que le document généré par une telle transformation peut bien sûr être un fichier XML ou un fichier HTML, mais peut aussi bien, si l'on connait la structure de tels documents être un fichier PDF, LATEX ou RTF.
Pour affiner le traitement, XSLT propose deux élements de base :
Quelques fonctions simples permettent de réaliser la plupart des traitements :
Fonction XSLT | Description |
xsl:for-each | Boucle |
xsl:if | Si conditionnel |
xsl:choose, xsl:when et xsl:otherwise | Suite de codes conditionnels : instruction switch en C |
xsl:template, xsl:call-template, xsl:param et xsl:with-param | Déclarer et appeler une fonction, avec ou sans paramètre(s). |
xsl:number | Numérotation/compteur |
L'exemple qui suit crée une liste en parcourant l'ensemble des fils de type Oeuvre du noeud courant :
<ul>
<xsl:for-each select="child::Oeuvre">
<li><xsl:value-of select="child::Titre"/></li>
</xsl:for-each>
</ul>
Un traitement plus évolué permettra de tester la valeur d'un noeud. Dans l'exemple qui suit, on teste la valeur de l'attribut lang du noeud article et on affiche un titre adapté :
<xsl:choose>
<xsl:when test="/article[@lang='fr']">
<center>Table des matières</center>
</xsl:when>
<xsl:otherwise>
<center>Table of Contents</center>
</xsl:otherwise>
</xsl:choose>
Le langage XPATH permet de spécifier les divers noeuds d'un arbre XML et de réaliser des parcours à l'aide des fonctions décrites dans le tableau ci-dessous. Certaines d'entre elles ont déjà été utilisées dans les exemples.
Axe | Description |
self | Noeud courant (noté aussi .) |
child | Noeud fils (par défaut) |
descendant | Noeuds descendant du noeud courant (donc ses fils, les fils de ses fils et ainsi de suite) |
descendant-or-self | Idem, mais inclu aussi le noeud courant (noté //) |
parent | Noeud parent du noeud courant (noté aussi ..) |
ancestor | Ancêtres du noeud courant (parent, parent de ses parents etc.) |
ancestor-or-self | Idem mais inclu aussi le noeud courant |
following-sibling | Noeuds frères (ayant le même parent) se trouvant après le noeud courant |
preceding-sibling | Noeuds frères se trouvant après le noeud courant |
following | Noeuds se trouvant après le noeud courant dans le document |
preceding | Noeuds se trouvant avant le noeud courant dans le document |
attribute | Les attributs du noeud courant (abrégé @) |
namespace | Les noeuds de type namespace du noeud courant |
Fonction | Description |
last() | Renvoie un booléen indiquant si le noeud est le dernier |
position() | Renvoie la position du noeud |
count(noeuds) | Renvoie le nombre de noeuds |
concat(chaîne, chaîne, ...) | Concatène les chaînes passées en argument |
starts-with(chaîne1, chaîne2) | Indique si la chaîne 1 commence avec les caractères de la chaîne 2 |
contains(chaine1, chaîne2) | Indique si la chaîne 1 contient la chaîne 2 |
substring(chaîne, entier1, entier2 ?) | Renvoie la partie de la chaîne commençant à la position entier1 et d'une longueur entier2 (renvoie la fin de la chaîne si entier2 n'est pas indiqué) |
string-length(chaîne) | Renvoie la longueur de la chaîne passée en argument |
current() | Renvoie l'élément courant |