【问题标题】:XPath to select unique list of elements that have a certain attribute with Xpath 2.0XPath 使用 Xpath 2.0 选择具有特定属性的元素的唯一列表
【发布时间】:2013-08-26 19:05:51
【问题描述】:

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

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

/configuration/global/discipline/group[not(@name = following::group/@name)]

获取定义了 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 以防万一)

谢谢!

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

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

    for $n in distinct-values(//group[@Packgroup]/@name) 
    return (//group[@Packgroup][@name=$n])[1]
    

    【讨论】:

      【解决方案2】:

      我认为你正在寻找的是

      /configuration/global/discipline/group
        [not(@name = following::group[@Packgroup]/@name) and @PackGroup]
      

      您要确保要过滤的组(表达式中的第一个 group)和要检查的下一个组(第二个 group)都具有 @Packgroup 属性。

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

      【讨论】:

        猜你喜欢
        • 2012-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 2011-08-03
        相关资源
        最近更新 更多