查找具有以下属性的元素:特定属性和具有特定文本的子元素
对于下面的代码示例,我需要检查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的阅读。
b.tr(:xpath =>"//tr[@type='a']", :index => 1).td(:text =>'3').exists?
或
b.tr(:xpath =>"(//tr[@type='a'])[2]").td(:text =>'3').exists?
不知道你为什么使用索引..? 这只是一个代码的例子,我不知道我在找什么即将索引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()
@MichaelR,不客气。 –
完美的作品!谢谢。 – MichaelR