XSLT 1.0:[not(./@ id = preceding :: a / @ id)]过滤器显示第一个元素两次

时间:2015-03-05 23:32:28

标签: xml xslt xpath

我似乎在犯某种简单/愚蠢的错误。

给出以下(简化)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处理器。

1 个答案:

答案 0 :(得分:0)

感谢有用的评论,我能够验证这是XSLT处理器的问题。在使用系统属性jdk1.7.0_67并且因此使用平台默认值(请参阅API doc)的javax.xml.transform.TransformerFactory=null的Mac上,这会导致上述输出错误。

换句话说,真正的问题是我没有像我在问题中发布的那样将Xalan设置为Xslt处理器。谢谢你的帮助!