XPath 两个相似路径和其他问题之间的区别



我必须做一些练习,但是我真的不明白两条相似路径之间的区别

我有树:

<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 表达式:

  1. //a//text() :选择所有a元素,无论它们在文档中的哪个位置,对于这些元素,无论它们在所选元素a下的位置,都选择text()

  2. //a/text() :选择所有a元素,无论它们在文档中的哪个位置,并为这些元素选择任何直接后代text()

为什么//p[1]返回每个"一个节点",第一个"p"子节点?

假设您要编写//a/p[1],这将选择文档中任何a元素的第一个p子元素。通过编写//p[1]省略显式父元素,但谓词仍会选择p元素具有的任何父元素的第一个子元素。

在这种情况下,有两个父a元素,为这两个元素选择第一个p子元素。


最好在您

最喜欢的搜索引擎上搜索 XPath 的良好介绍。我一直觉得这个从 w3schools.com 开始是一个很好的。

最新更新