【发布时间】:2012-02-01 16:37:08
【问题描述】:
考虑以下XMLsn-p:
<doc>
<chapter id="1">
<item>
<para>some text here</para>
</item>
</chapter>
</doc>
在XQuery,我有一个函数需要根据作为参数传入的给定“para”元素的ancestor章节做一些事情,如剥离下面的例子:
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 起作用?另外,有人对如何解决这个问题有任何建议吗?
谢谢。
解决方案:
谜团现已解开。
有问题的节点是在另一个函数中重新创建的,结果是剥离了它的所有祖先信息。不幸的是,以前的开发人员没有记录这个美妙的小功能,并且花费了我们大家大量的时间。
因此,祖先轴完全按照应有的方式工作 - 它只是被应用于欺骗性节点。
感谢大家为回答我的问题所做的努力。
【问题讨论】:
标签: xpath xquery marklogic axes