BLOGTIMES
2014/05/30

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

  xml 
このエントリーをはてなブックマークに追加

XSLT は組み込みの関数が貧弱なので、日付の処理はできないと思い込んでいたのですが、XSLT 2.0*1ではいろいろと日付関連の関数が加わっていたことがわかったので、ちょっと使い方を調べてみました。

今回やりたかったのは下記のような ISO 8601 形式の日付でタイムゾーンがバラバラの場合にこれらをローカルタイムに変換するという処理。

<root> <date>2014-05-30T15:00:00Z</date> <date>2014-05-31T00:00:00+09:00</date> </root>

これらはいずれも JST では 2014-05-31 00:00:00 なので、これを下記のように変換する XSL を書いてみます。

<root> <jst>2014-05-31 00:00:00</jst> <jst>2014-05-31 00:00:00</jst> </root>

以下、作業メモ。

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 というように表記するようです。

<?xml version='1.0' encoding='UTF-8'?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"> <xsl:output media-type="text/xml; charset=UTF-8" encoding="UTF-8"/> <xsl:template match="/root"> <root> <xsl:apply-templates /> </root> </xsl:template> <xsl:template match="date"> <xsl:variable name="jst" select="adjust-dateTime-to-timezone(., xs:dayTimeDuration('PT9H'))"/> <jst><xsl:value-of select="format-dateTime($jst,'[Y0001]-[M01]-[D01] [H01]:[m01]:[s01]')"/></jst> </xsl:template> </xsl:stylesheet>

あとは Java が入ったマシンで下記のような感じで起動してやれば OK です。
ここでは作成した XSL を fuga.xml、元データの XML を hoge.xml であるとしています。

java -jar saxon9he.jar -xsl:fuga.xsl -s:hoge.xml

あまり使っている人がいないのか、資料を探すのに苦労しました。

参考


トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6756
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン