XPath根据计数查找节点

XPath根据计数查找节点

问题描述:

找到每个具有三个列表元素的div的h1s。 (sourceXPath根据计数查找节点

<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 

但要小心:你问的这这给你“在这三甲之列元素每格”;被接受的答案给你“每个至少包含一个无编号列表的元素,其中包含三个列表项”,这不是同一个东西,尽管它可能在这个特定的测试文档上给出相同的结果。

+0

非常感谢您的精确提示。从逻辑的角度来看, –

+0

仍然不行。 'div'可以放在'ul'元素的上方,如果它有'h1'则会被选中。它甚至没有ul元素) 我的意思是为了学习的目的可以写这样的定位器,但我不会建议在项目中使用它) –

+0

我们唯一知道的要求是问题中的内容。我同意在一个真实的项目中,人们会寻求更精确的要求声明。 –

试图实现如下following-sibling axis语法:

//h1[following-sibling::ul[count(li)=3]] 
+0

非常有用的链接,非常感谢你:) –

精确匹配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,以确保它是正确的元素),但它是最简单的配置,任何人都可以根据自己的需求进行调整) –