2

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

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

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

4

2 回答 2

2

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

解释:ancestor::bodybody沿ancestor“轴”的第一个元素,选择该元素的/*所有子元素,并[1]选择该子元素列表的第一个元素,在本例中为foo.

于 2012-07-01T21:49:47.700 回答
2

使用

ancestor::body[1]/foo

this 选择作为上下文节点body的第一个祖先的第一个元素子元素的元素。body

即使您知道没有嵌套body元素,上面的代码也比

ancestor::body/foo

因为评估最后一个表达式,所有祖先都将被测试为body.

更新

在评论中,OP澄清了:

好吧,我试图找到这两组的交集(上下文节点的祖先,身体的孩子)

在 XPath 1.0 中,这是 q 直接代入著名的节点集交集 Kayessian 公式

$ns1[count(.|$ns2) = count($ns2)]

在这种情况下,我们$ns1ancestor::*和 $ns2 替换/*/body/*

ancestor::*[count(. | /*/body/*) = count(/*/body/*)]

在 XPath 2.0 中,这更容易,使用intersect操作符

ancestor::* intersect /*/body/*
于 2012-07-01T22:23:37.910 回答