我有一个XML文档,想将其转换为JSON字符串:
<?xml version="1.0" encoding="UTF-8"?>
<root name="test-root">
<id lang="en">9876</id>
<jobCode name="Teacher" xmlns:teacher="http://example.com/ns/teacher">1009</jobCode>
</root>
我使用此自定义配置来做到这一点:
let $config := json:config("custom")
let $_ := map:put( $config, "whitespace", "ignore" )
let $_ := map:put( $config, "ignore-attribute-names",(xs:QName("name"),xs:QName("lang")) )
return json:transform-to-json( fn:doc("/test1.xml"),$config)
以下是此脚本的输出:
{
"root": {
"id": "9876",
"jobCode": "1009"
}
}
这不是我所期望的,我想在元素根目录中包含name属性,但忽略元素jobCode中的name属性。我所期望的如下:
{
"root": {
"name": "test-root",
"id": "9876",
"jobCode": "1009"
}
}
如何自定义配置以获取此输出?谢谢!
我不认为该选项像您希望的那样先进。
在这种情况下,我将使用样式表对XML进行预处理,以进一步完善它。这是一个工作示例:
xquery version "1.0-ml";
import module namespace json="http://marklogic.com/xdmp/json"
at "/MarkLogic/json/json.xqy";
let $xml := <root name="test-root">
<id lang="en">9876</id>
<jobCode name="Teacher" xmlns:teacher="http://example.com/ns/teacher">1009</jobCode>
</root>
let $template := <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@name[name(./..) = 'jobCode']" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
let $filtered-xml := xdmp:xslt-eval($template, $xml)
let $config := json:config("custom")
let $_ := map:put( $config, "whitespace", "ignore" )
let $_ := map:put( $config, "ignore-attribute-names",(xs:QName("lang")) )
return json:transform-to-json( $filtered-xml,$config)
结果:
{
"root": {
"name": "test-root",
"id": "9876",
"jobCode": "1009"
}
}
如果走这条路线,那么您也可以在模板中的@lang上进行匹配,并将所有的ignore-attribute配置一起删除。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句