首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >//和/descendant在XPath选择多个子女方面的差异

//和/descendant在XPath选择多个子女方面的差异
EN

Stack Overflow用户
提问于 2015-11-25 13:40:58
回答 2查看 5.6K关注 0票数 10

在选择//element中的基元素的多个子元素时,我不能清楚地理解使用/descendant::element和XPath的区别。

给定这个HTML片段

代码语言:javascript
复制
<html>
<body>
<div class="popupContent">
  <table>
    <tr class="aclass"><td> Hello </td> <td> <input type="text" value="FIRST" /> </td></tr>
    <tr class="aclass"><td> Goodbye </td> <td> <input type="text" value="SECOND" /> </td></tr>
  </table>
</div>
</body>
</html>

我需要根据每个input在表中的位置来选择它。//div[@class='popupContent']//input[1],它选择第一个输入//div[@class='popupContent']//input[2],这给了错误 //div[@class='popupContent']/descendant::input[1],再次选择第一个输入//div[@class='popupContent']/descendant::input[2],选择第二个输入

使用/descendant::input可以完成我所需要的工作:获取所有输入并让我按位置选择。

//有何不同?为什么它只返回第一个元素而不返回后面的元素?

我知道另一个问题,但答案基本上说它们是别名,指向文档,我无法理解,也缺少一个具体的例子。与这个问题不同的是,我需要选择多个子元素,而//不允许这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-25 15:57:34

//X/descendant::X之间唯一的区别是当X包含位置谓词时,例如//x[1]/descendant::x[1]。在这种情况下,//x[1]选择作为父元素的第一个x子元素的每个x元素,而/descendant::x[1]则选择第一个子代x。您可以通过记住//x[1]/descendant-or-self::node()/child::x[1]的缩写来解决这个问题。

票数 4
EN

Stack Overflow用户

发布于 2015-11-25 15:23:40

根据XPath 1.0,§2.5缩写语法

///descendant-or-self::node()/的缩写

因此,div[@class='popupContent']//input[1] (与div[@class='popupContent']/descendant-or-self::node()/child::input[1]一样)将:

  1. 带着“div”类访问popupContent s的所有后代(儿童、儿童子女等等),
  2. 那就去找<input>孩子
  3. 最后选择其父级的第一个子级([1]谓词)

div[@class='popupContent']//input[2]是非常相似的,除了最后一件事是选择第二个孩子。而且没有一个<input>是他们父母的第二个孩子。

另一方面,div[@class='popupContent']/descendant::input[2]将:

  1. 带着这个类去找div的所有后代,
  2. 只选择<input>元素,并从它们中构建节点集。
  3. 最后,按文档顺序选择节点集中的第二个元素。

您可以在§2.4谓词中阅读有关谓词和轴的内容。相关部分:

(...)祖先、祖先或自我、前辈或兄弟之间的轴是反向轴;所有其他轴都是正轴.

因此,descendant是一个正轴。

节点集的成员相对于轴的接近位置被定义为节点在按文档顺序排列的节点集中的位置,如果该轴是前向轴(.)。第一个位置是1。 谓词根据轴过滤节点集以生成新的节点集.对于要过滤的节点集中的每个节点,以该节点作为上下文节点计算PredicateExpr,以节点集中的节点数目作为上下文大小,以节点集中节点相对于轴的接近位置的作为上下文位置;

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33918010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档