使用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
相关产品推荐
相关产品推荐

