在选择//element中的基元素的多个子元素时,我不能清楚地理解使用/descendant::element和XPath的区别。
给定这个HTML片段
<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可以完成我所需要的工作:获取所有输入并让我按位置选择。
//有何不同?为什么它只返回第一个元素而不返回后面的元素?
我知道另一个问题,但答案基本上说它们是别名,指向文档,我无法理解,也缺少一个具体的例子。与这个问题不同的是,我需要选择多个子元素,而//不允许这样做。
发布于 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]的缩写来解决这个问题。
发布于 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]一样)将:
div”类访问popupContent s的所有后代(儿童、儿童子女等等),<input>孩子[1]谓词)div[@class='popupContent']//input[2]是非常相似的,除了最后一件事是选择第二个孩子。而且没有一个<input>是他们父母的第二个孩子。
另一方面,div[@class='popupContent']/descendant::input[2]将:
div的所有后代,<input>元素,并从它们中构建节点集。您可以在§2.4谓词中阅读有关谓词和轴的内容。相关部分:
(...)祖先、祖先或自我、前辈或兄弟之间的轴是反向轴;所有其他轴都是正轴.
因此,descendant是一个正轴。
节点集的成员相对于轴的接近位置被定义为节点在按文档顺序排列的节点集中的位置,如果该轴是前向轴(.)。第一个位置是1。 谓词根据轴过滤节点集以生成新的节点集.对于要过滤的节点集中的每个节点,以该节点作为上下文节点计算
PredicateExpr,以节点集中的节点数目作为上下文大小,以节点集中节点相对于轴的接近位置的作为上下文位置;
https://stackoverflow.com/questions/33918010
复制相似问题