XSLT拡張関数

今週は、XSLTの拡張関数をご紹介します。サンプルプログラムはありません。
XSLTでは、普通は xsl:concat のように、xsl:で始める関数を使いますが、やや貧弱だと思いませんか。

そこで、もう少し便利な関数をご紹介します。
ただし、そのために新しい jar を組み込んだりするのではなく、Javaの標準XSLTエンジンである
Xalan 自身が持っている拡張関数を使ってみます。
公式プロジェクトサイト → http://xml.apache.org/xalan-j/extensionslib.html

拡張関数の例

拡張関数もいくつかの分類があります。公式サイトから紹介すると

  • EXSLT math function : sin, cos, min, max などの数学関数
  • EXSLT set functions : difference( 差集合 ), intersection(積集合)など
  • EXSLT date and time functions:日付に関する関数群
  • EXSLT dynamic functions : XPathを動的に変更して適用する
  • EXSLT string functions :文字列操作( トークン分割など )

使い方

XSLTの最初に 使いたい functionに応じた、ネームスペース宣言をします。

  • EXSLT math function : xmlns:math="http://exslt.org/math"
  • EXSLT set functions : xmlns:set="http://exslt.org/sets"
  • EXSLT date and time functions: xmlns:datetime="http://exslt.org/dates-and-times"
  • EXSLT dynamic functions : xmlns:dyn="http://exslt.org/dynamic"
  • EXSLT string functions : xmlns:str="http://exslt.org/strings

str:関数 の使い方の例

まずは使ってみましょう。使い方が1つ分かると、あとは公式サイトのAPI集をみながら、
各自で使い方を調べることができると思います。

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

XSL変換は、最初のxsl:stylesheetのところに、xmlns:str="http://exslt.org/strings"を
追加しています。
そして、str:tokenize(/data/text, ',') の結果を tokensという変数に格納して、表示します。

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

公式サイトの EXSLT string functions のリンクをたどると JavaDocが表示されます。
APIは、NodeList tokenize(java.lang.String toTokenize, java.lang.String delims)となっており、
戻り値が NodeList( node集合 )で、引数1が変換元のString, 引数2がデリミタ(区切り文字)です。
JavaのStringTokenizer互換といった感じの実装ですね。

ちなみに str:tokenize(/data/text, ',') の戻り値は、node集合なので、以下のように
直接 xsl:for-each に渡してもかまいません。

まとめ

標準のXSLT関数( xsl:○○ )の貧弱さをカバーする拡張関数について説明しました。
結構便利なので、これから少しずつ使い方を紹介していきます。