2008-09-26 86 views
2

我很难找到采用时间格式的好方法,并轻松确定它是否有效,然后生成使用XSLT 1.0进行格式设置的结果元素。在XSLT 1.0中格式化24小时的最佳方式是什么?

鉴于以下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片段可能写出来产生预期的结果?希望能够保持简单,并且不必分析每一段时间(即,如果可能的话,模式匹配将是甜蜜的)。

+0

可以帮助但注意到2400是无效的日期。中午是1200,午夜是0000. – dacracot 2008-09-26 23:40:15

回答

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

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

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

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

1

看一看: http://www.exslt.org/具体是“日期和时间”部分。 我还没有深入研究它,但它看起来可能就是你要找的东西。

1

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

这是在XSLT之外最好解决的问题。我认为这是一个经常使用XSLT来完成它并非真正设计的事情,并设法使事情有效的人。这真的是没有设计来解析字符串。

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

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

相关问题