首页 > 解决方案 > xapth - 按属性获取不同的节点

问题描述

我有以下xml:

<RD>
    <C id="1" pna="00-002" value="value1" />
    <C id="7" pna="00-008" value="value2"/>
    <C id="8" pna="00-009" value="value3"/>
    <C id="9" pna="00-009" value="value4"/>
    <C id="10" pna="00-010" value="value5"/>
    <C id="26" pna="00-025" value="value6"/>
    <C id="27" pna="00-026" value="value7"/>
    <C id="28" pna="00-026" value="value8"/>
    <C id="29" pna="00-026" value="value9"/>
    <C id="30" pna="00-026" value="value10"/>
    <C id="31" pna="00-027" value="value11"/>
</RD>

我只想通过属性 pna 获得不同的节点。示例结果:

<C id="1" pna="00-002" value="value1" />
<C id="7" pna="00-008" value="value2"/>
<C id="8" pna="00-009" value="value3"/>
<C id="10" pna="00-010" value="value5"/>
<C id="26" pna="00-025" value="value6"/>
<C id="27" pna="00-026" value="value7"/>
<C id="31" pna="00-027" value="value11"/>

我可以使用这个 xpath 来获取不同的值: distinct-values(/RD/C/@pna) ,但我想获取节点,而不是值。

设想:

  1. 通过属性 pna 获取不同的值(例如:使用 distinct-values())
  2. 遍历不同的值列表并在 xml 节点(第一个或最后一个节点,无关紧要)中查找,该 pna 属性与迭代器具有相同的值

请注意,我不能使用following-sibling 或previous-sibling 函数,因为属性pna 的相同值可能出现2 次以上。是否可以在纯 xpath 中做到这一点,而不使用任何编程语言?

标签: xmlxpath

解决方案


Your XPath would be /RD/C[not(./@pna = following::C/@pna)].

See test here.


推荐阅读