MarkLogic XQuery XML转JSON时title元素值异常问题解决
MarkLogic json:transform-to-json() 转换问题解析与解决
问题1:多子元素导致title内容拼接
原理
MarkLogic默认JSON转换规则中,当父元素(如<title>)包含多个子元素(如<target>)时,会将所有子元素的文本内容直接拼接成一个字符串作为_value字段值。这是因为默认规则未区分多子元素的结构,而是递归提取所有层级的文本节点并合并。单个<target>时仅提取该元素的文本,所以结果符合预期。
解决方案
通过自定义转换规则,控制<title>对多<target>的处理逻辑:
- 若需将
<target>转为JSON数组:
let $config := json:config("custom") // 配置<title>为数组容器 let $title-rule := json:element-rule("title", map:entry("container", "array")) // 配置<target>提取文本内容 let $target-rule := json:element-rule("target", map:entry("transform", "text")) return json:transform-to-json($your-xml-node, $config => json:add-element-rule($title-rule) => json:add-element-rule($target-rule) )
- 若仅需保留第一个
<target>的内容:
let $config := json:config("custom") let $title-rule := json:element-rule("title", map:entry("transform", function($node) { fn:normalize-space($node/target[1]/text()) })) return json:transform-to-json($your-xml-node, $config => json:add-element-rule($title-rule))
问题2:格式化XML的换行符被带入JSON
原理
XML格式化时的换行、缩进空格属于空白文本节点,MarkLogic默认转换会保留这些节点内容,因此转换后的_value会包含换行符和多余空格。
解决方案
有两种处理方式:
- 预处理XML,去除格式化空白:
// 先将XML序列化为字符串再解析,同时开启strip-space去除多余空白 let $clean-xml := xdmp:unquote(xdmp:quote($your-xml-node), (), "strip-space=all") return json:transform-to-json($clean-xml)
- 在转换规则中修剪文本:
let $config := json:config("custom") let $title-rule := json:element-rule("title", map:entry("transform", function($node) { // normalize-space会去除首尾空白并合并中间空格 fn:normalize-space($node/text()) })) return json:transform-to-json($your-xml-node, $config => json:add-element-rule($title-rule))
内容的提问来源于stack exchange,提问作者Madoantony
相关产品推荐
相关产品推荐

