XSLT拡張関数( dyn )

今週は、XSLTの拡張関数の dyn( dynamic ) の紹介です。
基本的には、第一引数で指定したノード集合に対して、第二引数で指定したXPathを評価する
という機能を提供します。

min, max, sum

早速使い方を見てみましょう。

変換元のXMLは下記とします。

XSLT変換は、下記のように、itemPrice + techPrice の
min(最小値), max(最大値), sum(合計値)を表示します。

出力結果は、以下のようになります。

ところで、min, max, sumは、EXLSTのmath:min, math:max, math:sum がありましたね。
dyn:min, dyn:max, dyn:sum との違いはなんでしょうか。

答えは、math関数は、ノードの値そのまま、つまり itemPriceの値とか、techPriceの値を
数値処理することはできるのですが、「itemPrice + techPrice」などの演算結果を
数値処理することができなかったのです。
どちらかというと、dyn関数は、math:min, math:max, math:sumの不足部分を補うような
役割で開発されたような気がします。

注意事項

dyn関数を使うときは、公式HPのAPIの最初の引数を無視して使います。
例えば dyn:minは static double min(ExpressionContext myContext, NodeList nl, java.lang.String expr) ですが
実際に XSLTで使うときには dyn:min( /data/menu, 'itemPrice + techPrice' )のように、使います。

  1. NodeList nl : /data/menu
  2. java.lang.String : 'itemPrice + techPrice'

まとめ

管理人も、dyn拡張関数の効果的な使い方が、いまひとつピンとこないので、上手い記事に
ならなくて申し訳ないのですが、皆さんで、何か効果的な使い方を検討してみてください。

ちなみに dyn関数には他に dyn:closure, dyn:evaluate, dyn:map があります。
この3つの効果的な使い道は、さっぱり分かりません.....