在这个Stack Overflow answer中,你需要选择一个特定的表,然后选择它的所有行。由于HTML的允许性,以下所有三个都是合法标记:
<table id="foo"><tr>...</tr></table>
<table id="foo"><tbody><tr>...</tr></tbody></table>
<table id="foo"><tr>...</tr><tbody><tr>...</tr></tbody></table>
您担心嵌套在表中的表,因此不希望使用类似
的XPath
table[@id="foo"]//tr
。
如果您可以将所需的XPath指定为正则表达式,它可能类似于:
table[@id="foo"](/tbody)?/tr
通常,如何指定允许选择器层次结构中的可选元素的XPath表达式?
要明确,我不是要解决现实问题或选择特定文档的特定元素。我正在寻求解决一类问题的技巧。
答案 0 :(得分:21)
我不明白为什么你不能用这个:
//table[@id='foo']/tr|//table[@id='foo']/tbody/tr
如果你想要一个没有节点集联合的表达式:
//tr[(.|parent::tbody)[1]/parent::table[@id='foo']]
答案 1 :(得分:7)
使用强>:
//table[@id="foo"]/*[self::tbody or self::thead or self::tfoot]/tr
|
//table[@id="foo"]/tr
选择具有tr
属性“foo”的任何table
的子项的任何id
元素或任何tr
元素,该元素是{tbody
的子元素1}}这是一个孩子table
。
答案 2 :(得分:5)
在XPath 2.0中,可选步骤可以表示为(tbody|.)
。
//table[@id="foo"]/(tbody|.)/tr
管道(|
)表示XPathTester.com demo(两个节点集),union(.
)表示身份步骤(返回上一步所做的) )。
这可以扩展为包含更多可选元素:
//table[@id="foo"]/(thead|tbody|tfoot|.)/tr