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

时间:2008-09-26 22:45:48

标签: xml xslt xslt-1.0

我很难找到采用时间格式的好方法,并且很容易确定它是否有效,然后生成使用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 片段可以编写以产生所需的结果?希望是保持它非常简单,而不必解析每一段时间(即如果可能,模式匹配会很甜)。

6 个答案:

答案 0 :(得分: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>

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

<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>

答案 1 :(得分:3)

XSLT 1.0没有对日期/时间操作的任何标准支持。

您必须编写一个简单的解析和格式化函数。这不会很简单,那也不会很漂亮。

XSLT实际上是为树转换而设计的。这种文本节点操作最好在XSLT之外完成。

答案 2 :(得分:2)

根据所使用的实际xslt处理器,您可以在自定义扩展功能中执行所需的操作(您必须自己制作)。

Xalan对extension functions提供了很好的支持,您不仅可以用Java编写它们,还可以用JavaScript或Apache BSF支持的其他语言编写它们。

Microsoft的XSLT引擎也支持自定义扩展,如.NET Framework Developer's Guide, Extending XSLT Style Sheets

中所述

答案 3 :(得分:1)

看看: http://www.exslt.org/特别是“日期和时间”部分。 我没有深入挖掘它,但看起来它可能是你想要的。

答案 4 :(得分:1)

即使是exslt.org time()函数也无法帮到你,因为它希望它的输入格式正确(xs:dateTime或xs:time)。

这是最好在XSLT之外修复的东西。我说这是一个经常使用XSLT来做事情的人,这些事情并不是真正的设计并且能够让事情变得有效。 真的并非旨在解析字符串。

理想的解决方案是修复生成XML文档的任何内容,以便使用为此目的而方便地建立的国际标准来格式化时间,使用不应该保留或传输垃圾数据的原则,如果您可以避免这样做。

但如果这不可能,你应该在将数据传递给XSLT之前修复数据,或者在生成转换输出后修复它。

答案 5 :(得分:1)

为了完成列表,Steve Ball还有Date/Time processing module部分XSLT标准库。