XSLT 1.0で24時間形式をフォーマットする最良の方法は何ですか?
質問
時間形式を取り、それが有効かどうかを簡単に判断し、XSLT 1.0を使用して何らかの形式を持つ結果要素を生成するための良い方法を見つけるのに苦労しました。
次のxmlを指定します:
<root>
<srcTime>2300</srcTime>
</root>
結果のxmlを生成するのは素晴らしいことです:
<root>
<dstTime>23:00</dstTime>
</root>
ただし、ソースxmlに無効な24時間形式が含まれている場合、結果の dstTime 要素は空白になります。
たとえば、無効なソースxmlが次の場合:
<root>
<srcTime>NOON</srcTime>
</root>
結果のxmlは次のようになります。
<root>
<dstTime></dstTime>
</root>
問題は、目的の結果を生成するために作成できる最高のXSLT 1.0 フラグメントは何ですか?希望は、それを非常にシンプルに保ち、すべての時間を解析する必要がないようにすることです(つまり、可能な場合、パターンマッチングは便利です)。
解決
XSLT 1.0には正規表現がないため、パターンマッチングが不可能になるのではないかと考えています。
<srcTime>23:00</srcTime>
が合法であるかどうかは明確ではありませんか?もしそうなら、試してください:
<dstTime>
<xsl:if test="string-length(srcTime) = 4 or
string-length(srcTime) = 5">
<xsl:variable name="hour" select="substring(srcTime, 1, 2)" />
<xsl:if test="$hour >= 0 and 24 > $hour">
<xsl:variable name="minute">
<xsl:choose>
<xsl:when test="string-length(srcTime) = 5 and
substring(srcTime, 3, 1) = ':'">
<xsl:value-of select="substring(srcTime, 4, 2)" />
</xsl:when>
<xsl:when test="string-length(srcTime) = 4">
<xsl:value-of select="substring(srcTime, 3, 2)" />
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:if test="$minute >= 0 and 60 > $minute">
<xsl:value-of select="concat($hour, ':', $minute)" />
</xsl:if>
</xsl:if>
</xsl:if>
</dstTime>
そうではなく、4桁のみが正当な場合:
<dstTime>
<xsl:if test="string-length(srcTime) = 4">
<xsl:variable name="hour" select="substring(srcTime, 1, 2)" />
<xsl:if test="$hour >= 0 and 24 > $hour">
<xsl:variable name="minute" select="substring(srcTime, 3, 2)" />
<xsl:if test="$minute >= 0 and 60 > $minute">
<xsl:value-of select="concat($hour, ':', $minute)" />
</xsl:if>
</xsl:if>
</xsl:if>
</dstTime>
他のヒント
XSLT 1.0には、日付/時刻操作の標準サポートはありません。
単純な解析およびフォーマット関数を作成する必要があります。それは簡単なことではありませんし、きれいになることもありません。
XSLTは、実際にはツリー変換用に設計されています。この種のテキストノードの操作は、XSLTの外部で行うのが最適です。
実際に使用されるxsltプロセッサによっては、カスタム拡張機能で目的の操作を実行できる場合があります(自分で作成する必要があります)。
Xalanは拡張機能を十分にサポートしていますが、 Javaだけでなく、JavaScriptまたは Apache BSF でサポートされている他の言語でも使用できます。
MicrosoftのXSLTエンジンは、 .NET Frameworkで説明されているように、カスタム拡張機能もサポートしています。開発者ガイド、XSLTスタイルシートの拡張
ご覧ください: http://www.exslt.org/ 特に<!> quot; dates and times <!> quot;セクション。 深く掘り下げたわけではありませんが、探しているもののようです。
exslt.orgのtime()関数でも、入力が適切な形式(xs:dateTimeまたはxs:time)であることが期待されるため、ここでは役に立ちません。
これは、XSLTの外部で修正するのが最適なものです。これは、XSLTを日常的に使用して、実際には設計されていないことを行い、物事を機能させるために管理している人だと言います。文字列を解析するように設計されていない本当に。
理想的な解決策は、XMLドキュメントを生成しているものを修正し、その目的のために便利に確立された国際標準を使用して時間をフォーマットすることです。 。
ただし、それが不可能な場合は、XSLTに渡す前にデータを修正するか、変換の出力を生成した後に修正する必要があります。
リストを完成させるために、日付/時刻処理モジュールもありますSteve BallによるXSLT標準ライブラリの一部。