【问题标题】:Using back references with Xpath 1.0在 Xpath 1.0 中使用反向引用
【发布时间】:2014-10-07 04:10:10
【问题描述】:

我需要基于另一个处于同一级别的节点获取一个节点:(

这是一个例子:

<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 and F2=Bref/F2 and F3=Bref/F3]/F4

我正在尝试不手动构建连接,并且尽可能仅使用 Xpath 功能。

有什么想法吗?

【问题讨论】:

    标签: xpath


    【解决方案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
    

    但这对您没有帮助,因为您的问题是关于 XPath 1.0。

    更新:根据您“在节点 B 上”的评论,我看到了两种可能性。

    一种可能性是上下文节点是 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 表达式。我只是在前面添加了/,这样上下文节点最初在文档中的哪个位置并不重要。

    【讨论】:

    • 哦,你说得对,但我忘了说我在节点 B 上 :( 这就是我在寻找反向引用的原因。我已经更新了问题。是的,我可以使用只有 Xpath 1.0
    • @user2354384:当您说您在节点 B 上时,您的意思是上下文节点是 B 元素,其 id 是您获得的 id?我会相应地编辑我的答案...
    • 是的,我的意思是我执行 getB(id=2) 之类的操作,它返回节点 B。现在我需要根据问题中所述的 B 子值获取节点 D。
    • @user2354384:听起来你可以使用上面的第一个表达式。您只需要构建它以包含正确的 id。缺点是重复。或者,如果您在 XSLT 中使用 XPath,则可以使用 current(),如上面显示的最后一个表达式。但是您还没有告诉我们您的环境是 XSLT 还是什么。
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2014-03-13
    • 2018-10-25
    相关资源
    最近更新 更多