2

時間形式を取得し、それが有効かどうかを簡単に判断して、XSLT1.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>

問題は、目的の結果を生成するために作成できる最高のXSLT1.0フラグメントは何でしょうか。希望は、それを非常に単純に保ち、すべての時間を解析する必要がないことです(つまり、パターンマッチングは可能であれば甘いでしょう)。

4

6 に答える 6

5

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>
于 2008-09-27T21:39:46.150 に答える
3

XSLT 1.0 には、日付/時刻操作の標準サポートはありません。

簡単な解析およびフォーマット関数を作成する必要があります。それは単純なことではないし、きれいなことでもない。

XSLT は実際にはツリー変換用に設計されています。この種のテキスト ノード操作は、XSLT の外部で行うのが最適です。

于 2008-09-26T22:53:20.663 に答える
2

使用されている実際のxsltプロセッサによっては、カスタム拡張関数で目的の操作を実行できる場合があります(これは自分で作成する必要があります)。

Xalanは拡張機能を適切にサポートしており、Javaだけでなく、JavaScriptやApacheBSFでサポートされている他の言語でも記述できます。

MicrosoftのXSLTエンジンは、.NET Framework開発者ガイド、XSLTスタイルシートの拡張で説明されているように、カスタム拡張機能もサポートしています。

于 2008-09-30T21:03:44.573 に答える
1

リストを完成させるために、 Steve Ball による XSLT 標準ライブラリのDate/Time 処理モジュール部分もあります。

于 2008-09-30T21:05:41.777 に答える
1

exslt.org の time() 関数でさえ、ここでは役に立ちません。入力が適切な形式 (xs:dateTime または xs:time) であることを期待しているためです。

これは、XSLT の外部で修正するのが最適です。私はこれを、XSLT を日常的に使用して、実際には設計されていないことを実行し、物事を機能させることができる人として言います。文字列を解析するようには設計されていません

理想的な解決策は、XML 文書を生成しているものを修正して、その目的のために便利に確立された国際標準を使用して時刻をフォーマットすることです。そうすることを避けることができれば、がらくたデータを永続化または送信してはならないという原則を使用します。

ただし、それが不可能な場合は、データを XSLT に渡す前に修正するか、変換の出力を生成した後に修正する必要があります。

于 2008-09-27T01:51:37.613 に答える
1

http://www.exslt.org/特に「日付と時刻」セクションをご覧ください 。私はそれを深く掘り下げていませんが、あなたが探しているものかもしれません.

于 2008-09-27T00:08:24.383 に答える