如何使用XSLT获取嵌套HTML表的行

时间:2012-01-23 17:52:24

标签: xslt xpath

我正在尝试使用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。

感谢您的帮助。

2 个答案:

答案 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元素,这意味着对于所有选定的yx中包含的$n是他们的第一个ancestor::x

出于实际目的,您只需将上面的$n替换为选择其包含的x元素的确切XPath表达式。