<xsl:variable> |
Définit une variable. Si l'élément <xsl:variable> apparaît comme élément de niveau supérieur, il s'agit d'une variable globale accessible dans toute la feuille de style. Sinon, la variable est locale et ne figure que dans l'élément contenant l'attribut <xsl:variable>. La valeur de cette variable peut être définie de l'une des deux manières suivantes : spécifiée dans l'attribut select, ou bien définie dans un modèle XSLT dans l'élément <xsl:variable> lui-même. Si aucune de ces méthodes n'est utilisée, la valeur de la variable est une chaîne vide.
Catégorie
Soit un élément de niveau supérieur, soit une instruction
Attributs obligatoires
name Un attribut qui affecte un nom à cette variable.
Attributs facultatifs
select Une expression XPath qui définit la valeur de cette variable.
Contenu
L'élément <xsl:variable> peut être vide, ou bien contenir un modèle XSLT. S'il contient un modèle XSLT, la valeur de l'attribut select (le cas échéant) est ignorée.
Apparaît dans
<xsl:stylesheet> comme élément de niveau supérieur ou dans un modèle.
Défini dans
XSLT section 11, Variables et paramètres.
Exemple
La feuille de style suivante définit plusieurs variables :
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      <xsl:output method="text"/>

      <xsl:variable name="newline">
    <xsl:text>
    </xsl:text>
      </xsl:variable>

      <xsl:variable name="favoriteNumber" select="23"/>
      <xsl:variable name="favoriteColor" select="'blue'"/>
      <xsl:variable name="complicatedVariable">
        <xsl:choose>
          <xsl:when test="count(//listitem) > 10">
            <xsl:text>really long list</xsl:text>
          </xsl:when>
          <xsl:when test="count(//listitem) > 5">
            <xsl:text>moderately long list</xsl:text>
          </xsl:when>
          <xsl:otherwise>
            <xsl:text>fairly short list</xsl:text>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:variable>

      <xsl:template match="/">
        <xsl:text>Hello!  Your favorite number is </xsl:text>
        <xsl:value-of select="$favoriteNumber"/>
        <xsl:text>.</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:text>Your favorite color is </xsl:text>
        <xsl:value-of select="$favoriteColor"/>
        <xsl:text>.</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:value-of select="$newline"/>
        <xsl:text>Here is a </xsl:text>
        <xsl:value-of select="$complicatedVariable"/>
        <xsl:text>:</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:variable name="listitems" select="list/listitem"/>
        <xsl:call-template name="processListitems">
          <xsl:with-param name="items" select="$listitems"/>
        </xsl:call-template>
      </xsl:template>

      <xsl:template name="processListitems">
        <xsl:param name="items"/>
        <xsl:variable name="favoriteColor">
          <xsl:text>chartreuse</xsl:text>
        </xsl:variable>

        <xsl:text>    (Your favorite color is now </xsl:text>
        <xsl:value-of select="$favoriteColor"/>
        <xsl:text>.)</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:for-each select="$items">
          <xsl:value-of select="position()"/>
          <xsl:text>.  </xsl:text>
          <xsl:value-of select="."/>
          <xsl:value-of select="$newline"/>
        </xsl:for-each>
      </xsl:template>

    </xsl:stylesheet>
La feuille de style est utilisée pour transformer le document suivant :
    <?xml version="1.0"?>
    <list xml:lang="en">
      <title>Albums I've bought recently:</title>
      <listitem>The Sacred Art of Dub</listitem>
      <listitem>Only the Poor Man Feel It</listitem>
      <listitem>Excitable Boy</listitem>
      <listitem xml:lang="sw">Aki Special</listitem>
      <listitem xml:lang="en-gb">Combat Rock</listitem>
      <listitem xml:lang="zu">Talking Timbuktu</listitem>
      <listitem xml:lang="jz">The Birth of the Cool</listitem>
    </list>
Les résultats de la transformation sont les suivants :
    Hello!  Your favorite number is 23.
    Your favorite color is blue.

    Here is a moderately long list:
        (Your favorite color is now chartreuse.)
    1.  The Sacred Art of Dub
    2.  Only the Poor Man Feel It
    3.  Excitable Boy
    4.  Aki Special
    5.  Combat Rock
    6.  Talking Timbuktu
    7.  The Birth of the Cool
Il est judicieux d'examiner certains points de la feuille de style. Tout d'abord, lorsque les valeurs des deux premières variables (favoriteNumber et favoriteColor) ont été définies, il a fallu invoquer la chaîne "blue", mais pas 23. Si blue n'avait pas été invoqué, le processeur XSLT aurait considéré qu'il était question de tous les éléments <blue> du contexte actuel. Il n'a pas été nécessaire d'invoquer 23 car les noms des éléments XML ne peuvent pas commencer par un nombre. Toujours invoquer des éléments littéraux est une bonne méthode, même ceux qui ne peuvent correspondre à des noms d'élément ; les chances que vous appliquiez ce traitement sont minimes à un moment donné. A noter également, la présence de deux variables nommées favoriteColor. L'une est une variable globale car son parent est l'élément <xsl:stylesheet> ; l'autre est une variable locale car elle est définie dans un élément <xsl:template>. Accéder à l'élément favoriteColor du modèle match="/" renvoie une certaine valeur ; y accéder dans le modèle name="processListitems" en renvoie une autre. Avoir deux variables possédant le même nom au même niveau est une erreur. De même que d'affecter le même nom à un attribut <xsl:variable> et un attribut <xsl:param> sur le même niveau. Utiliser un élément <xsl:choose> pour initialiser un élément <xsl:variable> est une technique répandue. Elle est équivalente à l'élément de programmation procédurale suivant :
    String complicatedVariable;
    if (count(listitems) > 10)
      complicatedVariable = "really long list";
    else if (count(listitems)) > 5)
      complicatedVariable = "moderately long list";
    else
      complicatedVariable = "fairly short list";
Dernier point à noter, une variable peut être d'un type quelconque de variable XPath ou XSLT, y compris un ensemble de nœuds. Lorsque le modèle processListitems est appelé, le paramètre qui lui est transmis est une variable contenant l'ensemble de nœuds de tous les éléments <listitem> du document. Dans le modèle processListitems, la variable (un paramètre du point de vue technique) peut être utilisée dans un élément <xsl:for-each>.