for文

JSTL Xタグと、XSLT変換の比較1回目は、for文、つまり繰り返し処理です。
先に結論から書きます。

結論

機能的には差異はない。どちらでもお好みの方をお使い下さい。

ソースのダウンロード

JSP-XML-2007-09-17.zipをダウンロードしてください。
いつものように、Maven2 でビルドして、Tomcatにデプロイして、http://localhost:8080/JSP-XML/を開きます。

上の図の赤丸で囲ったドロップダウンリストから「for文」を選んでください。
ブラウザに表示されている XML文面と、ボタンの飛び先が for文用に変更されます。
その後、「JSTL:Xタグで変換」または「XSLTで変換」のボタンを押すと、ボタンの右に記述している
jspファイルに移動します。

JSTL:Xタグのポイント

ポイントになるソースは、当然ながら/jsp/jstl/for.jspです。
以下に、その抜粋を示します。

キーポイントは、<x:forEach var="data" select="$domXML/fruits/item">ですね。
ここ以降、</x:forEach>までの間で、dataというdom変数に、$domXML/fruits/itemの
XML部分木が格納され、$dataで参照できるようになります。
$domXML/fruits/itemは、4つありますので、合計4回ループすることになります。
なお、1回目のループでは、$dataは、以下のXMLを指しています。

XSLのポイント

次に、XSLTでの記述です。ポイントになるソースは、/jsp/xslt/xsl/for.xslです。
以下に、その抜粋を示します。

こちらもキーポイントは、<xsl:for-each select="/fruits/item">です。
JSTLと違って、$domXML/fruits/item ではなく、/fruits/item になっているので、注意してください。
ここ以降、</xsl:for-each>までの間、相対パスでXMLを表現すると、 for文の対象となっている
/fruits/item 以下を示すことになります。

つまり、ループの1回目では、相対パスで name というXMLを指すと、
以下のXMLの <name>りんご</name>を対象にしていることになります。

<xsl:for-each>における、相対パスの位置移動は、XSLT変換を理解するうえで、非常に重要な
ポイントになります。ここを理解していないと、XSLT変換は非常に難しく感じます。逆に理解していると、
JSTLに比べて、記述するコード量が、少なくてすっきりかけるので、便利に感じると思います。

なお、たとえ<xsl:for-each>内でも、絶対パスで書けば、相対パスの位置移動の影響は受けません。
強引な例ですが、<xsl:value-of select="/fruits/item[1]/name"/> と記述すれば、<xsl:for-each>内でも
常に値は「りんご」になります。( 注 XSLTでは配列の添え字は 0ではなく、1が先頭です )

まとめ

for文による繰り返し処理は、JSTL:Xタグも、XSLTも機能的には特に違いはありません。
記述方法は、多少 JSTL:Xタグに、方言のなまりというか、ちょっと違和感はありますが、
これは、そういうものらしいと受け入れるしかないです。

次回は、for文の応用編として、「for文(ソート表示)」を紹介します。
いちおう、JSTL:Xタグでも、XSLTでも実装しますが、片方はとっても簡単な記述で、
もう片方は「普通は無理だけど、強引に書いたら何とか書けた」という記述になります。

さて、どちらの表現が簡単になるでしょうか。