考虑这个 XML 文档:
<foo>
<bar id="aaa"/>
<jam>
<bar id="bbb"/>
</jam>
</foo>
我正在尝试查找文档中的第一个
<bar>
元素。
这是我的发现:
测试# | XPath 表达式 | 评价表达 | 结果 |
---|---|---|---|
1 |
|
|
,
|
2 |
|
|
,
|
3 |
|
|
|
我不明白的是为什么测试 #2 返回
aaa
、bbb
而不是仅仅 aaa
。就好像 [1]
运算符不起作用一样。
我的理解是,在测试 #2 中,
//bar
表达式将找到两个节点,然后 [1]
运算符将选择第一个节点。显然,我错过了一些东西。
这似乎已被测试 #3 所证实,这显然是如何表达我真正想要的。
此外,如果将 XML 文档更改为:
<foo>
<bar id="aaa"/>
<bar id="bbb"/>
</foo>
然后你就得到了我期望看到的:
测试# | XPath 表达式 | 评价表达 | 结果 |
---|---|---|---|
1 |
|
|
,
|
2 |
|
|
|
3 |
|
|
|
我在这里错过了关于
[1]
应该如何工作的微妙之处?
[1]
指示相对于上下文节点的位置,因此 /foo/descendant::bar[1]
将返回预期结果,因为 descendant
ax 生成节点集(与 (//bar)[1]
相同)。
//bar[1]
返回两者,因为它们具有与 wich 不同的上下文节点来建立位置。换句话说,两者的上下文都有position()=1。