使用Xpath查找某些未指定祖先的属性值

时间:2013-05-02 10:38:50

标签: xpath

我想找到一个XPath表达式来选择节点,其属性'a'值存在,并且是FIRST祖先的属性'b'和'a'的值的连接,属性'a'存在,或者这样的节点,它们首先在层次结构中,具有属性“a”。

<A a='TOWN/'>
 <B>
  <C a='TOWN/STREET' b='STREET'>
    <D a='TOWN/STREET' b='STREET'>
    <E a='TOWN/STREET/HOUSE' b='STREET'></E>
    <F a='TOWN/STREET/HOUSE' b='HOUSE'>
     <G a='TOWN/STREET/HOUSE' b='HOUSE' ></G>
    </F>
   </D>
  </C>
 </B>
</A>

Xpath应该只选择元素A,C和F. 我尝试了\\*[(@a = concat(ancestor::*[@a][1]/@a,'/',@b)) or (not(ancestor::*[@a])],但它没有按预期工作。

你能帮帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:3)

首先,在查询开头使用反斜杠而不是斜杠。然后,您的输入不一致(或复制和粘贴错误?),最后在//A/@a中有一个斜杠,但在其他@a属性中没有。删除它(所以<A a='TOWN'>...</A>时,此XPath查询将执行您想要的操作:

//*[@a = concat(ancestor::*[@a][1]/@a, '/', @b) or not(ancestor::*[@a])]

如果您无法更改输入,请检查是否添加斜杠并且不添加斜杠:

//*[@a = concat(ancestor::*[@a][1]/@a, '/', @b) or @a = concat(ancestor::*[@a][1]/@a, @b) or not(ancestor::*[@a])]