考虑以下XML
代码段:
<doc>
<chapter id="1">
<item>
<para>some text here</para>
</item>
</chapter>
</doc>
在XQuery
中,我有一个函数需要根据作为参数传入的给定“para”元素的祖先章节做一些事情,如下面的精简示例所示:
declare function doSomething($para){
let $chapter := $para/ancestor::chapter
return "some stuff"
};
在那个例子中,$chapter一直是空的。但是,如果我编写类似于以下的函数(即,不使用祖先轴),我会得到所需的“章节”元素:
declare function doSomething($para){
let $chapter := $para/../..
return "some stuff"
};
问题是我不能像后一个示例中那样使用显式路径,因为XMl
我将搜索的不能保证每次都将“章节”元素作为祖父母。可能是曾祖父母或曾曾祖父母,以此类推,如下图:
<doc>
<chapter id="1">
<item>
<subItem>
<para>some text here</para>
</subItem>
</item>
</chapter>
</doc>
有没有人解释为什么轴不起作用,而显式 XPath 起作用?另外,有没有人对如何解决这个问题有任何建议?
谢谢你。
解决方案:
现在谜团解开了。
有问题的节点是在另一个函数中重新创建的,结果是剥离了它的所有祖先信息。不幸的是,以前的开发人员没有记录这个美妙的小功能,并且花费了我们所有人的大量时间。
所以,祖先轴完全按照它应该的方式工作——它只是被应用于一个欺骗性的节点。
我感谢大家为回答我的问题所做的努力。