我有几个模块名称空间xquery文件,这些文件在多个文件中使用过。我想在一个常见的xquery文件中包含命名空间,然后将其导入到我想使用的任何位置。
举例来说,
我有process-lib.xqy
,util-lib.xqy
和query-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()
};
但是,当然这可能需要大量的包装器功能。我建议您仅插入所有必需的库。我认为这样做没有任何好处。