我很难找到采用时间格式的好方法,并且很容易确定它是否有效,然后生成一个使用XSLT 1.0进行格式化的结果元素.
给出以下xml:
<root>
<srcTime>2300</srcTime>
</root>
Run Code Online (Sandbox Code Playgroud)
生成生成的xml会很棒:
<root>
<dstTime>23:00</dstTime>
</root>
Run Code Online (Sandbox Code Playgroud)
但是,如果源xml包含无效的24小时时间格式,则生成的dstTime元素应为空.
例如,当无效的源xml如下:
<root>
<srcTime>NOON</srcTime>
</root>
Run Code Online (Sandbox Code Playgroud)
生成的xml应该是:
<root>
<dstTime></dstTime>
</root>
Run Code Online (Sandbox Code Playgroud)
问题是,什么是可以编写以产生所需结果的最佳XSLT 1.0片段?希望是保持它非常简单,而不必解析每一段时间(即如果可能,模式匹配将是甜蜜的).
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>
Run Code Online (Sandbox Code Playgroud)
如果不是,那么四位数是唯一合法的东西:
<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>
Run Code Online (Sandbox Code Playgroud)