On peut récupérer des nœuds texte dans le document source au moyen de la balise <xsl:value-of select="xpath expr"/>. L'expression xpath expr est évaluée et convertie en chaîne de caractères en suivant les conversions d'XPath (voir cours 3).
La balise <xsl:for-each select="xpath expr">
corp de boucle
</xsl:for-each>
évalue le corp de la boucle pour chaque nœud renvoyé par
l'expression xpath expr. À chaque itération
le nœud considéré devient le nœud contexte (i.e. celui
renvoyé par l'axe self::)
On peut modifier l'ordre dans lequel les éléments sont
parcourus par une boucle xsl:for-each en utilisant
l'élément
]]>
qui n'est valide que comme fils d'un xsl:for-each
ou xsl:apply-templates
On peut évaluer conditionnellement une portion de code XSLT
en la plaçant dans une balise:
...
]]>
Le résultat de l'expression est interprété
comme un booléen (selon les règles de conversion d'XPath). S'il
vaut vrai, le corp du xsl:if est exécuté.
On peut écrire plusieurs portions de code, gardées par des
conditions distinctes
en les plaçant dans une balise:
Les conditions xsl:when sont évaluées dans l'ordre et
le corp de la première valant vrai est exécuté. Si aucune
condition n'est vérifiée, le corp de
l'instruction xsl:otherwise est exécuté.
On réutilise (encore) le fichier de recette:
Tiramisú
mascarpone
oeufs
sucre
café
biscuits
2h
Séparer les blancs des jaunes
…
…
]]>
Ingrédients du ]]><xsl:value-of select="descendant::title" />
Ingrédients du ]]><xsl:value-of select="descendant::title" />
]]><xsl:for-each select="descendant::ingredient">
<xsl:sort select="child::text()" /> ]]><xsl:value-of select="child::text()" />
]]></xsl:for-each>
Étape]]><xsl:if test="count(descendant::e) >1">s</xsl:if>
]]><xsl:apply-templates select="descendant::e">
<xsl:sort select="@num" data-type="number"/>
</xsl:apply-templates>
]]>
Il est fréquent de vouloir choisir dynamiquement les noms des éléments. Par exemple :
.... code complexe pour calculer le texte ....
]]>
code incorrect : les balises <b>
et <i> ne sont pas bien parenthésées
On peut dupliquer le code de manière à respecter les balises ouvrantes/fermantes :
.... code complexe pour calculer le texte ....
.... code complexe pour calculer le texte ....
]]>
Inélégant et non-maintenable : si on a 10 cas, on copie cole
10 fois le code complexe.
On a besoin :
Problème : XPath ne permet pas de définir des variables
Comme dans tout langage, on veut pouvoir évaluer une expression et donner un nom au résultat pour pouvoir le réutiliser plusieurs fois. En XSLT, on utilise la balise xsl:variable :
Le document contient éléments foo.
]]>
On peut aussi donner du contenu à l'élément xsl:variable, pour définir la valeur de la variable :
b
i
]]>
Les variables sont non-modifiables une fois définies. Elles
sont visibles par tous les éléments suivant la balise
fermante </xsl:variable> se trouvant avant la
fermeture de l'élément contenant la variable. Exemple :
texte sur
:
]]>
On peut utiliser les instructions xsl:element et xsl:attribute pour créer des éléments et des attributs dont le nom est calculé dynamiquement :
baz
...
]]>
produira dans le document de sortie :
...
]]>
À part les attributs select et test de
certaines balises XSLT, les autres attributs sont des chaines de
caractères. On peut cependant intégrer des expressions XPath au
moyen d'accolades { }
Le site!]]>
Dans le code ci-dessus, href étant un attribut non interprété (ce n'est pas une balise XSLT), le chemin XPath apparaîtra dans le résultat (ce qu'on ne veut pas). On peut écrire :
Le site!]]>
b
i
.... code complexe pour calculer le texte ....
]]>
Attention : il faut écrire {$nombalise} sinon le
processeur XSLT essayera de créer un
élément <$nombalise> ce qui est illégal (et
provoquera une erreur)
On peut placer une balise xsl:output dans la balise racine de la feuille de style (xsl:stylesheet)
]]>