XML+XSL(6)
XSLの書き方(その4)
-動的に表示を変更-
1 タイトルをクリックして本文の表示を変更する。
左側のタイトルをクリックすると,それに応じて右側の本文の表示を変更する。
まずは,サンプルを見てみよう。左側のタイトルがリンクになっている。
クリックすると,右側の表示が変更する。
htmlは前回と同じものを使う。
hidari.xslを次のように変更する。
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="data/bunsho">
<xsl:variable name="num" select="@bango"/>
<a href="#" onclick="test({$num})">
<xsl:value-of select="title"/>
</a><br/>
</xsl:template>
<xsl:variable name="num" select="@bango"> が変数の宣言。
これは,numという名前の変数(variable)を宣言し,numに属性@bangoの値を代入している。
今回のデータでは,bangoはbunshoによって1,2となる。
そうして,numに代入された数は,onclick="test({$num})"で使われている。
このxslを実行すると,次のようなhtmlができる。
<a href="#" onclick="test(1)">XML入門1</a><br/>
<a href="#" onclick="test(2)">XML入門2</a><br/>
リンクになっていて,クリックするとtest(1)やtest(2)のfunctionが実行される。
migi.xslを次のように変更する。
<xsl:param name="jump"/>
<xsl:template match="/">
<xsl:apply-templates select="data/bunsho[@bango=$jump]/honbun"/>
</xsl:template>
<xsl:template match="honbun">
<xsl:apply-templates select="ln"/>
</xsl:template>
<xsl:template match="ln">
<xsl:value-of select="."/><br/>
</xsl:template>
<xsl:param name="jump"/>も変数の宣言だが,これは外部からの値を受け取る変数だ。
xslprocessor.js内のプログラムで,xslに値を渡す変数として"jump"を定義している。
このjumpの値を受け取る。
[@bango=$jump]の$jumpの値がhtmlから渡されて,表示する文書を選択する。
一方,htmlの xslproc('test2.xml','migi2.xsl','kiji2',jmp); のjmpの値がxslのjumpに
渡されるが,このjmpは,test(jmp)から値を渡される。
よって,onclick="test(1)"などで,表示が変更される。
注意:<xsl:param name="jump"/>は,xslの先頭(宣言部の直後)におかなければならない。
param は,テンプレートにパラメータを渡すときにも使える。
下の例では,honbunテンプレートのjumpに100を渡している。
<xsl:template match="/">
<xsl:apply-templates>
<xsl:with-param name="jump" select="100"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="honbun">
<xsl:param name="jump" select="5"/>
<xsl:value-of select="$jump"/>
</xsl:template>
[ xsl:param と xsl:variableの使い方 ]
宣言した変数を使うには,$hensu と名前の頭に$をつける。
xsl文の中では,そのまま使える。<xsl:if test="@bango=$jump">
xsl内のhtmlタグでは{}でくくる。<div id="{$jump}">
xslの変数は通常のプログラムの変数と異なり,限定した使い方しかできない。
自由に変数に値を代入することはできない。
ノードを指定するとき変数が使えると便利だが,これはできない。
xsl:apply-templates select="data/$jump"
このような場合は,属性で判断できるようにデータ構造を考える
xsl:apply-templates select="data/kiji[@idx=$jump]"