如何在xquery中导入通用模块名称空间

时间:2015-10-29 10:38:13

标签: xquery marklogic

我有几个模块命名空间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

如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

这是不可能的,至少不是你想要的方式,这是正确的。 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() 
};

但当然这可能需要大量的包装函数。我建议你坚持插入所有必需的库。我认为没有其他好处。