如何在xquery中导入公共模块命名空间
How to import common module namespaces in xquery
我有几个在多个文件中使用的模块名称空间 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()
};
但这当然需要大量的包装函数。我建议您坚持简单地插入所有必需的库。我认为不这样做没有任何好处。
我有几个在多个文件中使用的模块名称空间 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()
};
但这当然需要大量的包装函数。我建议您坚持简单地插入所有必需的库。我认为不这样做没有任何好处。