Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Xpath 1.0中使用反向引用_Xpath - Fatal编程技术网

在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