具有比较日期的匹配的xsl模板

时间:2015-05-31 07:24:34

标签: xslt xpath

我有以下XML

<LIST>
  <FIELD name="D22" value="2005-05-03Z" />
  <ELEMENT name="QX55">
    <ELEMENT name="QX553" value="2004-01-01Z" />
  </ELEMENT>
  <ELEMENT name="QX55">
    <ELEMENT name="QX553" value="2005-04-26Z" />
  </ELEMENT>
  <ELEMENT name="QX55">
    <ELEMENT name="QX553" value="2005-05-01Z" />
  </ELEMENT>
  <ELEMENT name="QX55">
    <ELEMENT name="QX553" value="2006-01-01Z" />
  </ELEMENT>
  <ELEMENT name="QX55">
    <ELEMENT name="QX553" value="2005-05-03Z" />
  </ELEMENT>
</LIST>

我正在尝试创建一个xslt映射,该映射将在@value字段D22中的日期之前删除所有带有@value日期的QX25元素

我使用元素:

来应用过滤器
<xsl:template match="">

我知道xslt无法比较日期,所以我怀疑这必须由substring完成,但我不知道如何在match属性中应用substring。 此外,我不能使用xslt的任何扩展

这是我到目前为止所尝试的: 到目前为止,我只是尝试将它用于比较年份,但它给了我一个解析异常

<xsl:variable name="d22date">
        <xsl:value-of select="/LIST/FIELD[@name='D22']/@value" />
</xsl:variable>

<xsl:template match="//ELEMENT[@name='QX55'][ELEMENT[@name='QX553' and substring(@value,0,5)<substring($d22date,0,5)]]"/>

任何人都可以帮我解决这个匹配属性吗?

我正在使用xslt 2.0

1 个答案:

答案 0 :(得分:1)

你并不遥远,但目前的尝试有一些问题:

  • <需要在表达式
  • 中以&lt;进行转义
  • substring中的字符索引从1开始,而不是0。
  • 您想要的日期字符串的长度是10,而不是5

这意味着您的模板应该如下所示:

<xsl:template match="ELEMENT
                     [@name='QX55']
                     [ELEMENT[@name='QX553' and substring(@value, 1, 10) &lt; substring($d22date, 1, 10)]]"/>

请注意,XSLT无法比较日期是不正确的。 XSLT 2.0确实有许多日期/时间函数。例如,您可以像这样编写XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="xml" indent="yes" />

    <xsl:variable name="d22date" select="/LIST/FIELD[@name='D22']/@value" as="xs:date" />

    <xsl:template match="ELEMENT[@name='QX55'][ELEMENT[@name='QX553' and xs:date(@value) &lt; $d22date]]"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>