json - MarkLogic json:transform-from-json 有多个命名空间?
问题描述
在 MarkLogic 中,是否可以使用 json:transform-from-json 将 json 转换为具有多个命名空间的 XML?例如,如何转换
{
options: {
format: "xml"
}
}
进入
<options xmlns="xdmp:http-get">
<format xmlns="xdmp:document-get">xml</format>
</options>
解决方案
是的,你可以,它没有记录或容易,但它不是秘密。查看 Modules/MarkLogic/json/custom.xqy 中的源码
然后记录了更多自定义参数。“有趣”的允许您覆盖用于转换的各个方法。示例:使用自定义策略时,您可以设置覆盖。以下是默认值,您可以更改它们。
map:put($c , $json-custom:element-qname-from-json-name , json-custom:element-qname-from-json-name#2 ),
map:put($c , $json-custom:attribute-qname-from-json-name , json-custom:attribute-qname-from-json-name#2 ),
将函数 'json-custom:element-qname-from-json-name' 替换为您自己的 - 您可以使用任何您想要的逻辑,给定配置对象和当前 json 字段名称,返回完整的 QName。
您可以从上述文件中提取的“内置”功能(它没有被遮挡)。从 9.0 版开始,这看起来像:
declare %private function json-custom:element-qname-from-json-name( $config as map:map , $json_name as xs:string? ) as xs:QName
{
json-custom:qname( map:get( $config , $json-custom:element-namespace ) ,
map:get( $config , $json-custom:element-namespace-prefix ) ,
if(map:get($config , $json-custom:camel-case)) then json-custom:from-camelCase($json_name) else $
};
这可能会变得非常棘手。我建议结合使用自定义转换和 xml 后处理(使用 xquery 或 xslt)。
棘手的部分是当从 JSON 转换为 XML 时,您不会得到太多的“上下文”。JSON 没有节点祖先或排序。您得到的只是一个字段名称。如果您可以从中映射到所需的 QName,那么它很容易。例如,您可以创建一个 json 名称到 QNames 的映射,并将其与您的自定义函数一起放入配置中。
通常要求更加困难,因此建议您尝试通过配置“接近”然后进行后期处理。
推荐阅读
- javascript - 打开模态窗口时如何使背景模糊
- python - 如何使用python获取同一列中相同值之间的时间差
- c# - 为什么 ActionBlock 中的 Try/catch 有时无法捕捉到这个错误?
- spring-boot - 在 GCP 云环境中运行 liquibase 脚本时出错
- c# - Ajax.BeginForm 无法正确提交表单
- oracle - Oracle 透视查询
- typescript - 为什么使用条件运算符会导致交集类型?
- node.js - 如何在 Node.js 中正确清除终端历史记录
- wpf - 更改自定义圆环图的起始角度和方向
- php - Plyr - Seeking 不适用于 IOS 中音频元素上的自定义 HTML