我需要获得一个基于另一个节点的节点:(
以下是一个例子:
<A>
<B id=2>
<F1>aaa</F1>
<F2>bbb</F2>
<F3>ccc</F3>
</B>
<B>
....
</B>
<B>
....
</B>
<D>
<F1>aaa</F1>
<F2>bbb</F2>
<F3>ccc</F3>
<F4>yyy</F4>
</D>
<D>
...
</D>
</A>
所以我需要得到A / D / F4,其中A / D / F1 = A / B [@ id = 2] / F1和A / D / F2 = A / B [@ id = 2] / F2 A / d / F3 = A / B [@ ID = 2] / F3
我只有id来执行查询,我得到节点B作为起点(由其他内部代码返回)。我正在考虑一种方法来获取路径中节点的后向引用,这意味着我可以使用类似的东西:
/ A / B [@ id = 2] /../ D [F1 = Bref / F1和F2 = Bref / F2和F3 = Bref / F3] / F4
我正在尝试不手动构建连接,并尽可能仅使用Xpath功能。
有什么想法吗?
答案 0 :(得分:1)
我不确定我完全明白你对反向引用的意思,但是你想要像
这样的东西吗?/A/D[F1 = ../B[@id='2']/F1 and
F2 = ../B[@id='2']/F2 and
F3 = ../B[@id='2']/F3]/F4
在XPath 1.0中,没有办法创建变量,然后在同一个表达式中取消引用它。在XPath 2.0中,您可以使用
for $b in A/B[@id = '2']
return A/D[F1 = $b/F1 and F2 = $b/F2 and F3 = $b/F3]/F4
但那&#39;不会帮助你,因为你的问题是关于XPath 1.0。
更新:根据您在节点B&#34;上的评论,我看到了两种可能性。
一种可能性是上下文节点是B元素,其中@id是您已经给出的id,并且您想要使用上下文节点而不是再次通过其@id查找B.在这种情况下,您可以使用current()
:
/A/D[F1 = current()/F1 and
F2 = current()/F2 and
F3 = current()/F3]/F4
current()
表示上下文节点,因为它在整个XPath表达式之外。
另一种可能性是上下文节点是某个B元素,但它可能不是你给出的@id,或者你不关心它是否是。在这种情况下,只需使用我上面给出的第一个XPath表达式。我刚刚在前面添加了/
,因此上下文节点最初在文档中的位置并不重要。