- blogs:
- cles::blog

XSLT 2.0 で ISO 8601 形式の日付を処理する

XSLT は組み込みの関数が貧弱なので、日付の処理はできないと思い込んでいたのですが、XSLT 2.0*1ではいろいろと日付関連の関数が加わっていたことがわかったので、ちょっと使い方を調べてみました。
今回やりたかったのは下記のような ISO 8601 形式の日付でタイムゾーンがバラバラの場合にこれらをローカルタイムに変換するという処理。
これらはいずれも JST では 2014-05-31 00:00:00 なので、これを下記のように変換する XSL を書いてみます。
以下、作業メモ。
† XSLT の日付関数
XSLT 2.0 で日付関連の機能は 16.5 Formatting Dates and Times という場所にまとまっています。format-dateTime() / format-date() / format-time() という名前でわかるとおり、strftime() 的な日付をフォーマットする関数だけが含まれています。従って、 XSLT 2.0 だけではタイムゾーンを解釈することができません。
タイムゾーンを解釈したり、日付の計算を行ったりする機能は XQuery 1.0 and XPath 2.0*2 の方の 10 Functions and Operators on Durations, Dates and Times に含まれています。ここに adjust-dateTime-to-timezone() があるので、今回はこれを活用します。
† 問題は処理系
また、これを使う上での一番の障害になるのは XSLT 2.0 をサポートしている処理系が少ないということ。たとえば libxslt などは XSLT 1.0 のみのサポートです。そんなわけで今回は Saxson*3 を使うことにしました。
† 作成した XSL
特に難しいことはないと思いますが、 dayTimeDuration の書き方はちょっと独特で、+09:00 は PT9H というように表記するようです。
あとは Java が入ったマシンで下記のような感じで起動してやれば OK です。
ここでは作成した XSL を fuga.xml、元データの XML を hoge.xml であるとしています。
あまり使っている人がいないのか、資料を探すのに苦労しました。
† 参考
- *1: XSL Transformations (XSLT) Version 2.0
- *2: XQuery 1.0 and XPath 2.0 Functions and Operators (Second Edition)
- *3: The SAXON XSLT and XQuery Processor
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6756
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110681)
3 . 年次の人間ドックへ(110305)
4 . 2023 年分の確定申告完了!(1つめ)(109854)
5 . 三菱鉛筆がラミーを買収(109751)