在 XSLT 中检查字符串是否为有效日期
Check whether a string is a valid date or not in XSLT
我有一个 xml 文档,其中有一些日期节点,如果这些值是有效日期,我将尝试获取它们的值,否则为空字符串。
XML:
<root>
<START_DATE><![CDATA[03/05/2015]]></START_DATE>
<START_DATE><![CDATA[05/05/2015]]></START_DATE>
<START_DATE><![CDATA[Online]]></START_DATE>
</root>
XSLT:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
<xsl:output method="text" indent="yes" />
<xsl:template match="@*|node()">
<xsl:apply-templates select="@*|node()" />
</xsl:template>
<xsl:template match="START_DATE">
<xsl:copy>
<xsl:value-of select="if(string(normalize-space(.)) castable as xs:date) then normalize-space(.) else ''"></xsl:value-of>
</xsl:copy>
<xsl:text>,</xsl:text>
</xsl:template>
</xsl:transform>
输出:
,,,
预期:
03/05/2015,05/05/2015,,
get their values if the values are valid dates otherwise empty string
Xalan 是一个 XSLT 1.0 处理器。 XSLT 1.0 没有 "date" 的概念,因此您必须自己执行验证。确切的方法取决于 "valid date" 在这种情况下的确切含义。
如果足以确保声称是日期的字符串被格式化为日期(即恰好具有此模式“##/##/#### "), 那么测试就可以很简单了:
<xsl:if test="translate(., '123456789', '000000000') = '00/00/0000'">
<!-- result if valid -->
</xsl:if>
如果您还需要测试声称的日期是否是公历中的有效日期(例如,不是“13/13/2015”),那么它会变得更加复杂。
关于 XSLT 2.0 的注释:
在 XSLT 2.0 中,您可以使用 castable as xs:date
来测试日期是否有效。但是,即使格式为 MM/DD/YYYY
或 DD/MM/YYYY
的有效日期也不会通过此测试。您必须先将这些字符串转换为 YYYY-MM-DD
格式。
我有一个 xml 文档,其中有一些日期节点,如果这些值是有效日期,我将尝试获取它们的值,否则为空字符串。
XML:
<root>
<START_DATE><![CDATA[03/05/2015]]></START_DATE>
<START_DATE><![CDATA[05/05/2015]]></START_DATE>
<START_DATE><![CDATA[Online]]></START_DATE>
</root>
XSLT:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
<xsl:output method="text" indent="yes" />
<xsl:template match="@*|node()">
<xsl:apply-templates select="@*|node()" />
</xsl:template>
<xsl:template match="START_DATE">
<xsl:copy>
<xsl:value-of select="if(string(normalize-space(.)) castable as xs:date) then normalize-space(.) else ''"></xsl:value-of>
</xsl:copy>
<xsl:text>,</xsl:text>
</xsl:template>
</xsl:transform>
输出:
,,,
预期:
03/05/2015,05/05/2015,,
get their values if the values are valid dates otherwise empty string
Xalan 是一个 XSLT 1.0 处理器。 XSLT 1.0 没有 "date" 的概念,因此您必须自己执行验证。确切的方法取决于 "valid date" 在这种情况下的确切含义。
如果足以确保声称是日期的字符串被格式化为日期(即恰好具有此模式“##/##/#### "), 那么测试就可以很简单了:
<xsl:if test="translate(., '123456789', '000000000') = '00/00/0000'">
<!-- result if valid -->
</xsl:if>
如果您还需要测试声称的日期是否是公历中的有效日期(例如,不是“13/13/2015”),那么它会变得更加复杂。
关于 XSLT 2.0 的注释:
在 XSLT 2.0 中,您可以使用 castable as xs:date
来测试日期是否有效。但是,即使格式为 MM/DD/YYYY
或 DD/MM/YYYY
的有效日期也不会通过此测试。您必须先将这些字符串转换为 YYYY-MM-DD
格式。