Ale*_*gna 6 xpath parent-child
我无法清楚地理解使用//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>
Run Code Online (Sandbox Code Playgroud)
我需要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我需要的东西:抓住所有输入,让我按位置选择.
怎么不一样//?为什么它只返回第一个元素而不是之后的元素?
我知道这个问题,但答案基本上说它们是别名并指向文档,我无法理解,缺乏一个具体的例子.
pau*_*rth 11
//是的缩写/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和那个班级一起去看s的所有后代,<input>元素,并建立一个设定节点出它们中的您可以在§2.4Predicates中阅读有关谓词和轴的内容.相关部分:
(...)祖先,祖先或自我,先前和前兄弟轴是反向轴; 所有其他轴都是前轴.
[因此descendant是一个前轴.]
如果轴是前轴(...),则节点集的成员相对于轴的接近位置被定义为以文档顺序排序的节点集中的节点的位置.第一个位置是1.
谓词过滤相对于轴的节点集以产生新的节点集.对于要过滤的节点集中的每个节点,
PredicateExpr使用该节点作为上下文节点评估,节点集中的节点数作为上下文大小,并且节点中节点的接近位置 -相对于轴设置为上下文位置 ;
//X和之间的唯一区别/descendant::X是当 X 包含位置谓词时,例如//x[1]vs /descendant::x[1]。在这种情况下,//x[1]选择作为其父元素的x第一个子元素的每个元素,而选择整体的第一个后代 x。你可以通过记住它的缩写来解决这个问题x/descendant::x[1]//x[1]/descendant-or-self::node()/child::x[1]
| 归档时间: |
|
| 查看次数: |
3259 次 |
| 最近记录: |