带有层次结构中可选元素的XPath

时间:2011-01-06 03:30:09

标签: html xpath

在这个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表达式?

要明确,我不是要解决现实问题或选择特定文档的特定元素。我正在寻求解决一类问题的技巧。

3 个答案:

答案 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

JDK-6357433

管道(|)表示XPathTester.com demo(两个节点集),union.)表示身份步骤(返回上一步所做的) )。

这可以扩展为包含更多可选元素:

//table[@id="foo"]/(thead|tbody|tfoot|.)/tr