如果输入有效,则下面的代码返回“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>
答案 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"/>