我很难找到采用时间格式并轻松确定其是否有效的好方法,然后使用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>https://stackoverflow.com/questions/142400
复制相似问题