在XSLT 2.0中验证日期时间

时间:2014-02-17 14:03:09

标签: xslt xslt-2.0

如果输入有效,则下面的代码返回“TRUE”,但如果输入错误则抛出错误。例如,如果月份值为15,则会引发错误。我怎么能返回false而不是错误/异常?

<xsl:template match="SUBSCRIBER">
    <xsl:variable name="date-iso" select="dm:stringToDateTime('20130327230844')"/>
    <xsl:value-of select="($date-iso castable as xs:dateTime)"/>
</xsl:template>

<xsl:function name="dm:stringToDateTime">
    <!-- Convert string to date. Input format YYYYMMDDHHMMSS, Ex:20130116100037  -->
    <xsl:param name="p_str" as="xs:string"/>
    <xsl:value-of select="xs:dateTime(concat(substring($p_str,0,5),'-',substring($p_str,5,2),'-',substring($p_str,7,2),'T',substring($p_str,9,2),':',substring($p_str,11,2),':',substring($p_str,13,2)))"/>
</xsl:function>

2 个答案:

答案 0 :(得分:3)

我认为如果您构建的字符串不是xs:dateTime,则尝试在xs:dateTime(concat(substring($p_str,0,5),'-',substring($p_str,5,2),'-',substring($p_str,7,2),'T',substring($p_str,9,2),':',substring($p_str,11,2),':',substring($p_str,13,2)))中使用xs:dateTime构造函数会导致错误。您需要更改功能代码,如果输入格式可能不是有效xs:dateTime那么在函数中不尝试构造,只返回

字符串
<xsl:function name="dm:stringToDateTime">
    <!-- Convert string to date. Input format YYYYMMDDHHMMSS, Ex:20130116100037  -->
    <xsl:param name="p_str" as="xs:string"/>
    <xsl:sequence select="concat(substring($p_str,1,4),'-',substring($p_str,5,2),'-',substring($p_str,7,2),'T',substring($p_str,9,2),':',substring($p_str,11,2),':',substring($p_str,13,2))"/>
</xsl:function>

然后检查

<xsl:template match="SUBSCRIBER">
    <xsl:variable name="date-iso" select="dm:stringToDateTime('20130327230844')"/>
    <xsl:value-of select="($date-iso castable as xs:dateTime)"/>
</xsl:template>

当然,重命名该功能可能会更好,或者写另一个执行可转换检查的功能。

答案 1 :(得分:1)

你有正确的想法,使用“castable as”但你需要在尝试演员之前做到这一点,而不是之后。像

这样的东西
<xsl:variable name="dt" select="concat(substring($p_str,0,5),'-',substring($p_str,5,2),'-',substring($p_str,7,2))"/>
<xsl:sequence select="$dt castable as xs:dateTime"/>