简体   繁体   中英

Wrapping XML document in one-element JSON using XSLT 1.0

I'm trying to transform an XML document to be in single-line and wrap it in a one-element JSON. Using XSLT 1.0

The problem is, XSL generates double quotes in the xmlns definitions so the resulting JSON is invalid.

This is my input:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<otm:Transmission xmlns:otm='http://xmlns.oracle.com/apps/otm/transmission/v6.4' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
  <otm:TransmissionHeader/>
  <otm:TransmissionBody>
    <otm:GLogXMLElement>
      <otm:Invoice>
        <otm:Payment>
          <otm:PaymentHeader>
            <otm:DomainName>CompanyX</otm:DomainName>
            <otm:TransactionCode>EX</otm:TransactionCode>
            <otm:InvoiceDate>
              <otm:GLogDate>20220414000000</otm:GLogDate>
            </otm:InvoiceDate>
          </otm:PaymentHeader>
        </otm:Payment>
      </otm:Invoice>
    </otm:GLogXMLElement>
  </otm:TransmissionBody>
</otm:Transmission>

This is what I'm getting:

{"jsonElement":"<otm:Transmission xmlns:otm="http://xmlns.oracle.com/apps/otm/transmission/v6.4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><otm:TransmissionHeader/><otm:TransmissionBody><otm:GLogXMLElement><otm:Invoice><otm:Payment><otm:PaymentHeader><otm:DomainName>CompanyX</otm:DomainName><otm:TransactionCode>EX</otm:TransactionCode><otm:InvoiceDate><otm:GLogDate>20220414000000</otm:GLogDate></otm:InvoiceDate></otm:PaymentHeader></otm:Payment></otm:Invoice></otm:GLogXMLElement></otm:TransmissionBody></otm:Transmission>"}

The XSL that I use:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:otm='http://xmlns.oracle.com/apps/otm/transmission/v6.4'>
<xsl:output method="text" indent="no" suppress-indentation="otm:Transmission"/>
<xsl:strip-space elements="*" />

    <xsl:template match="/">
{"jsonElement":"<xsl:apply-templates select="*"/>"}
    </xsl:template>

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

</xsl:stylesheet>

As you can see, the JSON is invalid due to double quotes in the xmlns definitons.

I tried several approaches and I am not able to get rid of the double quotes. In the input, they are single quotes but XSL is generating them differently.

What would be the best approach to have a valid JSON result? The XML in the JSON has to be 1:1 copy of the input but transformed into a single line and I can only use XSLT 1.0

An XSLT 1.0 processor is going to reject the suppress-indentation attribute, and it's going to output the text of the source document without markup. Like @MartinHonnen, I don't see how any XSLT processor can give you the output you claim to be getting.

In XSLT 3.0 you can do

<xsl:output method="json">

<xsl:template match="/">
  <xsl:map key="'jsonElement'"
           select="serialize(., map{'method':'xml'})"/>
</xsl:template>

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