XSLT2.0:将祖先轴限制在文档树上的某个元素级别

XSLT2.0:将祖先轴限制在文档树上的某个元素级别,xslt,xpath,xslt-2.0,xpath-2.0,Xslt,Xpath,Xslt 2.0,Xpath 2.0,我看到了一个非常奇怪的行为,当试图限制通过将祖先::*应用到元素所给出的结果时,我总是得到一个额外的祖先,尽管谓词明确排除了它 代码如下: XML: 所以基本上我选择了没有嵌套另一个level_d元素的level_d元素,获取最后一个元素,并尝试将所有的祖先元素添加到元素level_b。 但我使用Altova XMLSpy 2011看到的结果是: a级 b级 我不太明白为什么会得到这样的结果,以及如何改进xpath以有效地将祖先限制到级别b,即级别c和级别b 任何提示都将不胜感激! 当做 Vla

我看到了一个非常奇怪的行为,当试图限制通过将祖先::*应用到元素所给出的结果时,我总是得到一个额外的祖先,尽管谓词明确排除了它

代码如下:

XML:

所以基本上我选择了没有嵌套另一个level_d元素的level_d元素,获取最后一个元素,并尝试将所有的祖先元素添加到元素level_b。 但我使用Altova XMLSpy 2011看到的结果是:

a级 b级 我不太明白为什么会得到这样的结果,以及如何改进xpath以有效地将祖先限制到级别b,即级别c和级别b

任何提示都将不胜感激! 当做 Vlax

井祖先:*[level|c | level|b]选择祖先轴上具有level|c或level|b子级的所有元素

您可能需要//level_d[notlevel_d][last]/祖先::*[self::level_c | self::level_b]

或者通过文本描述有效地将祖先限制在级别b,您只需要//级别d[非级别d][last]/祖先::级别b。

好的祖先:*[级别c |级别b]选择祖先轴上具有级别c或级别b子级的所有元素

您可能需要//level_d[notlevel_d][last]/祖先::*[self::level_c | self::level_b]


或者通过您的文本描述将祖先有效地限制在级别b,您只需要//级别d[notlevel d][last]/祖先::级别b。

我认为您得到了正确的结果,因为子句祖先:*[level c | level b]我理解为包含元素级别b或级别c的所有祖先。所以,b级是可以的,因为它包含c级,a级也是可以的,因为它包含b级

因此,如果我将您的XPath更改为//level\u d[notlevel\u d][last]/祖先::*[level\u c],则结果仅为level\u b


可能这并不完全是你想要的,但我不确定我是否理解你的XPath的目的:-

我认为你得到了正确的结果,因为子句祖先:*[level_c | level_b]我理解为所有包含元素level_b或level_c的祖先。所以,b级是可以的,因为它包含c级,a级也是可以的,因为它包含b级

因此,如果我将您的XPath更改为//level\u d[notlevel\u d][last]/祖先::*[level\u c],则结果仅为level\u b


可能这并不完全是您想要的,但我不确定我是否理解您的XPath的用途:-

谢谢!第一个建议正是我想要的。我将更正我试图实现的目标的描述,因为它不准确。谢谢!第一个建议正是我想要的。我将更正我试图实现的目标的描述,因为它不准确。谢谢你的回答,它正朝着这个方向发展@马丁说得对。谢谢你的回答,这是正确的@马丁说对了。
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <level_a> 
    <level_b> 
      <level_c> 
        <level_d> 
          <level_e/> 
        </level_d> 
      </level_c> 
    </level_b> 
  </level_a>
  <level_b> 
    <level_c> 
      <level_d> 
        <level_d> 
          <level_e/> 
        </level_d> 
      </level_d> 
    </level_c> 
  </level_b>
</root>
(//level_d[not(level_d)])[last()]/ancestor::*[level_c|level_b]