2

对于下面的代码示例,我需要检查一个 tr ,type="a" 并且有一个带有文本“3”作为孩子的 td ,是否存在:

<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 )。

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

4

4 回答 4

1

Alternatively, this can also be done without xpath:

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

A little bit more verbose, but I think it is easier to read than xpaths.

于 2012-12-10T14:43:26.817 回答
1

使用

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

true()当存在一个td字符串值等于数字 3 且其父tr字符串值为其type属性为“a”且其 (the tr) 是 XML 顶部元素的子元素时,此 XPath 表达式的计算结果准确无误文档。

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

于 2012-12-10T13:40:29.057 回答
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。

希望这对您有所帮助。

于 2012-12-10T10:56:26.083 回答
0
b.tr(:xpath =>"//tr[@type='a']", :index => 1).td(:text =>'3').exists?

或者

b.tr(:xpath =>"(//tr[@type='a'])[2]").td(:text =>'3').exists?
于 2012-12-10T10:14:10.883 回答