XSLT2.0:将祖先轴限制在文档树上的某个元素级别
我看到了一个非常奇怪的行为,当试图限制通过将祖先::*应用到元素所给出的结果时,我总是得到一个额外的祖先,尽管谓词明确排除了它 代码如下: 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]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
或者通过您的文本描述将祖先有效地限制在级别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]