XSLT

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.

Principe de base

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 :

Fonctions

Quelques fonctions simples permettent de réaliser la plupart des traitements :

Fonction XSLTDescription
xsl:for-eachBoucle
xsl:ifSi conditionnel
xsl:choose, xsl:when et xsl:otherwiseSuite de codes conditionnels : instruction switch en C
xsl:template, xsl:call-template, xsl:param et xsl:with-paramDéclarer et appeler une fonction, avec ou sans paramètre(s).
xsl:numberNumé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>

XPATH

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.

AxeDescription
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