首页 > 解决方案 > 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>

标签: jsonxquerymarklogic

解决方案


是的,你可以,它没有记录或容易,但它不是秘密。查看 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 的映射,并将其与您的自定义函数一起放入配置中。

通常要求更加困难,因此建议您尝试通过配置“接近”然后进行后期处理。


推荐阅读