- blogs:
- cles::blog

XSLT 2.0 で正規表現による置換処理を行う

XSLT 1.0 は文字列の処理が貧弱で、concat(), contains(), string-length(), substring() くらいの本当に基本的な関数しか用意されていないのでちょっとしたテキスト処理をやるだけで苦労することが多々ありましたが、XSLT 2.0 からはちゃんと正規表現が使えるようになっているようなのでちょっとためしてみました。
詳細については仕様書の 15 Regular Expressions にまとまっています*1。
これによると <xsl:analyze-string> を使うと正規表現で文字列を変換することができるみたいです。仕様を読む限りは他の言語の gsub() のような感じでしょうか。
後方参照については15.2 Captured Substrings に記載されていますが、regex-group() という関数を呼び出すことによって可能になるようです。
† さっそく動かしてみる
前回の日付の処理と同じく、Saxson を使います。
テストに使った XML は下記のような簡単なもの。
test.xml
これを下記の XSL で変換をかけてみます。
regex.xsl
結果は下記のような感じになります。
$ java -Xss16m -jar saxon9he.jar -xsl:regex.xsl -s:test.xml
xsl:analyze-string は再帰的に適用されるので、該当する箇所全体が置換されているのがわかります。
また、regex-group()による後方参照もきちんとできていますね。
これでやっと XSLT で少しは実用的な文字列処理ができるのではないかと思います。
- *1: 参考: 【Regular Expressions / 正規表現】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0 webzoit.net
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6887
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110708)
3 . 年次の人間ドックへ(110322)
4 . 2023 年分の確定申告完了!(1つめ)(109869)
5 . 三菱鉛筆がラミーを買収(109779)