我有以下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
答案 0 :(得分:1)
你并不遥远,但目前的尝试有一些问题:
<
需要在表达式<
进行转义
substring
中的字符索引从1开始,而不是0。这意味着您的模板应该如下所示:
<xsl:template match="ELEMENT
[@name='QX55']
[ELEMENT[@name='QX553' and substring(@value, 1, 10) < 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) < $d22date]]"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>