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

