按选择内的唯一属性值过滤元素

时间:2018-01-02 11:53:26

标签: xslt xpath

我有这个输入:

<r>
<x>
<s>
<a u="1"/>
<a u="2"/>
</s>
<t>
<a u="1"/>
<a u="4"/>
</t>
</x>
<y>
<a u="4"/>
<a u="5"/>
<a u="4"/>
<a u="1"/>
</y>
</r>

我尝试使用此xpath按其@u属性值

过滤所有元素
/r/x//a[not(@u=preceding-sibling::node()/@u)]

预期的输出/结果是:

Element='<a u="1"/>'
Element='<a u="2"/>'
Element='<a u="4"/>'

但我明白了:

Element='<a u="1"/>'
Element='<a u="2"/>'
Element='<a u="1"/>'
Element='<a u="4"/>'

当前兄弟对父结构中的兄弟姐妹进行评估时,我需要告诉他来评估一组给定节点上的表达式,即/r/x//a的结果。

1 个答案:

答案 0 :(得分:0)

假设XSLT 2或3(例如Saxon 9在Java和.NET平台上支持),您可以使用

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="3.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
      <xsl:for-each-group select="//a" group-by="@u">
          <xsl:copy-of select="."/>
      </xsl:for-each-group>
  </xsl:template>

</xsl:stylesheet>

并获取

<a u="1"/>
<a u="2"/>
<a u="4"/>
<a u="5"/>

http://xsltfiddle.liberty-development.net/948Fn59