查找具有以下属性的元素:特定属性和具有特定文本的子元素

问题描述:

对于下面的代码示例,我需要检查tr,type =“a”并且td具有文本“3”作为孩子,存在:查找具有以下属性的元素:特定属性和具有特定文本的子元素

<table> 
    <tr type="a"> 
    <td>1</td> 
    </tr> 
    <tr type="b"> 
    <td>1</td> 
    </tr> 
    <tr type="a"> 
    <td>3</td> 
    </tr> 
</table> 

尝试这样:

b.tr(:xpath =>"//tr[@type='a']").td(:text =>'3').exists? 

,但它不工作(在xpath表达式返回只有2现有的第一TR)。

任何想法? 是否有一个xpath表达式,如果我需要tr存在,将返回true?

或者,这也可以不用做的XPath:

b.trs.count{ |tr| 
    tr.attribute_value('type') == 'a' and tr.td(:text, '3').present? 
} > 0 

一点点更详细的,但我认为这是很容易,XPath的阅读。

+0

完美的作品!谢谢。 – MichaelR

b.tr(:xpath =>"//tr[@type='a']", :index => 1).td(:text =>'3').exists? 

b.tr(:xpath =>"(//tr[@type='a'])[2]").td(:text =>'3').exists? 
+0

不知道你为什么使用索引..? 这只是一个代码的例子,我不知道我在找什么即将索引2 – MichaelR

那么我不知道如果这有助于但是这个代码返回多少元素的计数的XPath表达式的回报,这样你就可以检查次数为0,那么不匹配,否则它会返回匹配的数量:

var doc = document.evaluate("//table/tbody/tr[@type='a']/td[text()=1]",document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); 
doc.snapshotLength 

var doc = document.evaluate("//table[@id='tableId']/tbody/tr[@type='a']/td[text()=1]",document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); 
doc.snapshotLength 

如果您的表有一个ID。

希望这有助于任何方式。

使用

boolean(/*/tr[@type='a']/td[. = 3]) 

这个XPath表达式评估为true()存在什么时候一个td其字符串值等于数量3,并且具有母体tr其的字符串值type属性是“a”,哪个(tr)是XML文档的顶层元素的子元素。

否则XPath表达式的计算结果为false()

+0

@MichaelR,不客气。 –