我必须做一些练习,但是我真的不明白两条相似路径之间的区别
我有树:
<b>
<t></t>
<a>
<n></n>
<p></p>
<p></p>
</a>
<a>
<n></n>
<p></p>
</a>
<a></a>
</b>
我们希望每个最终标签包含一个文本节点。
我必须解释//a//text() 和//a/text() 之间的区别
我看到//a//text() 返回所有文本节点,这似乎是合法的,但是为什么//a/text() 返回最后一个"一个节点"-> text 节点?
另一个问题:为什么//p[1] 为每个"一个节点"返回第一个"p"子节点? -> 我有两个结果
<b>
<t></t>
<a>
<n></n>
**<p></p>**
<p></p>
</a>
<a>
<n></n>
**<p></p>**
</a>
<a></a>
</b>
为什么答案不是整个文档的第一个"p"节点?
谢谢大家!
1:
//a//text()
和2://a/text()
之间的区别
让我们分解一下://a
选择所有a
元素,无论它们在文档中的哪个位置。假设您有 /a
,这将选择所有根a
元素。
如果 /
路径表达式位于 XPath 表达式中的另一个元素之后,它将选择直接降序的元素,然后是 XPath 表达式中的元素(即子元素)。
如果 //
路径表达式位于 XPath 表达式中的另一个元素之后,它将选择作为前一个元素后代的所有元素,无论它们位于前一个元素下的位置。
应用于两个 XPath 表达式:
-
//a//text()
:选择所有a
元素,无论它们在文档中的哪个位置,对于这些元素,无论它们在所选元素a
下的位置,都选择text()
。 -
//a/text()
:选择所有a
元素,无论它们在文档中的哪个位置,并为这些元素选择任何直接后代text()
。
为什么
//p[1]
返回每个"一个节点",第一个"p"子节点?
假设您要编写//a/p[1]
,这将选择文档中任何a
元素的第一个p
子元素。通过编写//p[1]
省略显式父元素,但谓词仍会选择p
元素具有的任何父元素的第一个子元素。
在这种情况下,有两个父a
元素,为这两个元素选择第一个p
子元素。
最好在您
最喜欢的搜索引擎上搜索 XPath 的良好介绍。我一直觉得这个从 w3schools.com 开始是一个很好的。