【问题标题】:XPath difference between two similar path and other questions两个相似路径和其他问题之间的 XPath 区别
【发布时间】:2016-03-04 09:13:36
【问题描述】:

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

我有树:

<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() 返回最后一个“a 节点”-> 文本节点?

另一个问题: 为什么 //p[1] 为每个“a node”返回第一个“p”子节点? -> 我有两个结果

<b>
   <t></t> 
   <a>
      <n></n>
      **<p></p>**
      <p></p>
   </a> 
   <a>
      <n></n>
      **<p></p>**
   </a> 
   <a></a> 
</b>

为什么答案不是整个文档的第一个“p”节点?

谢谢大家!

【问题讨论】:

  • 我对你的问题投了反对票有几个原因:输入错误(根本没有文本节点?),使用不相关的标签(xquery 似乎与普通 XPath 无关)。如果您想知道不同的查询结果,也请发布这些结果。如果您有一些预期的输出,也将其发布(此处不适用)。如果问题被重新修改,我很乐意回复否决票,但它肯定是无法回答的。
  • 我仍然没有在您的文档中看到任何文本节点。您查询的实际输入是什么?

标签: xpath


【解决方案1】:

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]会为每个“a node”返回第一个“p”子节点?

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

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


最好在您最喜欢的搜索引擎上搜索 XPath 的良好介绍。我一直觉得this one from w3schools.com 是个好人。

【讨论】:

    猜你喜欢
    • 2018-06-17
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2014-09-25
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多