<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
最有效?答案 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轴?