You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MarkLogic查询控制台加载带参数XQuery模块报错求助

MarkLogic加载带参数XQuery模块时出现未定义变量错误的解决方法

问题场景

尝试通过MarkLogic查询控制台将包含带参数函数的XQuery模块写入Modules数据库时,执行以下代码报错:

xquery version "1.0-ml";

xdmp:document-insert("/my/app/my-module.xqy",
<module xmlns="http://marklogic.com/xdmp/module">
  xquery version "1.0-ml";
  module namespace my = "http://my.app/module";

  declare function my:hello-world($content as xs:string) {
    fn:concat("Hello from my module! ",$content)
  };
</module>

错误信息

[1.0-ml] XDMP-UNDVAR: (err:XPST0008) Undefined variable $content

验证情况

  • 该函数单独运行完全正常:
xquery version "1.0-ml";
declare namespace my = "http://my.app/module";

declare function my:hello-world($content as xs:string) {
  fn:concat("Hello from my module! ",$content)
};

my:hello-world('test')
  • 加载无参数的函数模块时也没有报错:
xquery version "1.0-ml";

xdmp:document-insert("/my/app/my-module.xqy",
<module xmlns="http://marklogic.com/xdmp/module">
  xquery version "1.0-ml";
  module namespace my = "http://my.app/module";

  declare function my:hello-world() {
    fn:concat("Hello from my module!","Test")
  };
</module>)

解决方法

问题出在使用<module>标签包裹模块内容的方式上,MarkLogic解析这种XML结构时,会误将函数定义里的$content识别为XML上下文变量,而非函数参数。正确做法是用text{}构造器包装模块的文本内容,同时指定模块的命名空间参数:

正确的模块加载代码

xdmp:document-insert("/my/app/my-test.xqy",
text{
  'xquery version "1.0-ml";
  module namespace my = "http://my.app/module";

  declare function my:hello-world($content as xs:string) {
    fn:concat("Hello from my module! ",$content)
  };'  
  },
  xdmp:default-permissions(),
  "http://my.app/module"
)

调用该模块的代码

import module namespace my="http://my.app/module" at "/my/app/my-test.xqy";
my:hello-world("TEST")

内容的提问来源于stack exchange,提问作者David Harris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 10:43:14