<xsl:variable> |
Diese Anweisung definiert eine Variable. Ist <xsl:variable> das oberste Element der Elementstruktur, so handelt es sich um eine globale Variable, die im gesamten Stylesheet verfügbar ist. Andernfalls ist die Variable lokal und existiert nur in dem Element, in dem <xsl:variable> vorkommt. Es gibt zwei Methoden, um den Wert der Variable zu definieren: Sie kann im Attribut select angegeben oder über eine XSLT-Vorlage im Element <xsl:variable> definiert werden. Wenn keine dieser Methoden verwendet wird, ist der wert der Variablen ein leerer String.
Kategorie
Entweder ein Element der obersten Ebene oder eine Anweisung
Obligatorische Attribute
name Ein Attribut, das den Namen für diese Variable angibt.
Optionale Attribute
select Ein XPath-Ausdruck, der den Wert dieser Variablen definiert.
Inhalt
Das Element <xsl:variable> kann leer sein oder eine XSLT-Vorlage enthalten. Enthält es eine XSLT-Vorlage, wird der Wert des Attributs select ignoriert.
Übergeordnetes Element
<xsl:stylesheet> als oberstes Element oder in einer Vorlage.
Definition
XSLT-Abschnitt 11, Variablen und Parameter
Beispiel
Es folgt ein Stylesheet, das eine Reihe von Variablen definiert:
    <?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>
Zur Umwandlung des nachfolgenden Dokuments wird das Beispiel-Stylesheet verwendet:
    <?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>
Hier die Ergebnisse der Transformation:
    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
Es gibt mehrere Punkte im Stylesheet, die erwähnenswert sind. Beachten Sie zunächst, dass beim Definieren der Werte für die ersten beiden Variablen (favoriteNumber und favoriteColor), der String "blue" zwar genannt werden musste, die Nummer 23 aber nicht. Wird blue nicht ausdrücklich genannt, geht der XSLT-Prozessor davon aus, dass alle <blue>-Elemente im aktuellen Kontext gemeint sind. 23 muss nicht genannt werden, da XML-Elementnamen nicht mit einer Zahl beginnen dürfen. Es empfiehlt sich, Literale immer zu nennen, auch diejenigen, die sich als Elementnamen nicht eignen, denn es besteht eine gute Chance, dass Sie diesen Vorgang irgenwann vergessen. Beachten Sie auch, dass zwei Variablen mit dem Namen favoriteColor existieren. Die eine ist eine globale Variable, da <xsl:stylesheet> das übergeordnete Element ist, die andere ist eine lokale Variable, da sie im Element <xsl:template> definiert worden ist. Wenn in der Vorlage match="/" auf favoriteColor zugegriffen wird, hat die Variable einen anderen Wert als wenn innerhalb von name="processListitems" auf sie zugegriffen wird. Es ist unzulässig, auf einer Ebene zwei Variablen mit demselben Namen zu verwenden. Es ist ebenfalls unzulässig, auf einer Ebene ein <xsl:variable>- und ein <xsl:param>-Element mit demselben Namen zu definieren. Es ist eine übliche Methode, eine <xsl:variable> mit Hilfe eines <xsl:choose>-Elements zu initialisieren. Dieses Verfahren entspricht dem folgenden prozeduralalen Programmkonstrukt:
    String complicatedVariable;
    if (count(listitems) > 10)
      complicatedVariable = "really long list";
    else if (count(listitems)) > 5)
      complicatedVariable = "moderately long list";
    else
      complicatedVariable = "fairly short list";
Zuletzt sei erwähnt, dass eine Variable jeden der XPath- oder XSLT-Variablentypen besitzen kann, einschließlich einer Knotenmenge. Wird die Vorlage processListitems aufgerufen, so wird als Parameter an diese Vorlage eine Variable mit der Knotenmenge aller <listitem>-Elemente im Dokument übergeben. Innerhalb der Vorlage processListitems kann die Variable (die technisch gesehen nun ein Parameter ist) innerhalb eines <xsl:for-each>-Elements verwendet werden.