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

问题描述:

我发现这个问题有很多类似的帖子,但没有回答这个具体问题。我必须使用XPath 1.0。我没有XSLT(或XQuery或其他任何东西),我不能使用XPath 2.0。我从一个软件(Arbortext Styler)中执行这个XPath,我可以使用XPath 1.0从其他节点中选择内容,但是在这种情况下XSLT不可用。另外,我无法控制源XML的结构。XPath 1.0:使用当前节点的父节点的属性值来查找另一个匹配的节点

当我在<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> 

我需要的是这样的事情,但没有电流()函数,它不是由软件应用程序支持:

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

或者这样的事情,但没有对回报声明:

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完成?请注意,程序的位置不能被硬编码。重复参考可以在任何位置出现多次。此外,这个匹配要求与<step>的起始上下文完成。

我怀疑我的问题的答案是,它不能完成,但我知道如果可以做到,这是找到答案的地方!预先感谢所有考虑这个问题的人。

这个帖子是相似的,但搜索一直在寻找启动背景下的孩子: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

有什么建议?

+0

我应该补充一点,我发现很多用XSLT(和其他语言)或XPath 2.0解决这些问题的帖子,但这不是纯粹用XPath 1.0来回答的。谢谢! –

+2

你运气不好。这不能在XPath 1.0中完成,因为在谓词中没有办法引用与谓词所属节点不同的节点。毕竟,这是'current()'的问题,并且变量在XSLT中解决。 – Tomalak

+0

感谢@Tomalak,以确认我已经怀疑的事情。 –

正如Tomalak和Honza Hejzl所建议的那样,XPath 1.0无法做到这一点。感谢您的反馈。