XSLT 1.0:[not(./@id = preceding::a/@id)] 过滤器两次显示第一个元素
XSLT 1.0: [not(./@id = preceding::a/@id)] filter shows first element twice
我似乎犯了某种 simple/stupid 错误。
给出以下(简化)xml:
<xml>
<a id="0" />
<a id="0" />
<a id="0" />
<a id="2" />
<a id="2" />
</xml>
并给出以下(简化的)xslt:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="xml">
<xsl:for-each select="//a[not(./@id = preceding::a/@id)]">
id=<xsl:value-of select="@id" />
</xsl:for-each>
</xsl:template>
这给了我以下输出:
<?xml version="1.0" encoding="UTF-8"?>
id=0
id=0
id=2
可以看出,id=0
的元素被处理了两次,尽管它应该只被处理一次。在 XML 输入中它出现了三次,问题只发生在第一个元素上(因为带 id=2
的元素只被正确处理了一次)。
请注意,我需要使用前面的作为过滤器(而不是前面的兄弟),因为原来的 XML 更复杂。我还需要使用 XSLT 1.0,因为我使用 Xalan 2.7.1 作为 Xslt 处理器。
感谢有用的评论,我能够验证这是 XSLT 处理器的问题。在 Mac 和 jdk1.7.0_67
上,当系统 属性 javax.xml.transform.TransformerFactory=null
并因此使用平台默认值时(请参阅 API doc),这会导致上述错误输出。
换句话说,真正的问题是我未能像我在问题中发布的那样将 Xalan 设置为 Xslt 处理器。感谢您的帮助!
我似乎犯了某种 simple/stupid 错误。
给出以下(简化)xml:
<xml>
<a id="0" />
<a id="0" />
<a id="0" />
<a id="2" />
<a id="2" />
</xml>
并给出以下(简化的)xslt:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="xml">
<xsl:for-each select="//a[not(./@id = preceding::a/@id)]">
id=<xsl:value-of select="@id" />
</xsl:for-each>
</xsl:template>
这给了我以下输出:
<?xml version="1.0" encoding="UTF-8"?>
id=0
id=0
id=2
可以看出,id=0
的元素被处理了两次,尽管它应该只被处理一次。在 XML 输入中它出现了三次,问题只发生在第一个元素上(因为带 id=2
的元素只被正确处理了一次)。
请注意,我需要使用前面的作为过滤器(而不是前面的兄弟),因为原来的 XML 更复杂。我还需要使用 XSLT 1.0,因为我使用 Xalan 2.7.1 作为 Xslt 处理器。
感谢有用的评论,我能够验证这是 XSLT 处理器的问题。在 Mac 和 jdk1.7.0_67
上,当系统 属性 javax.xml.transform.TransformerFactory=null
并因此使用平台默认值时(请参阅 API doc),这会导致上述错误输出。
换句话说,真正的问题是我未能像我在问题中发布的那样将 Xalan 设置为 Xslt 处理器。感谢您的帮助!