Vous devez activer Javascript pour accéder à ce site
 

Semaine

RECHERCHE

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.


© Daniel Lemire, 2014. Tous droits réservés.