xPath / HTML:根据相关节点选择节点

时间:2009-12-28 09:16:53

标签: html xpath

<html>
    <body>
        <table>
            <tr>
                <th>HeaderA</th>
                <th>HeaderB</th>
                <th>HeaderC</th>
                <th>HeaderD</th>
            </tr>
            <tr>
                <td>ContentA</td>
                <td>ContentB</td>
                <td>ContentC</td>
                <td>ContentD</td>
            </tr>
         </table>
    </body>
</html>

我正在寻找最有效的方法来根据相应的“ th ”节点中的标题选择内容“ td ”节点。

我当前的xPath表达式..

/html/body/table/tr/td[count(/html/body/table/tr/th[text() = 'HeaderA']/preceding-sibling::*)+1]

有些问题..

  • 您可以在../..内使用相对路径(count())吗?
  • 有哪些其他选项可以找到当前节点号td[?]count(/preceding-sibling::*)+1最有效?

4 个答案:

答案 0 :(得分:3)

  • 可以在count()
  • 中使用相对路径
  • 我从未听说过另一种寻找节点号的方法......

这是在count()

中包含相对xpath代码的代码
/html/body/table/tr/td[count(../../tr/th[text()='HeaderC']/preceding-sibling::*)+1]

但是,它不会短得多......在我看来,它不会比这短:

//td[count(../..//th[text()='HeaderC']/preceding-sibling::*)+1]

答案 1 :(得分:2)

Harmen的答案正是您对纯XPATH解决方案所需要的。

如果您 真的关注效果,那么您可以定义XSLT key

<xsl:key name="columns" match="/html/body/table/tr/th" use="text()"/>

然后在谓词过滤器中使用

/html/body/table/tr/td[count(key('columns', 'HeaderC')/preceding-sibling::th)+1]

但是,我怀疑你可能无法看到性能上可测量的差异,除非你需要对列进行大量过滤(例如 for-each 循环,检查每一行是否为真的很大的文件)。

答案 2 :(得分:1)

我会把Xpath放在一边...因为我假设它是DOM解析的,我会使用Map数据结构,并手动匹配客户端或服务器端(JavaScript / Java)中的节点。

在我看来XPath正在超越它的极限。

答案 3 :(得分:0)

也许你想要position()和XPath轴?