XPath 1.0:使用当前节点的父节点的属性值来寻找另一个匹配的节点

Posted

技术标签:

【中文标题】XPath 1.0:使用当前节点的父节点的属性值来寻找另一个匹配的节点【英文标题】:XPath 1.0: Use the attribute value of the current node's parent to find another matching node 【发布时间】:2016-03-07 17:55:11 【问题描述】:

我找到了许多与此问题类似的帖子,但没有任何内容可以回答这个特定问题。我必须使用 XPath 1.0。我没有可用的 XSLT(或 XQuery 或其他任何东西),也无法使用 XPath 2.0。我正在从一个软件 (Arbortext Styler) 内部执行此 XPath,我可以在其中使用 XPath 1.0 从其他节点选择内容,但 XSLT 在此上下文中不可用。另外,我无法控制源 XML 的结构。

当我在<step> 的上下文中时,我需要能够匹配上一个过程/任务/步骤,该步骤的父过程与当前过程的@ref 和@seq 匹配并且具有字母“A”作为@conf 的值。

<document>
  <topic>
    <procedure ref="056" seq="01" conf="A">
      <task>
        <step>1. Blah Blah (056-01-A)</step>
      </task>
    </procedure>
    <procedure ref="057" seq="02" conf="A">
      <task>
        <step>2. Blah blah (057-02-A)</step>
      </task>
    </procedure>
    <procedure ref="057" seq="02" conf="B">
        <task>
            <step>2. Blah blah (057-02-B)</step>
        </task>
    </procedure>
    <procedure ref="057" seq="03" conf="A">
        <task>
            <step>3. Blah blah (057-02-A)</step>
        </task>
    </procedure>
  </topic>
</document>

我需要的是这样的东西,但没有软件应用程序不支持的 current() 函数:

//procedure[@ref=current()/ancestor::procedure/@ref and @seq=current()/ancestor::procedure/@seq and @conf='A']/task/step

或类似的东西,但没有 for in return 语句:

for $ref in ancestor::procedure/@ref, $seq in ancestor::procedure/@seq return //topic/procedure[@ref=$ref and @seq=$seq and @conf='A']/task/step/text()

对于如何完全使用 XPath 1.0 来实现这一点,有人有什么建议吗?请注意,程序的位置不能硬编码。重复的 refs 可以在任何位置多次出现。此外,此匹配要求以&lt;step&gt; 的起始上下文完成。

我怀疑我的问题的答案是无法做到,但我知道如果可以做到,这里就是找到答案的地方!提前感谢所有考虑这个问题的人。

这篇文章很相似,但搜索的是寻找起始上下文的孩子:Xpath Getting All Nodes that Have an Attribute that Matches Another Node

这也很有趣,但我的属性值不是 ID:Xpath: find an element value from a match of id attribute to id anchor

有什么建议吗?

【问题讨论】:

我应该补充一点,我发现很多帖子都用 XSLT(和其他语言)或 XPath 2.0 解决了这个问题,但并不是纯粹用 XPath 1.0 回答了这个问题。谢谢! 你运气不好。这不能在 XPath 1.0 中完成,因为在谓词内部没有办法引用与谓词所属的节点不同的节点。毕竟,这正是current() 和变量在 XSLT 中解决的问题。 感谢@Tomalak,确认了我已经怀疑的内容。 让它打开一段时间,等待第二次确认我们确实是对的。 在我尽力做到最好之前,请先澄清一下。如果您需要匹配先前的过程/任务/步骤,该步骤的父过程匹配当前过程的 @ref@seq 并且具有 字母“A”作为@conf的值,恐怕你一开始就迷路了,因为示例中没有两个这样的程序。我在这里错过了什么吗? 【参考方案1】:

正如 Tomalak 和 Honza Hejzl 所建议的,这不能用 XPath 1.0 完成。感谢您的反馈。

【讨论】:

以上是关于XPath 1.0:使用当前节点的父节点的属性值来寻找另一个匹配的节点的主要内容,如果未能解决你的问题,请参考以下文章

使用 XPath,如何根据节点的文本内容和属性值来选择节点?

XPath的使用

XPath语法

使用XPath

XPath使用总结

XPath如何定位dom节点