MarkLogic json:从具有多个名称空间的json转换?
在MarkLogic中,是否可以使用json:transformfromJSON将json转换为具有多个名称空间的XML?例如,如何转换MarkLogic json:从具有多个名称空间的json转换?,json,xquery,marklogic,Json,Xquery,Marklogic,在MarkLogic中,是否可以使用json:transformfromJSON将json转换为具有多个名称空间的XML?例如,如何转换 { options: { format: "xml" } } 进入 xml 是的,你可以,它没有文档记录,也不容易,但它不是秘密。 查看Modules/MarkLogic/json/custom.xqy中的源代码 有更多的自定义参数,然后被记录。“有趣的”方法允许您重写用于转换的各个方法。 示例:使用自定义策略时,可以设置覆盖。 以下是默认
{
options: {
format: "xml"
}
}
进入
xml
是的,你可以,它没有文档记录,也不容易,但它不是秘密。
查看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的映射,并将其与自定义函数一起放入配置中
通常需求更加困难,因此建议您尝试“接近”配置,然后进行后期处理 示例JSON中没有任何内容表明应将这些名称空间应用于XML元素 如果使用,结果XML将出现在
http://marklogic.com/xdmp/json/basic
名称空间
<json type="object" xmlns="http://marklogic.com/xdmp/json/basic">
<options type="object">
<format type="string">xml</format>
</options>
</json>
但是,如果您试图构造XML以便为生成选项,您可能会发现使用map:map
而不是XML表单来指定选项更容易
用于自定义此操作的选项。您可以将选项指定为“xdmp:document get”命名空间中的XML元素,或者指定为map:map
。下面的选项名称是XML元素localnames。使用贴图时,请将连字符替换为驼色大小写。例如,“选项”在用作map:map键时变为“选项”
如果有JSON对象,可以选择options
属性,然后使用fn:data()
或将options
对象节点原子化为映射:
fn:data($json//options)
非常感谢。感谢您对MarkLogic内部的宝贵见解。感谢您对使用map:map的建议。这确实是一条容易得多的路线。
fn:data($json//options)