1

目前,我通过外部变量将 2 个数据库的名称提供给我的主 xql 文件。我想将这些值传递给我的任何 XQL 模块。

例如,我可以有一个主脚本导入模块“mylib”

     import module namespace mylib = "http://example.org/mylib" at "myLib.xqm";

     declare variable $dbName external; 

     $mylib:print()

然后我用 dbName 外部变量提供主脚本,它可以工作,但我想以某种方式将它传递给我的模块

     module namespace mylib = "http://example.org/mylib";

     declare variable $mylib:dbName external;

     declare function mymod:print() as xs:string  {
         $mymod:dbName
     };

如何将本地 dbName 的值绑定到模块的实例 $myLib:dbName?

我试过了 :

  • 使主文件中的变量成为全局变量,以便任何导入的模块都可以读取它们
  • 在模块中声明相同的变量并尝试从主类中分配它们,例如声明变量 $mylib:dbname := $dbname
  • 将模块变量声明为外部唯一,在我的主脚本中从它们中获取值,然后尝试从那里读取它

任何明显简单的解决方案?或者我是否必须为任何模块静态定义相同的值?

4

2 回答 2

1

Why not pass it as an argument to the functions?

mymod:print($dbname)
于 2012-09-24T23:10:20.503 回答
0

如果您的 XQuery 处理器允许带有参数占位符的部分应用程序,您可以在映射中返回一组方法,这些方法已经将$dbname参数绑定到它们。

示例模块

xquery version "3.1";

module namespace mymod = "http://example.org/mymod";

declare function mymod:print ($dbname as xs:string) as xs:string  {
    $dbname
};

declare function mymod:items-by-name ($dbname as xs:string, $names as xs:string*) as xs:string  {
    collection($dbname)//item[@name = $names]
};

declare function mymod:get-bound-methods ($dbname as xs:string) as map(*) {
    map {
        (: return result of a function :)
        "print": mymod:print($dbname),
        (: return partially applied function:)
        "items-by-name": mymod:items-by-name($dbname, ?) 
    }
};

用法

import module namespace mymod = "http://example.org/mymod" at "mymod.xqm";

declare variable $dbName external; 

declare variable $local:bound := mymod:get-bound-methods($dbName);

(: print evaluates to a xs:string :)
$local:bound?print,
(: items-by-name evaluates to a function with an arity of 1 :)
$local:bound?items-by-name("a"),
$local:bound?items-by-name(("a", "sequence", "of", "names"))

于 2020-09-10T11:51:33.197 回答