在XPath中使用//不清楚

时间:2015-07-22 14:21:28

标签: xml xpath

让我们看看以下XML文件:

<a>
  <b w="w">
    <b1 x="x" />
    <b2 y="y" />
  </b>
</a>

以下XPath查询返回元素b1b2

/*/*//*

由此我得出结论,//*表示选择b 后代不包括b本身的所有元素。

但是,以下XPath查询返回属性wxy

/*/*//@*

因此,我得出结论,//@*表示选择b 后代中出现的所有属性,包括b本身

这是如何工作的? //对于元素与属性的工作方式是否有所不同,或者我是否缺少某些内容?

2 个答案:

答案 0 :(得分:2)

明显的矛盾源于对xpath表达式的简写符号的解释。

xpath表达式中的

//是xpath轴//descendant-or-self::node()/的简写。在xpath中指定元素,例如。通过其标记名称实际查询child轴上的元素。

查询属性时child轴不适用 - @表示自己的轴,即attributes

因此匹配似乎在tre表示中包含一个级别。

答案 1 :(得分:2)

///descendant-or-self::node()/

的缩写

/*同时识别当前位置的所有子节点。

从根开始,/*/*//因此将我们移至<a>(root的子级),然后移至<b><a>的所有子级为<b> descendant-or-self::node() 1}})然后选择<b>,也就是说<b1><b2><b>

<b1><b2>/*/*//的起点开始,/*/*//*与您的两条路径不同。

<b1>匹配这些节点的所有子节点。由于<b2><b>没有子节点,因此仅匹配<b1><b2>/*/*//@*的子节点。

<b>匹配这些节点的所有属性。由于<b1><b2>//*都具有属性,因此所有这些属性都会匹配。

  

由此我得出结论,b表示选择b 后代的所有元素,不包括b本身

是的,但只是间接的。这意味着“选择所有b 后代的元素,包括 b本身,然后找到他们的孩子”。这相当于“b但不是b的所有后代”,但它经历了“包括a”到达那里。