XSLT拡張関数( str )

今週は、XSLTの拡張関数の str( string ) の紹介です。
本サイトの EXSLTの最初の紹介記事で、str:tokenize を紹介しましたので、
今回は、str:tokenize と str:split の違いについて、例題を紹介します。

tokenizeとsplitの違い( 1/2 )

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

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

XSLT変換は、下記のように、「,」で文字列を区切って、1行ずつ表示しています。

出力結果は、以下のようになります。
tokenize と split は良く似ていますが、区切り方が、以下の点で少し違います。
そのために、「,,」の空白文字を列挙する/しない の違いが発生します。

  1. tokenizeは、区切り文字を全て取り除いて、残ったものを列挙する
  2. splitは、区切り文字と区切り文字で挟まれた文字列を列挙する

tokenizeとsplitの違い( 2/2 )

もう一つ、違いを紹介します。

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

XSLT変換は、下記のように、「xy」を区切り文字に指定します。

出力結果は、以下のようになります。
tokenize と split 違いの2点目は、区切り文字を 1文字単位で使うか、
文字列で使うかの差です。

  1. tokenizeは、区切り文字を 1文字ずつばらばらに使うので、「x」と「y」で区切ります
  2. splitは、区切り文字を、文字列として使うので、「xy」で区切ります。

参考( align )

str拡張関数から、もう一つ関数を紹介します。
数字の先頭に 0を補完して、文字数を3桁とかに統一する表示をする際に、
標準のXSLT関数では、などで記述できます。

今から紹介する、XSLT拡張関数の align関数も、0埋めが1行で記述できます。
違いは、xsl:number が valueの値が数値でないといけないのに対して、str:align関数は
数値以外の普通の文字列でも O.K. という点です。

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

XSLT変換は、下記のように、数字が3ケタになるように、0埋めをします。
str:alignは、第一引数が表示する文字列、第二引数が補完する文字列、第三引数は
第一引数を右詰め( right )にするか、左詰め( left )にするかのスイッチです。

出力結果は、以下のようになります。
期待通り、3ケタ未満の文字には、先頭に0が埋まりました。

まとめ

XSLT拡張関数の str を紹介しました。
tokenizeやsplitは、標準のXSLT変換では、string-befor()などで、再帰ループを組んで
実装する必要がありましたが、ESLTではたったの1行で実装できるので、非常に楽になりました。