février
2008
Ce petit article permet au débutants ou occasionnels d’XML de créer dynamiquement une balise HTML à partir d’un fichier XML.
Edupassion.com fournira un éditeur de cours online spécialement concu pour les besoins d’un prof. Avec notamment une numérotation des paragraphes de type GrandX, PetitX, et Lettre.
Le but du jeu est donc de traduire la balise XML <paragraph depth="GrandX" number="II">value</paragraph > en <h2>II) value</h2> pour le XHTML, ou <paragraph depth="Lettre" number="c">value</paragraph> en <h4>c)value</h4>
XSLT a pour objectif de transformer le Modèle (fichier XML) en Vue (fichier XHTML), et il eut été logique qu’XSLT transformasse aussi les nombres des paragraphes en caractères adaptés comme "II", ou "c". Cette opération purement fonctionnelle est cependant plus simple et surtout plus propre à la relecture en utilisant Java.
Pour résoudre le problème, la première idée qui vient à l’esprit est de le traiter cas par cas :
<xsl:template match="paragraph">
<xsl:choose>
<xsl:when test="./@depth=’GrandX’ ">
<h2>
<xsl:value-of select"./@number"/>)<xsl:value-of select"."/>
</h2>
</xsl:when>
<xsl:when test="./@depth=’PetitX’ ">
<h2>
<xsl:value-of select"./@number"/>)<xsl:value-of select"."/>
</h2>
</xsl:when>
<xsl:when test="./@depth=’Lettre’ ">
<h2>
<xsl:value-of select"./@number"/>)<xsl:value-of select"."/>
</h2>
</xsl:when>
</xsl:choose>
</xsl:template>
Ca marche, mais dès que la programmation sera plus complexe (séparation entre le titre et le corps du paragraphe, ou boutons de controle), alors le corps de chaque choix se remplira, ce qui n’est pas bien beau. On pourra utiliser <xsl:apply-templates/>, mais là encore, l’imbrication multiples de ces balises n’est pas conseillée si ce code doit être lu par des collègues non expert en XSLT.
Comme la balise choisie est variable, nous allons tout logiquement utiliser une variable, et créer un element dynamiquement.
<xsl:template match="paragraph">
<xsl:variable name="baliseVar">
<xsl:choose>
<xsl:when test="./@depth=’GrandX’ ">h2</xsl:when>
<xsl:when test="./@depth=’PetitX’ ">h3</xsl:when>
<xsl:when test="./@depth=’Lettre’ ">h4</xsl:when>
<xsl:otherwise>h4</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$baliseVar}">
<xsl:value-of select="./@number"/>)
<xsl:value-of select"."/>
</xsl:element>
</xsl:template>
On ne gagne pas immédiatement en nombre de lignes, mais beaucoup en clarté, car les deux problèmes sont clairement disjoints. Attention toutefois à l’utilisation des accolades dans <xsl:element name="{$baliseVar}"> , car contrairement au PHP, "$baliseVar" ne sera pas traité par le processeur XSLT comme une variable, mais comme un texte normal.
L’utilisation des variables en XSLT est très efficace pour se sortir des sentiers tortueux d’XPATH. Mais XSLT a ses limites, et je conseille fortement de faire les opérations les plus complexes avec un langage comme Java & JDOM.