読者です 読者をやめる 読者になる 読者になる

XSLT入門(変数編)

XSLTは基本的なことを知ってるだけだから、とりあえずまとめながら勉強していこう。いつまで続くかな。


昨日Hello, world!はやったから、次は変数かな?ということで変数。


XSLTには、xsl:variableとxsl:paramという2つの変数(のようなもの)が存在します。
これらの違いは、外部から値を設定できるかどうかと、記述できる位置です。


xsl:variableは外部から値は設定できませんが、xsl:template*1直下でなくても記述できます*2
xsl:paramは外部から値が設定できますが、xsl:template直下*3に置く必要があります。


また、この2つとも、一度しか値を設定できないという特徴があります。
XSLTではユーザー入力なんてありませんので、モナドとかそういうのを引っ張ってくる必要もありません。


xsl:variableに値を設定するには、2通りの方法があります。
一つは、select属性を使用して、

<xsl:variable name="var" select="42"/>

とする方法です。もう一つは、xsl:variable要素の子要素として

<xsl:variable name="var">42</xsl:variable>

とする方法です。
これらは一見同じように見えますが、後者は値ではなく、仮想的なルートノードにぶら下がった42という木構造となります。
なんかややこしいのでほとんどの場合でselectを使用すると思っておけばいいです。
最初のうちはselectの方しか使いません。


xsl:paramはxsl:variableの方法に加え、外部からxsl:with-paramで値を渡すことが出来ます。

<xsl:template name="hoge">
  <xsl:param name="param"/>
</xsl:template>

<xsl:template match="/">
  <xsl:call-template name="hoge">
    <xsl:with-param name="param" select="0"/>
  </xsl:call-template>
</xsl:template>

このように記述すると、hoge関数のparamという引数に0を渡したことになります。


値を設定した変数の内容を取得するためには、selectの属性値の中などで変数名の先頭に$を付けます。
例えば、

<xsl:variable name="var1" select="7"/>
<xsl:variable name="var2" select="$var1 + 3"/>

とすると、var2に10が設定されます。


XSLTではxsl:から始まる要素以外はそのまま出力されますが、XSLTの変数は

<xsl:variable name="var" select="10"/>
$var

としても出力されません。
これを出力するためには、xsl:value-ofなどを使います。

<xsl:variable name="var" select="10"/>
<xsl:value-of select="$var"/>

これで画面には10と表示されます。


これで変数については一通りカバーできたかと思います。

*1:C++のtemplate同様、XSLTではxsl:templateを関数と見立ててプログラムを記述する奇特な言語

*2:xsl:variableとxsl:paramはxsl:template以外に、xsl:stylesheetの下にも置けるが、ここでは無視

*3:ソース上で直下。本当に直下