我正在尝试使用XPath / XSLT从XHTML获取表行。我的示例xhtml看起来像这样:
<body>
<....>
<table>
<tbody>
<tr>
<td/>
<td/>
<td>
<table>
<tr>
<....>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</body>
在上述结构中,<tbody>
可能存在也可能不存在。表可以嵌套到任何级别。现在我想获取给定表的所有行。因此,当我处理外部表时,我想只获取外部行(一个包含3个tds)而不是内部tr(在嵌套表中)。我怎么能用XSLT或XPath做到这一点?
编辑:我基本上寻找的是一种获取节点x的所有后代:: y的方法,但是y不应该是另一个 x的后代。来自x-> y的路径不应包含另一个x。我可能没有任何区别外部x和内部x的东西。
注意:我正在尝试使用许多HTML,这些HTML都具有不同的结构,我无法更改任何HTML文件的结构 - 它是给我的。唯一的问题是它们都是格式良好的XHTML。
感谢您的帮助。
答案 0 :(得分:2)
以下表达式选择任何tr
元素的table
个元素,这些元素没有table
作为祖先(即最外面的表),可能有也可能没有一个tbody
元素:
//table[not(ancestor::table)]/tbody/tr|//table[not(ancestor::table)]/tr
这是两个单独表达式的并集,一个在tbody
存在时选择正确的元素,另一个在不存在时选择正确的元素。
答案 1 :(得分:0)
我基本上寻找的是一种获得所有的方式
descendant::y
用于节点x
,但y
不应是其后代 另一个x
。
假设$ n是名为x
的元素。你想要:
$n//y[count(ancestor::x) = count($n/ancestor-or-self::x)]
这将选择$ n后代的所有y
,其中x
个祖先的数量正好比$ n的祖先:: x的数量大一些。
由于$n
包含x
元素,这意味着对于所有选定的y
,x
中包含的$n
是他们的第一个ancestor::x
出于实际目的,您只需将上面的$n
替换为选择其包含的x
元素的确切XPath表达式。