使用XPath查找特定祖父母的第一个孩子?

时间:2012-07-01 21:42:46

标签: xpath

我正在处理一些粗糙的HTML。这是给定元素的祖先的程式化示例:

/html/body/foo/bar/baz/quux/b

我在代码中引用了bodyb是我的XPath查询的上下文元素。在上面的示例中,如何找到foo?更具描述性的是,我如何找到给定祖先中的第一个元素,它是另一个给定元素的子元素? bodyb之间的元素是未知的,并且在运行时的类型和深度上有所不同。我可以通过迭代来自b的祖先直到我到达body来在XPath之外执行此操作,但我想知道是否有一些XPath祖先魔法来找到这个相对引用。

2 个答案:

答案 0 :(得分:2)

如果不进行测试,我猜测ancestor::body/*[1]可能会这样做。

说明:ancestor::bodybody'轴'上的第一个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