使用Xpath 1.0的后引用

时间:2014-08-13 17:14:21

标签: xpath

我需要获得一个基于另一个节点的节点:(

以下是一个例子:

<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功能。

有什么想法吗?

1 个答案:

答案 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表达式。我刚刚在前面添加了/,因此上下文节点最初在文档中的位置并不重要。