在XSLT 1.0中格式化24小时的最佳方法是什么?

Sco*_*aad 2 xml xslt xslt-1.0

我很难找到采用时间格式的好方法,并且很容易确定它是否有效,然后生成一个使用XSLT 1.0进行格式化的结果元素.

给出以下xml:

<root>
    <srcTime>2300</srcTime>
</root>
Run Code Online (Sandbox Code Playgroud)

生成生成的xml会很棒:

<root>
    <dstTime>23:00</dstTime>
</root>
Run Code Online (Sandbox Code Playgroud)

但是,如果源xml包含无效的24小时时间格式,则生成的dstTime元素应为空.

例如,当无效的源xml如下:

<root>
    <srcTime>NOON</srcTime>
</root>
Run Code Online (Sandbox Code Playgroud)

生成的xml应该是:

<root>
    <dstTime></dstTime>
</root>
Run Code Online (Sandbox Code Playgroud)

问题是,什么是可以编写以产生所需结果的最佳XSLT 1.0片段?希望是保持它非常简单,而不必解析每一段时间(即如果可能,模式匹配将是甜蜜的).

Jen*_*niT 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>
Run Code Online (Sandbox Code Playgroud)

如果不是,那么四位数是唯一合法的东西:

<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>
Run Code Online (Sandbox Code Playgroud)