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

MarkLogic中XQuery的Try Catch报语法错误如何解决

语法错误排查

代码共有2处直接触发语法报错的问题,2处导致功能异常的逻辑问题:

  • 非法字符问题:构造xdmp:document-insert配置项的XML节点时,</permissions>闭合标签后多输入了一个无意义的字符z,破坏了XML结构合法性,这是触发语法错误的核心原因。
  • 多余关键字问题:try代码块内xdmp:invoke-function(...)执行语句后多写了一个return关键字,不符合XQuery try/catch的语法规则。XQuery中try块后直接跟执行表达式序列即可,不需要额外加return,执行顺序按表达式书写顺序从上到下执行。
  • 集合配置逻辑错误:原代码直接将xdmp:document-get-collections()返回的集合名序列整体包裹在单个<collection>标签内,会导致多个集合名被拼接为单个字符串,目标数据库中插入的文档无法继承原文档的集合配置,需要遍历集合序列为每个集合名单独生成<collection>节点。
  • 表达式分隔符问题:try块内两个执行语句(插入文档、删除原文档)属于同一表达式序列,需要用逗号分隔,原代码使用分号不符合XQuery语法规范。
修正后完整代码
xquery version "1.0-ml";
for $doc in cts:search(doc(), cts:collection-query('Test'))
let $docuri := $doc/base-uri()
let $collections := xdmp:document-get-collections($docuri)
let $permissions := xdmp:document-get-permissions($docuri)
let $document-insert-options := 
  <options xmlns="xdmp:document-insert">  
    <permissions>{$permissions}</permissions>
    <collections>{
      for $coll in $collections
      return <collection>{$coll}</collection>
    }</collections> 
  </options>
let $db-name := "Final"  
let $invoke-function-options := 
  <options xmlns="xdmp:eval">
    <database>{ xdmp:database($db-name) }</database>
    <commit>auto</commit>
  </options>
return
try {
  xdmp:invoke-function(
   function(){ xdmp:document-insert($docuri, $doc, $document-insert-options)},
   $invoke-function-options
  ), 
  xdmp:document-delete($doc)
}
catch ($exception) {
  "Problem loading file, received the following exception: ",
  $exception 
}

修正后代码执行逻辑:遍历源库中Test集合下的所有文档,读取文档的URI、权限、集合配置,将文档写入名为Final的目标数据库,写入成功后自动删除源库中的原文档;如果执行过程中抛出异常,会直接打印异常信息。

内容的提问来源于stack exchange,提问作者Rashmita Purkayastha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:51:19