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