XSLTにも変数がありますが、 値が決まったら後から書き換えることができないという特徴があります。 カウンタのような目的では使えません。
通常の変数は xsl:variable 要素で宣言します。
<xsl:variable name="color" select="'blue'"/>
name属性で変数名、select属性で値を指定します。 この場合、blue という文字列を指定しています。 値を取り出すときには、$color などと変数名の先頭に$をつけます。
外部から値が与えられる変数は、xsl:param 要素で宣言します。
<xsl:param name="color" select="'blue'"/>
ここでも select属性で値を指定していますが、 これは外部から値が与えられなかった場合のみに有効なデフォルト値となります。
文字列、数値、真偽値のほか、要素やツリーなどを持つことができます。
なお、値として文字列を持つ変数を、 要素のつもりで次のように使うことはできません。
<xsl:variable name="key" select="'color'"/> <xsl:variable name="value" select="'blue'"/> <!-- 以下の$keyは意図通り動作しない --> <xsl:apply-templates select="car[$key=$value]"/>
次のように書く必要があります。
<xsl:variable name="key" select="'color'"/>
<xsl:variable name="value" select="'blue'"/>
<xsl:choose>
<xsl:when test="$key='color'"/>
<xsl:apply-templates select="car[color=$value]"/>
</xsl:when>
...
</xsl:choose>
variable要素で宣言した変数の有効範囲は、 そのvariable要素を子要素として持つ親要素の子孫要素となります。 言い換えると、variable要素と同じ階層の要素(弟要素)およびその子孫要素からの参照が可能です。
stylesheet要素の子要素として宣言するとグローバル変数となり、 どこからでも参照できます。
template要素の先頭で宣言したxsl:paramには、 そのtemplateを適用する側から値を渡すことができます。 apply-templates要素の子要素として with-param要素を用意し、 名前と値を設定します。
<xsl:apply-templates select="car">
<xsl:with-param name="color" select="$value"/>
</xsl:apply-templates>
<xsl:template match="car">
<xsl:param name="color"/>
...
</xsl:template>