对于下面的代码示例,我需要检查是否存在类型=“a”且具有文本“3”作为子项的td的tr:
<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?
答案 0 :(得分:1)
使用强>:
boolean(/*/tr[@type='a']/td[. = 3])
当存在true()
,其字符串值等于数字3,且父td
字符串值为{{1}时,此XPath表达式的计算结果为tr
。属性为“a”,其中(type
)是XML文档顶部元素的子元素。
否则XPath表达式的计算结果为tr
答案 1 :(得分:1)
或者,这也可以在没有xpath的情况下完成:
b.trs.count{ |tr|
tr.attribute_value('type') == 'a' and tr.td(:text, '3').present?
} > 0
稍微冗长一点,但我认为它比xpath更容易阅读。
答案 2 :(得分:0)
b.tr(:xpath =>"//tr[@type='a']", :index => 1).td(:text =>'3').exists?
或
b.tr(:xpath =>"(//tr[@type='a'])[2]").td(:text =>'3').exists?
答案 3 :(得分:0)
我不确定这是否有帮助,但是此代码返回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。
希望这会有所帮助。