我有几个模块名称空间xquery文件,这些文件在多个文件中使用过。我想在一个常见的xquery文件中包含命名空间,然后将其导入到我想使用的任何位置。

举例来说,

我有process-lib.xqyutil-lib.xqyquery-lib.xqy
我曾经将它们导入到多个文件中,如下所示,

import module namespace util = "util" at "util-lib.xqy";
import module namespace process = "process" at "process-lib.xqy";
import module namespace query = "query" at "query-lib.xqy";


现在,我尝试在一个名为common-import.xqy的通用文件中使用它们,并将该文件导入多个文件。

当我尝试这种方法时

import module namespace common-import= "common-import" at "common-import.xqy";


它将异常作为prefix util has no namespace binding抛出。

如何实现呢?

最佳答案

这是不可能的,至少不会以您想要的方式这样做,而且这样做是正确的。 XQuery spec不允许这样做:

Module imports are not transitive—that is, importing a module provides access only to function and variable declarations contained directly in the imported module. For example, if module A imports module B, and module B imports module C, module A does not have access to the functions and variables declared in module C.


这是一个故意的设计决定。如果您希望以这种方式进行访问,则可以为每个要访问的功能编写包装函数,例如在您的common-import.xqy文件中,您可以具有:

declare function common-import:test() {
  util:test()
};


但是,当然这可能需要大量的包装器功能。我建议您仅插入所有必需的库。我认为这样做没有任何好处。

07-28 08:35