Variables et paramètres
Les variables
Il est possible, en XSLT, de définir des variables, mais elles sont « immutables » (« dont la valeur ne peut être modifiée »). On peut se demander, à juste titre, si les mots variables et immutables vont bien ensemble, mais c'est ainsi que les inventeurs du XSLT se sont exprimés. Pour définir une variable nommée « test », on utilise l'élément « <xsl:variable name="test" select="xxx" /> ». La variable contiendra alors le résultat de l'expression XPath contenue dans l'attribut « select ». On fait référence à la variable dans d'autres expressions XPath en utilisant le symbole « $ ». Ainsi, si la variable se nomme test, l'expression $test aura comme valeur la valeur de la variable. L'exemple suivant peut être utilisé pour remplacer tous les éléments « produit » par le noeud de texte « bozo ».
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:variable name="test" select="'bozo'" /> <xsl:template match="produit"> <xsl:value-of select="$test" /> </xsl:template> </xsl:stylesheet>
On peut aussi définir la valeur de la variable en omettant l'attribut « select » et en ajoutant du contenu à l'élément « xsl:variable ». Dans l'exemple suivant, on propose de remplacer tous les éléments «produit» par le contenu de la variable (qui est ici « <produit>x</produit> »):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:variable name="test" > <produit>x</produit> </xsl:variable> <xsl:template match="produit"> <xsl:copy-of select="$test" /> </xsl:template> </xsl:stylesheet>
On peut déclarer la variable localement au sein d'un élément template. Pouvez-vous trouver ce que fait la transformation suivante?
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:variable name="test" > <produit>x</produit> </xsl:variable> <xsl:copy-of select="$test" /> </xsl:template> </xsl:stylesheet>
Les paramètres
Un fichier XSLT peut être utilisé comme un programme dans la mesure où on peut lui passer des paramètres. Rappelons qu'on appelle un fichier XSLT « xslt.xml » à partir d'un fichier XML qu'on veut transformer de cette manière :
<?xml version="1.0" encoding="ISO-8859-1" ?> <?xml-stylesheet href="xslt.xml" type="application/xml"?> <facture> <montant>10.10</montant> <personne>Jean Rochond</personne> <raison>Achat d'ordinateur</raison> </facture>
On peut enrichir cet appel avec les instructions « xslt-param » comme dans cet exemple.
<?xml version="1.0" encoding="ISO-8859-1" ?> <?xslt-param name="couleur" value="blue"?> <?xslt-param name="taille" value="2"?> <?xml-stylesheet href="xslt.xml" type="application/xml"?> <facture> <montant>10.10</montant> <personne>Jean Rochond</personne> <raison>Achat d'ordinateur</raison> </facture>
Selon votre processeur XSLT, il peut y avoir d'autres façons de passer des paramètres à une feuille de style XSLT.
On reçoit alors les paramètres avec un élément « xsl:param ». L'attribut « select » est utilisé pour spécifier une valeur par défaut.
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="couleur" select="red" /> <xsl:param name="taille" select="1" /> <xsl:template match="facture"> <html> <head> <title>Facture de <xsl:value-of select="personne" /></title> </head> <body> <p style="color:{$couleur}; font-size:{$taille}em">Ceci est une facture pour <xsl:value-of select="personne" /> de <xsl:value-of select="montant" />$ pour: <xsl:value-of select="raison" />.</p> </body> </html> </xsl:template> </xsl:stylesheet>
On peut aussi passer des paramètres aux éléments « xsl:template » avec les éléments « xsl:call-template » comme dans cet exemple qui est une façon équivalente, mais plus compliquée, de formater notre document XML de type « facture » .
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="facture"> <xsl:call-template name="monmotif"> <xsl:with-param name="contenu" select="."/> </xsl:call-template> </xsl:template> <xsl:template name="monmotif"> <xsl:param name="contenu" /> <html> <head> <title>Facture de <xsl:value-of select="$contenu/personne" /></title> </head> <body> <p>Ceci est une facture pour <xsl:value-of select="$contenu/personne" /> de <xsl:value-of select="$contenu/montant" />$ pour: <xsl:value-of select="$contenu/raison" />.</p> </body> </html> </xsl:template> </xsl:stylesheet>
On peut aussi charger des documents distants avec la fonction XSLT « document » , cette instruction donne une copie du document situé à l'adresse @href : <xsl:copy-of select="document(@href)"/>. (L'élément « xsl:copy-of » sert ici à faire une copies des nœuds contenus dans le document distant.) Elle est cependant sujette à des contraintes de sécurité lorsqu'on l'utilise dans un navigateur : il n'est pas permis de charger des documents provenant d'autres serveurs que le serveur d'origine.