Xml XPath使用XPath 2.0选择具有特定属性的元素的唯一列表

Xml XPath使用XPath 2.0选择具有特定属性的元素的唯一列表,xml,xpath,Xml,Xpath,我在获取具有特定属性的元素的唯一列表(基于名称)时遇到了一些问题。我可以得到其中任何一个的列表,但是这个组合的列表让我大吃一惊。我的xml如下所示: <global> <discipline name="tracks"> <group name="Normal"/> <group name="Gloss" PackGroup="Diffuse"/> <group name="Mask"/

我在获取具有特定属性的元素的唯一列表(基于名称)时遇到了一些问题。我可以得到其中任何一个的列表,但是这个组合的列表让我大吃一惊。我的xml如下所示:

<global>
    <discipline name="tracks">
        <group name="Normal"/>
        <group name="Gloss" PackGroup="Diffuse"/>
        <group name="Mask"/>
        <group name="Diffuse"/>
        <group name="Tint" PackGroup="Gloss"/>
    </discipline>
    <discipline name="trains">
        <group name="Mask"/>
        <group name="Diffuse" PackGroup="Mask"/>
    </discipline>
</global>
获取定义了PackGroup属性的组元素列表也很简单:

/configuration/global/discipline/group[@PackGroup]
但是,我似乎无法获得定义了PackGroup属性的元素的唯一列表。我试过这个:

/configuration/global/discipline/group[not(@name = following::group/@name) and @PackGroup]
/configuration/global/discipline/group[not(@name = following::group/@name) and contains(@PackGroup, '*')]
不返回任何元素和

/configuration/global/discipline/group[not(@name = following::group/@name) and contains(@PackGroup, '')]
它只返回唯一的列表。有人知道什么是正确的xpath查询才能得到我想要的吗

(我正在使用C#和xpath 2.0,以防出现问题)


谢谢

我想你要找的是

/configuration/global/discipline/group
  [not(@name = following::group[@Packgroup]/@name) and @PackGroup]
您希望确保要筛选的组(表达式中的第一个
)和要检查的下一个组(第二个
)都具有@Packgroup属性

使用该函数也可能有一种方法可以做到这一点,但目前我还没有想到该怎么做。

更有效的解决方案(O(n logn)而不是O(n*n))应该是

/configuration/global/discipline/group
  [not(@name = following::group[@Packgroup]/@name) and @PackGroup]
for $n in distinct-values(//group[@Packgroup]/@name) 
return (//group[@Packgroup][@name=$n])[1]