2

我想找到一个 XPath 表达式来选择节点,其属性“a”值存在并且是它们的属性“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])],但它不能按预期工作。

你能帮忙吗?谢谢你。

4

1 回答 1

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])]
于 2013-05-02T10:52:46.170 回答