如何在xquery中导入公共模块命名空间

How to import common module namespaces in xquery

我有几个在多个文件中使用的模块名称空间 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() 
};

但这当然需要大量的包装函数。我建议您坚持简单地插入所有必需的库。我认为不这样做没有任何好处。