JSON 到 XML 使用 XSLT 3.0 的转换

JSON to XML Transformation using XSLT 3.0

我正在使用 Java 1.8,Saxon-HE 版本 9.9.1-4 和 xslt3.0 将 JSON 转换为 XML。

输入JSON

{
    "analystId": "Test",
    "jobId": "",
    "profileData": {
        "allAuthorCoverage": false,
        "assetClasses": [
            {
                "code": "Test1"
            }
        ]

    }   
}

XSLT3.0

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" /> 
  <xsl:strip-space elements="*"/>
  <xsl:param name="jsonText"/>

  <xsl:template match="@*|node()"> 
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template> 

  <xsl:template name="init">
    <xsl:apply-templates select="json-to-xml($jsonText)"/> 
  </xsl:template>

 <xsl:template match="*[@key]" >
  <xsl:element name="{@key}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

输出XML生成

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
   <analystId xmlns="">Test</analystId>
   <jobId xmlns=""/>
   <profileData xmlns="">
      <allAuthorCoverage>false</allAuthorCoverage>
      <assetClasses>
         <map xmlns="http://www.w3.org/2005/xpath-functions">
            <code xmlns="">Test1</code>
         </map>
      </assetClasses>
   </profileData>
</map>

输出XML 预期

<?xml version="1.0" encoding="UTF-8"?>
<analystId>Test</analystId>
<jobId />
<profileData>
    <allAuthorCoverage>false</allAuthorCoverage>
    <assetClasses>
        <code>Test1</code>
    </assetClasses>
</profileData>

我们仍然可以在生成的输出中看到 <map> 元素和 xmlns 属性,我的要求是删除它们。

请帮我从生成的输出和 xmlns 属性中删除 Map 元素。

此外,如果我用新属性扩展我的 json 结构,这些 map 元素和 xmlns 属性不应再次添加回来。

如果您不使用您使用过的标识模板,而是仅省略它,您的模板将具有 key 属性的元素转换为具有 key 值和任何名称的元素文本节点将创建输出:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all">

    <xsl:param name="jsonText" as="xs:string"><![CDATA[{
    "analystId": "Test",
    "jobId": "",
    "profileData": {
        "allAuthorCoverage": false,
        "assetClasses": [
            {
                "code": "Test1"
            }
        ]

    }   
}]]></xsl:param>

    <xsl:output indent="yes" /> 
    <xsl:strip-space elements="*"/>

    <xsl:template name="xsl:initial-template">
        <xsl:apply-templates select="json-to-xml($jsonText)"/> 
    </xsl:template>

    <xsl:template match="*[@key]" >
        <xsl:element name="{@key}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>