TUTORIELS 
Transformer du XML en HTML avec XSLT

Page 1 | 2 | 3

Un exercice pratique permettant de découvrir plus en profondeur les possibilités de transformations offertes par XSL, en créant un tableau HTML à partir de données XML.
 (28 avril 2003)
 

Etudions pas à pas notre document XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="doc">
    <table>
      <tr>

La première ligne définit le document comme du XSLT répondant aux spécifications du langage, la seconde indique que les instructions XSL ne s'appliqueront qu'aux noeuds XML qui répondent au nom "doc". <doc> étant le noeuf principal de notre document XML, nous garantissont ainsi de travailler dans le cadre que nous avons défini.

Suivent des lignes HTML qui ne sont pas "retravaillées" par XSL (elles ne commencent pas <xsl:...>: elles seront directement retranscrites dans le document créé par la transformation.

        <xsl:apply-templates select="colonne"/>

Cette commande XSL applique un modèle (défini dans le fichier avec les balises <xsl:template match="nomDuModèle">) à l'endroit indiqué. C'est une sorte d'appel de fonction...

      <xsl:call-template name="compteur">
        <xsl:with-param name="N" select="1"/>
      </xsl:call-template>

Cette variation amène une différence notables: la présence de la commande with-param, qui défini la valeur du paramètre transmit au modèle. Ici, N sera égal à 1. Nous verrons dans un instant à quoi nous sert ce paramètre...

Décrivons maintenant nos deux "fonctions", colonne et compteur. Le fonctionnement de colonne est très simple: à l'aide de la fonction XSL value-of, on extrait la valeur d'un noeud donné (ici la valeur nom du noeud colonne), et on la place entre les balises d'entête <th> et </th>. Le @ devant nom indique "tous les attributs nom".

Passons maintenant à la fonction la plus complexe: compteur. C'est elle qui va parcourir le document XML et positionner les éléments au bon endroit. Pour ce faire, nous commençons par déclarer localement notre paramètre N avec param, puis nous engageons un test afin de déterminer s'il y a, dans n'importe quelle colonne, une entrée avec la position N. Dans ce cas, on crée une nouvelle rangée (<tr>) pour le tableau, et exécute les fonctions contenues dans notre if...

Vient ensuite le bloc:

        <xsl:for-each select="colonne">
          <td>
            <xsl:apply-templates select="entree[ $N ]"/>
            <xsl:text> </xsl:text>
          </td>
        </xsl:for-each>

Il se lit comme suit: pour chaque colonne, on crée une cellule (<td>) contenant l'entrée, s'il y a une entrée N dans cette colonne. Comme dans de nombreux langages, $x nous permet d'appeller le paramètre/variable N. De son coté, le text vide nous permet de remplir la cellule même s'il n'y a pas d'entrée (ce qui rajoute un espace à la fin de toutes les entrées pleines, mais c'est sans gravité).

Arrive l'astuce qui nous permet de parcourir l'ensemble du fichier XML: le rappel récursif de compteur:

      <xsl:call-template name="compteur">
        <xsl:with-param name="N" select="$N + 1"/>
      </xsl:call-template>

Seule différence: on l'appelle en incrémentant N à chaque passage...

Lorsque tous les noeuds ont été passés en cellules, il ne reste plus qu'à terminer notre "programme" XSL:

    </xsl:if>
  </xsl:template>

 

Page 1 | 2 | 3

 
[ Xavier Borderie,JDNet
 
Accueil | Haut de page