在XSLT中检查字符串是否为有效日期

时间:2015-05-08 06:09:47

标签: xml xslt xalan

我有一个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>&#44;</xsl:text>
  </xsl:template>
</xsl:transform>

输出:

,,,

预期:

03/05/2015,05/05/2015,,

1 个答案:

答案 0 :(得分:3)

  

如果值是有效日期,则获取其值,否则为空字符串

Xalan是一个XSLT 1.0处理器。 XSLT 1.0没有&#34; date&#34;的概念,因此您必须自己执行验证。确切的方法取决于具体做法&#34;有效日期&#34;在这种情况下意味着

如果它足以确保声称是日期的字符串格式化作为日期(即具有完全相同的模式&#34; ## / ## / ## ##&#34;),那么测试可以非常简单:

castable as xs:date

如果你还需要测试所谓的日期是公历中的有效日期(例如,不是&#34; 13/13/2015&#34;,那么它会变得更加复杂。) p>

关于XSLT 2.0的说明:

在XSLT 2.0中,您可以使用MM/DD/YYYY来测试日期是否有效。但是,即使格式为DD/MM/YYYYYYYY-MM-DD的有效日期也不会通过此测试。您必须先将这些字符串转换为if (tableNameVector.size() != tableTagIdVector.size()) throw new IllegalArgumentException("tableNameVector and tableTagIdVector " + "must have the same size"); 格式。