我正在处理一些粗糙的HTML。这是给定元素的祖先的程式化示例:
/html/body/foo/bar/baz/quux/b
我在代码中引用了body
,b
是我的XPath查询的上下文元素。在上面的示例中,如何找到foo
?更具描述性的是,我如何找到给定祖先中的第一个元素,它是另一个给定元素的子元素? body
和b
之间的元素是未知的,并且在运行时的类型和深度上有所不同。我可以通过迭代来自b
的祖先直到我到达body
来在XPath之外执行此操作,但我想知道是否有一些XPath祖先魔法来找到这个相对引用。
答案 0 :(得分:2)
如果不进行测试,我猜测ancestor::body/*[1]
可能会这样做。
说明:ancestor::body
是body
'轴'上的第一个ancestor
元素,/*
选择该元素的所有子元素,[1]
选择该子列表的第一个元素,在本例中为foo
。
答案 1 :(得分:2)
使用强>:
ancestor::body[1]/foo
这将选择作为上下文节点的第一个祖先body
的{{1}}的第一个元素子元素。
即使你知道没有嵌套的body
元素,上面的效率也比稍高一些:
body
因为评估最后一个表达式,所有祖先将被测试为ancestor::body/foo
。
<强>更新强>:
在评论中,OP澄清道:
好吧,我正试图找到两组的交集(祖先 上下文节点,身体的孩子)
在XPath 1.0中,这是q直接替换为着名的Kayessian公式中的节点集交集:
body
在这种情况下,我们将$ns1[count(.|$ns2) = count($ns2)]
替换为$ns1
,将$ ns2替换为ancestor::*
:
/*/body/*
在XPath 2.0中,使用ancestor::*[count(. | /*/body/*) = count(/*/body/*)]
运算符更容易:
intersect