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 处理器。感谢您的帮助!