XSLT2.0で便利になった機能(14) 新しくなったstring関係関数のまとめ

XSLT2.0では多くのstring関係の関数が追加されています.新しくなった関数についてまとめてみました.(本来XPath2.0の関数というべきなのかもしれませんが、そこはご容赦を!)
 
■ codepoints-to-string(),string-to-codepoint()
「XSLT2.0で便利になった機能(12) 文字と文字コードの相互変換 」で触れました.xs:integerとxs:stringの相互変換が出来てとても有用です.ただXPathでは、16進整数値が書けません.このためxs:integerはすべて10進値で書かねばなりません.ここがちょっと残念ですね.
 
■ compare()
「XSLT2.0で便利になった機能(11) 文字列比較 」で触れました.xs:stringの比較がcollationを指定して出来ます.collationが指定できるところがミソです.collationが不要ならば、eq,gt,ltで十分でしょう.
 
■ contains()
XSLT1.0からありますが、第3パラメータにオプションとしてcollationが追加されています.
 
■ lower-case(), upper-case()
大文字と小文字の変換関数です.これもXSLT1.0にはありませんでした.便利になりました.XSLT1.0ではたぶん皆さんtranslate()を使ってやっていたと思います.
 
translate($a,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')
 
ただし、Michael Kayも言っているように、この関数にはパラメータが一つしかありません.言語は指定できないのです.例えば、トルコ語では"I"の小文字は"i"でなく、上のドットのない「アイ」です.こういう場合の変換にはtranslate()を使うしかないのでしょうか?
 
■ starts-with(),ends-with()
starts-with()は1.0にはありましたが、ends-with()は新登場です.
<xsl:if test="ends-with(lower-case($href),'.pdf')">
など、ends-with()の方が使う機会が多いかもしれません.1.0のときはsubstringを使って判定せねばなりませんでしたので、便利になりました.また、両者ともオプションパラメータとしてcollationが指定できるようになっています.
 
■ string()
XSLT1.0からありますが、様々な入力をxs:stringにして返してくれます.入力のシーケンスが複数のノードを持つとき、XSLT1.0とスタイルシートを記述すれば、その最初のノードを文字列に変換してくれます.しかし、XSLT2.0とスタイルシートを記述した場合は実行時にエラーとなります.ここが要注意です.
 
■ substring-before(), substring-after()
XSLT1.0からありますが、collationがオプションパラメータとして追加されています.
 
■ matches()
文字列のマッチングです.matches(input,regx)のように使い、xs:booleanを返してくれます.regxで正規表現が使えるところが最大の売りです.(あたりまえか.正規表現ができなかったらこんな関数なかったでしょう.)
starts-with(),ends-with()も、collationがなければ、matches()で"^"か"$"を使って一発で代用できますね.
 
■ replace()
これも便利です.replace(input,regx,replacement)のように書いて、input中のregxをreplacementで置換してxs:stringを返してくれます.第2パラメータに正規表現が使え強力です.ただしreplacementの中に不用意にU+005C BACK SLASHがあると痛い目を見ます.例えばWindowsのパスの区切り文字はダメです.正規表現を使わない例ですが「XSLT2.0で便利になった機能(6) 」で触れました.
 
■ string-join()
string-joinは、第1パラメータのxs:string*を第2パラメータのxs:stringをセパレータとして連結したxs:stringとして返します.
ですから、string-join(('A','B','C'),'/') は"A/B/C"を返します.しかし、私にはこの関数は、テキストモードテンプレートの結果から、text()の連結結果をxs:stringとして取り出すために生まれたように思えます.(思い込みすぎか?)以前「閑話休題:titleのテンプレート 」で紹介しましたが
 
<xsl:template match="*" mode="TEXT_ONLY">
  <xsl:apply-templates mode="TEXT_ONLY"/>
</xsl:template>
 
<xsl:variable name="titleText" as="xs:string">
  <xsl:variable name="tempTitleText" as="xs:string*">
    <xsl:apply-templates select="title" mode="TEXT_ONLY"/>
  </xsl:variable>
  <xsl:sequence select="string-join($tempTitleText,'')"/>
</xsl:variable>
 
というような使い方です.
 
■ tokenize()
tokenize()は、tokenize(input,regx)のように書いてregxで指定された正規表現によってinputを分割し結果をxs:string*として返してくれます.空白などで区切られたパラメータ文字列を処理するのに活躍するでしょう.以前「XSLT2.0で便利になった機能(5) 」で例を紹介しました.
 
■ normalize-unicode()
これも「XSLT2.0で便利になった機能(13) Unicodeの正規化」で紹介しました.