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

use*_*340 2 xml xpath

我在获取也具有特定属性的唯一元素列表(基于名称)时遇到了一些麻烦。我可以得到其中任何一个的列表,但合并列表是什么让我绊倒。我的 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>
Run Code Online (Sandbox Code Playgroud)

使用这个 xpath 查询,我可以很容易地得到一个不同的组元素列表:

/configuration/global/discipline/group[not(@name = following::group/@name)]
Run Code Online (Sandbox Code Playgroud)

获取定义了 PackGroup 属性的组元素列表也很简单:

/configuration/global/discipline/group[@PackGroup]
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法获得定义了 PackGroup 属性的元素的唯一列表。我试过这个:

/configuration/global/discipline/group[not(@name = following::group/@name) and @PackGroup]
/configuration/global/discipline/group[not(@name = following::group/@name) and contains(@PackGroup, '*')]
Run Code Online (Sandbox Code Playgroud)

不返回任何元素和

/configuration/global/discipline/group[not(@name = following::group/@name) and contains(@PackGroup, '')]
Run Code Online (Sandbox Code Playgroud)

它只返回唯一的列表。有谁知道正确的 xpath 查询是什么才能得到我要找的东西?

(我正在使用 C# 和 xpath 2.0 以防万一)

谢谢!

Mic*_*Kay 6

更有效的解决方案(O(n log n) 而不是 O(n*n))将是

for $n in distinct-values(//group[@Packgroup]/@name) 
return (//group[@Packgroup][@name=$n])[1]
Run Code Online (Sandbox Code Playgroud)