我似乎在犯某种简单/愚蠢的错误。
给出以下(简化)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处理器。
答案 0 :(得分:0)
感谢有用的评论,我能够验证这是XSLT处理器的问题。在使用系统属性jdk1.7.0_67
并且因此使用平台默认值(请参阅API doc)的javax.xml.transform.TransformerFactory=null
的Mac上,这会导致上述输出错误。
换句话说,真正的问题是我没有像我在问题中发布的那样将Xalan设置为Xslt处理器。谢谢你的帮助!