让我们看看以下XML文件:
<a>
<b w="w">
<b1 x="x" />
<b2 y="y" />
</b>
</a>
以下XPath查询返回元素b1
和b2
:
/*/*//*
由此我得出结论,//*
表示选择b
后代不包括b
本身的所有元素。
但是,以下XPath查询返回属性w
,x
,y
:
/*/*//@*
因此,我得出结论,//@*
表示选择b
后代中出现的所有属性,包括b
本身。
这是如何工作的? //
对于元素与属性的工作方式是否有所不同,或者我是否缺少某些内容?
答案 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
”到达那里。