XPath根据计数查找节点
问题描述:
找到每个具有三个列表元素的div的h1s。 (source)XPath根据计数查找节点
<div>
<div class="fast">
<h1>Fast</h1>
<ul>
<li>Cars</li>
<li>New Horizon</li>
<li>Chinese Food</li>
</ul>
</div>
<div class="expensive">
<h1>Expensive</h1>
<ul>
<li>Cars</li>
<li>New Horizon</li>
<li>Apple Watches</li>
</ul>
</div>
<div class="nasa">
<h1>NASA-Owned</h1>
<ul>
<li>Lunar Module</li>
<li>New Horizon</li>
</ul>
</div>
</div>
这个工作对我来说,(但我希望能够找到简单的语法)
//ul/li[count(../li)=3]/../../h1
答
我会写
//div[count(.//li)=3]/h1
但要小心:你问的这这给你“在这三甲之列元素每格”;被接受的答案给你“每个至少包含一个无编号列表的元素,其中包含三个列表项”,这不是同一个东西,尽管它可能在这个特定的测试文档上给出相同的结果。
答
精确匹配H1在div下:
//div/h1[following-sibling::ul[count(li)=3]]
答
不能让它更短/更简单=)
//div[ul[count(li)=3]]/h1
PS。 OK,这是最后的:
//*[ul[count(li)=3]]/h1
+0
优秀的:),我认为你应该保留'div',因为它是必需的,我知道这两种情况都是正确的,但更准确的'div' :) –
+1
是的,更好的保持div =)和可维护性,甚至添加classes/id,以确保它是正确的元素),但它是最简单的配置,任何人都可以根据自己的需求进行调整) –
非常感谢您的精确提示。从逻辑的角度来看, –
仍然不行。 'div'可以放在'ul'元素的上方,如果它有'h1'则会被选中。它甚至没有ul元素) 我的意思是为了学习的目的可以写这样的定位器,但我不会建议在项目中使用它) –
我们唯一知道的要求是问题中的内容。我同意在一个真实的项目中,人们会寻求更精确的要求声明。 –