我想找到一个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])]
,但它没有按预期工作。
答案 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])]