在MarkLogic 10中用XQuery转子节点为单字符串并保留Title节点
解决MarkLogic混合内容节点转JSON的格式问题
我来帮你搞定这个MarkLogic中XML混合内容转JSON的需求——要把包含文本和子元素的<Title>节点完整转成带HTML结构的_value,其实用xdmp:quote()配合手动构造JSON就能完美解决,具体方案如下:
方案1:手动构造目标JSON结构(最灵活)
直接获取<Title>节点的内部所有内容,用xdmp:quote()转成字符串,再组装成你需要的JSON结构:
let $source-xml := <Title>Header <bold>abc</bold></Title> return xdmp:to-json( object-node { "Title": object-node { "_value": xdmp:quote($source-xml/node()) } } )
关键细节解释:
$source-xml/node():专门取<Title>的子节点集合(也就是Header文本和<bold>abc</bold>元素),避免把<Title>标签本身也包含进去xdmp:quote():把这些节点序列转换成完整的字符串形式,保留原有的HTML结构- 最终输出的JSON就是你想要的格式:
{"Title": {"_value": "Header <bold>abc</bold>"}}
方案2:全局自定义JSON转换规则
如果你的应用里有大量这类混合内容节点需要统一处理,可以配置MarkLogic的自定义JSON转换规则,让混合内容直接合并成字符串:
let $source-xml := <Title>Header <bold>abc</bold></Title> let $convert-options := json:config("custom") let $_ := map:put($convert-options, "mixed-content", "concat") return xdmp:json-convert($source-xml, $convert-options)
不过要注意,这个规则是全局生效的,会影响所有混合内容节点的转换逻辑,如果只是个别节点需要特殊处理,方案1会更稳妥。
额外提示
如果你的XML带有命名空间,记得在xdmp:quote()里通过namespace参数处理前缀,避免输出不必要的命名空间声明。
内容的提问来源于stack exchange,提问作者Madoantony
相关产品推荐
相关产品推荐

