【问题标题】:How can I feed an Xquery module with a global variable from main script?如何从主脚本中为 Xquery 模块提供全局变量?
【发布时间】:2012-07-12 11:24:07
【问题描述】:

目前我通过外部变量将 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
  • 将模块变量声明为外部唯一,在我的主脚本中从它们中获取值,然后尝试从那里读取它

对此有任何明显简单的解决方案吗?还是我必须为任何模块静态定义相同的值?

【问题讨论】:

    标签: css xml xpath xquery saxon


    【解决方案1】:

    为什么不把它作为参数传递给函数呢?

    mymod:print($dbname)
    

    【讨论】:

    • 因为然后必须将它传递给所有方法,我想知道是否有一个 easz waz,特别是如果我想要一些像内部静态变量这样的 szncroniyatioon
    【解决方案2】:

    如果您的 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"))
    
    

    【讨论】:

    • 我有类似的问题:我想将一个外部变量(称为'x')从主模块传递到子模块。子模块使用这个外部变量('x')来构建一个全局变量,所以我不能将值('x')作为参数发送。有没有办法做到这一点?
    • Xquery 没有真正的全局变量。它们始终是本地模块。但是,如果这对您的用例来说足够了,您可以修改 declare variable $local:bound := mymod:get-bound-methods($dbName); 以仅返回修改后的值而不是地图。
    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2021-12-14
    • 2016-02-10
    • 2013-07-19
    • 2015-03-07
    • 2013-01-28
    • 2015-02-27
    相关资源
    最近更新 更多