variable(変数定義)

JSTL Xタグと、XSLT変換の比較4回目は、変数定義です。
といっても、普通に変数を定義するだけなら、わざわざこのサイトに掲載しません。
今回は、条件によって、ある変数の値を true か false かのどちらかに設定するという内容です。

結論

JSTL:Xタグは簡単。というより、何ら問題もなく、説明するほどではありません。
実は、XSLTでは、ちょっとした技巧を凝らさないと、この手法は難しいのです。

ソースのダウンロード

JSP-XML-2007-10-15.zipをダウンロードしてください。
いつものように、Maven2 でビルドして、Tomcatにデプロイして、http://localhost:8080/JSP-XML/を開きます。
トップページのドロップダウンリストに追加されている「variable(変数定義)」を選んで、「JSTL Xタグで変換」または
「XSLT で変換」のボタンを押してください。

結果は、JSTL Xタグでも、XSLTでも、下図のように表示されます。

JSTL:Xタグのポイント

ポイントになるソースは、/jsp/jstl/variable.jspです。
基本的に、以前に紹介した /jsp/jstl/sort.jsp と同じです。
変更点は、各itemにおいて unitの値( 1パックに入っている個数 ) が 1個か 2個以上かを true/falseで
表示する列を追加しています。

以下に、ポイントになる箇所だけ切り出しますが、基本的には、isMulti という変数を false で
初期化して、もしも unitの値が2以上( 1パックに複数入り )であれば、isMultiを true に
設定し直した後、isMultiを表示します

何てことないですね。

XSLのポイント

次に、XSLTでの記述です。
最初に、間違った例を説明します。
JSTL:X と同様、変数 isMulti を false に初期化してから、条件に応じてtrueにする(つもりの)
XSLTコードを記述します。

上記のコードは、どこが間違っているのでしょうか?
実は、xsl:if の外で最初に false() に設定した isMulti変数と、xsl:if の中で true()を設定した
isMulti変数は別物なのです。変数のスコープ的に言うと、xsl:if の中で xsl:variableした isMulti変数は
xsl:if の中でしか参照できないのです。
ということで、<xsl:value-of select="isMulti"/> は、いつも、false() しか表示されません。

では、isMulti変数はどのように定義すればよいのでしょうか。
ヒントは、<xsl:variable name="isMulti" select="値"/>ではなく、
<xsl:variable name="isMulti">値</xsl:variable>という記述を利用します。

では、正解の XSLTを、/jsp/xslt/xsl/variable.xsl からポイントだけ抽出します。

分かりますか? 上記の xsl:variable 宣言は、
unit が 1以下の時には、<xsl:variable name="isMulti">false</xsl:variable>
と解釈され、 unit が 2以上の時には、<xsl:variable name="isMulti">true</xsl:variable>
と解釈されます。

ちなみに、最終的に<xsl:variable name="isMulti">値</xsl:variable>という形になるのであれば、
xsl:variableの中に、xsl:call-templateを記述することもできます。
java風に書くと、String isMulti = judgeMulti( unit ); みたいな感じです。下に記述例を載せておきます。

まとめ

XSLT変換時に、変数の値を条件に応じて設定する手法を紹介しました。
ポイントは、JSTL:X タグは名前で変数を区別するのですが、XSLTは変数の宣言位置(スコープ)が
非常に厳しく評価され、同じ名称の変数でも、上書きはできません。
そのため、変数宣言時に、適切な値を設定できるように工夫する必要がありました。