functon(関数呼び出し)

JSTL Xタグと、XSLT変換の比較4回目は、関数呼び出しです。
前々回の for文 で HTML の table を作る処理の中で、1行を表示するコードを for文の中から、
関数として、独立させてみました。

結論

どちらでもO.K.
ただし、JSTL:Xタグの場合は、関数1つ毎に、独立した JSPソース 1本が必要なので、
ソース管理の観点から見ると、少し煩雑になるかもしれません。

ソースのダウンロード

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

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

JSTL:Xタグのポイント

ポイントになるソースは、/jsp/jstl/function.jspです。
基本的に、以前に紹介した /jsp/jstl/sort.jsp と同じですが、<x:forEach>の中が変更されています。
実際に、<tr>から</tr>までの1行を書き込む箇所が、他のソースファイル( function_1.jsp )に
記述されているので、そのソースを include しています。

では、includeされている function_1.jspの全文を下記に掲載します。

どうですか。元々の sort.jsp に記述していた内容をそのまま切り出しただけです。
キーポイントとしては、jspのinclude文を使うと、include先にも <x:forEach var="○○" .. >で
定義した変数( var="○○" )の値を引き継ぐことができるということです。
他にも、c:set や x:set の変数も同じように渡すことができるので、これを引数として利用できます。

XSLのポイント

次に、XSLTでの記述です。ポイントになるソースは、/jsp/xslt/xsl/function.xslです。
前回の for文の for.xsl を理解しているという前提のもとに、ポイントのみを示します。

こちらも、xsl:for-each の中身が、<xsl:call-template name="showTR"> で始まる3行に置き換わりました。
このコードの意味は、showTR という名称の template を呼び出すという意味になります。

呼び出される showTR という template は、 ソースの後半で、<<xsl:template name="showTR">として
定義されています。また、このtemplateは、最初に <xsl:param name="thisItem"/>として、変数を1つ
受け取ることが宣言されています。

ふたたび、<xsl:call-template name="showTR"> を見ると、<xsl:with-param name="thisItem" select="."/>
という風に、thisItemという変数名で引数を渡しています。その値は、select"." ということで、
xsl:for-eachの中の、カレントノード、つまり 個々の /fruits/item となります。

  1. 応用知識 : xsl:apply-templates
  2. XSLT変換では、今回の例のように、xsl:for-each と xsl:call-template を併用する記述を、
    一発で記述するapply-templates という書式があります。
    今回の例を、apply-templates を使って記述すると、以下のようになります。

    xsl:apply-tempates は、select="/fruits/item" に該当する箇所について for文を実行し、
    カレントノード移動を行って、>xsl:template match="/fruits/item"<に遷移します。
    selectの指定にXPath的に一致する、match を持つ template が実行されるので、特に問題が
    なければ、絶対パスで match を定義する方が、安全です。

まとめ

JSTL:Xタグについては、「これを関数と呼ぶのか?」という疑問もありますが、長くなりすぎたソースコードを
分割することによって見通しが良くなり、バグの混入が防げるという効果は期待できると思います。