如何使用XPath的preceding轴选取table标签前的最远p标签(若无第二个则选第一个)
嘿,我来帮你搞定这个XPath的问题!
解决方法:选取每个table前最远的p标签
首先得搞懂XPath里preceding轴的节点顺序——它是逆文档顺序返回节点的,意思是离当前节点最近的节点会排在结果列表的最前面。比如第一个<table>的preceding::p会先返回<p>paragraph 2</p>,再返回<p>paragraph 1</p>。
你要找的是每个table前面最远的p(也就是文档里最早出现的那个p),对应到preceding轴的结果列表里,就是列表的最后一个元素。所以只需要把你的表达式改成:
//table/preceding::p[last()]
为什么这个表达式能满足需求?
- 对于第一个
<table>,它的preceding::p有两个节点:paragraph 2(索引1)、paragraph 1(索引2),[last()]会选中索引2的节点,正好是你要的paragraph 1。 - 对于第二个
<table>,它的preceding::p只有一个节点:paragraph 1,[last()]自然会选中它,完全符合预期。
为什么之前的尝试没成功?
//table/preceding::p[1]:选中的是每个table前最近的p,所以第一个table会拿到paragraph 2,不符合你要最远p的需求。//table/preceding::p[1 or 2]:会把所有符合条件的p都选出来,也就是两个区块里的三个p,范围太宽泛。//table/preceding::p[2]:只有第一个table存在第二个preceding的p,第二个table没有匹配结果,会漏掉你需要的第二个paragraph 1。
如果你的HTML结构是严格的h4 → p(s) → table区块结构,上面的简单表达式就够用了。要是需要确保p和table在同一个h4区块里(避免跨区块选取),可以用更严谨的版本:
//table/preceding::p[not(preceding::h4[following::table[1] = current()])][last()]
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

