我很难找到采用时间格式并轻松确定其是否有效的好方法,然后使用XSLT1.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>问题是,什么是最好的XSLT1.0片段,可以编写以产生所需的结果?希望保持它非常简单,而不必解析每一段时间(也就是说,模式匹配(如果可能的话)将是甜蜜的)。
发布于 2008-09-27 21:39:46
XSLT1.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-26 22:53:20
XSLT1.0对日期/时间操作没有任何标准支持。
您必须编写一个简单的解析和格式化函数。这不会很简单,也不会很漂亮。
XSLT实际上是为树转换而设计的。这种文本节点操作最好在XSLT之外完成。
发布于 2008-09-30 21:03:44
根据实际使用的xslt处理器,您可以在自定义扩展函数中执行所需的操作(您必须自己动手)。
Xalan对扩展函数有很好的支持,不仅可以用JavaScript编写,也可以用阿帕奇BSF支持的其他语言编写。
微软的XSLT引擎也支持自定义扩展,如.NET框架开发人员指南,扩展XSLT样式表所述
https://stackoverflow.com/questions/142400
复制相似问题