在Xpath 1.0中使用反向引用
我需要基于另一个处于相同级别的节点获取一个节点:( 以下是一个例子:在Xpath 1.0中使用反向引用,xpath,Xpath,我需要基于另一个处于相同级别的节点获取一个节点:( 以下是一个例子: <A> <B id=2> <F1>aaa</F1> <F2>bbb</F2> <F3>ccc</F3> </B> <B> .... </B> <B> .... </B> <D> <F1>aaa</F1&
<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>
aaa
bbb
ccc
....
....
aaa
bbb
ccc
yyy
...
所以我需要得到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功能
有什么想法吗?我不确定我完全理解你关于反向引用的意思,但是你想要类似的东西吗
/A/D[F1 = ../B[@id='2']/F1 and
F2 = ../B[@id='2']/F2 and
F3 = ../B[@id='2']/F3]/F4
?
在XPath1.0中,没有一种方法可以创建一个变量,然后在同一个表达式中取消引用它
for $b in A/B[@id = '2']
return A/D[F1 = $b/F1 and F2 = $b/F2 and F3 = $b/F3]/F4
但这对您没有帮助,因为您的问题是关于XPath1.0的
更新:根据您关于“在节点B上”的评论,我认为有两种可能性
一种可能性是,上下文节点是B元素,其@id是给定的id,并且您希望使用上下文节点,而不是通过其@id再次查找B。在这种情况下,您可以使用current()
:
current()
表示上下文节点,因为它位于整个XPath表达式之外
另一种可能性是,上下文节点是某个B元素,但它可能不是您已获得@id的元素,或者您不关心它是否是。在这种情况下,只需使用我上面给出的第一个XPath表达式。我只是在前面添加了
/
,这样上下文节点在文档中最初的位置就不重要了 哦,你说得对,但我忘了说我在节点B上:(这就是我寻找反向引用的原因。我已经更新了问题。是的,我只能使用Xpath 1。0@user2354384:当你说你在节点B上时,你的意思是上下文节点是B元素,它的id是给你的id吗?我会相应地编辑我的答案…是的,我的意思是我做了一些类似getB(id=2)的事情这将返回节点B。现在我需要根据问题中所述的B子值获取节点D。@user2354384:听起来您可以使用上面的第一个表达式。您只需将其构造为包含正确的id。缺点是重复。或者,如果您在XSLT中使用XPath,您可以使用current()
如上所示的最后一个表达式。但是您还没有告诉我们您的环境是XSLT还是什么。
/A/D[F1 = current()/F1 and
F2 = current()/F2 and
F3 = current()/F3]/F4