在我的 Xquery 3.1 模块中,我通过模块导入导入了“全局变量”,其中 ( $globalvar:MSGS) 包含一个 XML 文档,我通常可以通过引用该变量来访问该文档。例如这个
$globalvar:MSGS//vocab[@xml:id="warning"]\nRun 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>\nRun Code Online (Sandbox Code Playgroud)\n\n但以下返回一个错误,err:XPDY0002 variable \'$msg\' is not set指向第 7-8 行:
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\nRun Code Online (Sandbox Code Playgroud)\n\n但是如果我删除内部let ... return并直接引用$globalvar:MSGS如下所示,则不会出现错误:
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\nRun Code Online (Sandbox Code Playgroud)\n\n我不明白为什么$msg在第一个示例中没有设置?还有其他选择吗?
添加测试
\n\nlet $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\nRun Code Online (Sandbox Code Playgroud)\n
您的测试用例在撒克逊语中失败了
静态错误 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)
| 归档时间: |
|
| 查看次数: |
469 次 |
| 最近记录: |