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
|