json 到 XML 使用 XSL

json to XML using XSL

我需要将 json 消息转换为 XML。我已经创建了一个基本的 XSL 转换脚本,但生成的 XML 使用 'map' 标签,并将 json 值作为 'key' 属性。

有没有办法将名称值用作标签,或者我是否必须编写第二个转换 XSL 才能获得我想要的内容?

json:

<?xml version="1.0"?>
<data>
{ "Policies":   
        {
        "Policy": {                 
               "PolicyNum": "1234",             
               "Customer": "Smith"              
                      },
        "Policy": {                 
               "PolicyNum": "5678",         
               "Customer": "Jones"              
                      }
                 }
}
</data>

xsl:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs math" version="3.0">
    <xsl:output indent="yes" omit-xml-declaration="no" />
    <xsl:template match="data">
        <xsl:copy-of select="json-to-xml(.)"/>
    </xsl:template>
</xsl:stylesheet>

结果 XML:(使用 https://xslttest.appspot.com/

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
   <map key="Policies">
      <map key="Policy">
         <string key="PolicyNum">1234</string>
         <string key="Customer">Smith</string>
      </map>
      <map key="Policy">
         <string key="PolicyNum">5678</string>
         <string key="Customer">Jones</string>
      </map>
   </map>
</map>

我需要的XML:

   <Policies>
      <Policy>
            <PolicyNum>1234</PolicyNum>
            <Customer>Smith</Customer>
      </Policy>
      <Policy>
            <PolicyNum>5678</PolicyNum>
            <Customer>Jones</Customer>
      </Policy>
   </Policies>

不是复制 XML 映射,而是通过模板推送它并将该映射转换为使用 @key 作为名称的元素:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:fn="http://www.w3.org/2005/xpath-functions" 
  exclude-result-prefixes="xs math" version="3.0">
    <xsl:output indent="yes" omit-xml-declaration="no" />

    <xsl:template match="data">
        <xsl:apply-templates select="json-to-xml(.)"/>
    </xsl:template>
    
    <xsl:template match="fn:*[@key]">
        <xsl:element name="{@key}">
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>
        
    <xsl:template match="fn:map">
        <xsl:apply-templates/>
    </xsl:template>
    
</xsl:stylesheet>