2

我很难找到采用时间格式并轻松确定它是否有效然后使用 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片段是什么?希望是保持它非常简单,而不必每次都解析(即,如果可能的话,模式匹配会很甜蜜)。

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>

如果不是,并且只有四位数是合法的,那么:

<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 或Apache BSF支持的其他语言编写它们。

Microsoft 的 XSLT 引擎也支持自定义扩展,如.NET Framework 开发人员指南,扩展 XSLT 样式表中所述

于 2008-09-30T21:03:44.573 回答
1

看看: http ://www.exslt.org/特别是“日期和时间”部分。我还没有深入研究它,但它看起来可能是你正在寻找的东西。

于 2008-09-27T00:08:24.383 回答
1

甚至 exslt.org 的 time() 函数在这里也无济于事,因为它希望其输入采用正确的格式(xs:dateTime 或 xs:time)。

这是最好在 XSLT 之外解决的问题。我这样说是作为一个经常使用 XSLT 来完成并非真正为它设计的事情并设法让事情正常工作的人。它真的不是为了解析字符串而设计的。

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

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

于 2008-09-27T01:51:37.613 回答
1

为了使列表完整,Steve Ball 还提供了 XSLT 标准库的日期/时间处理模块部分。

于 2008-09-30T21:05:41.777 回答