Home > database >  json to XML using XSL
json to XML using XSL

Time:12-02

I need to transform a json message to XML. I have created a basic XSL transform script but the resulting XML uses 'map' tags with the json values as 'key' attributes.

Is there a way to have the name values used as tags or do I have to write a second transform XSL to get what I want?

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>

resulting XML: (using 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>

The XML I need:

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

CodePudding user response:

Instead of copying the XML map, push it through templates and transform that map into elements using the @key for the name:

<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>
  • Related