简体   繁体   中英

How to convert JSON to XML using XSLT?

I want to convert JSON to XML using XSLT. But not able to achieve the expected output. Below is the JSON request:

{
    "Store": [
        {
            "Book": "Cartoons",
            "ID": "ABC"
        }
    ]
}

The XSLT which I tried:

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    xmlns:emp="http://www.semanticalllc.com/ns/employees#"
    xmlns:h="http://www.w3.org/1999/xhtml"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    xmlns:j="http://www.w3.org/2005/xpath-functions"
    exclude-result-prefixes="xs math xd h emp"
    version="3.0"
    expand-text="yes">

<xsl:template match="/">
    <xsl:copy>
        <xsl:apply-templates select="json-to-xml(.)/*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*[@key]" xpath-default-namespace="http://www.w3.org/2005/xpath-functions">
    <xsl:element name="{@key}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

But I'm getting empty Response.

You need to pass the JSON as a parameter or read it from a file, the input to your XSLT is either XML or you can start with a named template:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">
    
  <xsl:param name="json" as="xs:string" expand-text="no">{
    "Store": [
        {
            "Book": "Cartoons",
            "ID": "ABC"
        }
    ]
}</xsl:param>

  <xsl:output indent="yes"/>

  <xsl:template match="/" name="xsl:initial-template">
      <xsl:sequence select="json-to-xml($json)"/>
  </xsl:template>
  
</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/93wniTJ

The result of the function for your sample is

<map xmlns="http://www.w3.org/2005/xpath-functions">
   <array key="Store">
      <map>
         <string key="Book">Cartoons</string>
         <string key="ID">ABC</string>
      </map>
   </array>
</map>

but of course you can run it through further templates to transform it to a different format.

The pattern match="/" matches a document node (the root of an XML tree). It won't match your input if the input is JSON.

XSLT 3.0 isn't actually that good at processing JSON using template rules: it can be done, but it isn't very convenient. It's usually more convenient to use functions. You can supply the JSON input as the value of an xsl:param and process it in code from your xsl:initial-template ; or if you're feeling more ambitious you could actually initiate the XSLT processing by invoking a public xsl:function that takes the JSON input as a parameter.

The traditional match="/" entry to a stylesheet only works for the traditional use of XSLT to process an XML input document.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM