Xquery 变量未设置

jbr*_*ehr 3 xquery

在我的 Xquery 3.1 模块中,我通过模块导入导入了“全局变量”,其中 ( $globalvar:MSGS) 包含一个 XML 文档,我通常可以通过引用该变量来访问该文档。例如这个

\n\n
$globalvar:MSGS//vocab[@xml:id="warning"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

将返回

\n\n
     <vocab xml:id="warning">\n        <span lang="en">Warning! Your changes (OBJECTID) could not be saved!</span>\n        <span lang="fr">Attention, vos modifications (OBJECTID) n\xe2\x80\x99ont pas pu \xc3\xaatre sauvegard\xc3\xa9es\xc2\xa0!</span>\n     </vocab>\n
Run Code Online (Sandbox Code Playgroud)\n\n

但以下返回一个错误,err:XPDY0002 variable \'$msg\' is not set指向第 7-8 行:

\n\n
1. let $collid := $mydoc//collection-id/text()\n2. let $errtitle :=   \n3.         <msg-error-title>\n4.              {\n5.                let $msg := $globalvar:MSGS/id("warning")/span\n6.                return \n7.                     <en>{replace($msg[@lang="en"]/text(),"OBJECTID",$collid)}</en>,                 \n8.                     <fr>{replace($msg[@lang="fr"]/text(),"OBJECTID",$collid)}</fr>\n9.               }\n10.         </msg-error-title>\n11. return $errtitle\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是如果我删除内部let ... return并直接引用$globalvar:MSGS如下所示,则不会出现错误:

\n\n
let $collid := $mydoc//collection-id/text()\nlet $errtitle :=   \n         <msg-error-title>\n                {\n                 <en>{replace($globalvar:MSGS/id("warning")/span[@lang="en"]/text(),"OBJECTID",$collid)}</en>,                 \n                 <fr>{replace($globalvar:MSGS/id("warning")/span[@lang="fr"]/text(),"OBJECTID",$collid)}</fr>\n                 }\n         </msg-error-title>\nreturn $errtitle\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不明白为什么$msg在第一个示例中没有设置?还有其他选择吗?

\n\n
\n\n

添加测试

\n\n
let $collid := "FOOID"\nlet $xml := \n    <vocab xml:id="warning">\n        <span lang="en">Warning! Your changes (OBJECTID) could not be saved!</span>\n        <span lang="fr">Attention, vos modifications (OBJECTID) n\xe2\x80\x99ont pas pu \xc3\xaatre sauvegard\xc3\xa9es !</span>\n     </vocab>\n\nlet $errtitle :=   \n    <msg-error-title>\n            {let $msg := $xml/id("warning")/span\n             return \n                <en>{replace($msg[@lang="en"]/text(),"OBJECTID",$collid)}</en>,\n                <fr>{replace($msg[@lang="fr"]/text(),"OBJECTID",$collid)}</fr>\n             }\n    </msg-error-title>\nreturn $errtitle\n
Run Code Online (Sandbox Code Playgroud)\n

Mic*_*Kay 5

您的测试用例在撒克逊语中失败了

静态错误 XPST0008 对变量 $msg 的未解析引用

问题是“,”并不像您想象的那样紧密结合,因此您需要在返回表达式周围添加额外的括号:

       return (
                <en>{replace($msg[@lang="en"]/text(),"OBJECTID",$collid)}</en>,
                <fr>{replace($msg[@lang="fr"]/text(),"OBJECTID",$collid)}</fr>
       )
Run Code Online (Sandbox Code Playgroud)