Xml XPath使用XPath 2.0选择具有特定属性的元素的唯一列表
我在获取具有特定属性的元素的唯一列表(基于名称)时遇到了一些问题。我可以得到其中任何一个的列表,但是这个组合的列表让我大吃一惊。我的xml如下所示: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"/
<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]