XML to JSON Array Conversion using XSLT

136 views Asked by At

I have a scenario where in I am trying to convert the following XML:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <ClientId>1023</ClientId>
    <PackageId>1542</PackageId>
    <LegalEntityId>30</LegalEntityId>
    <title>Mr</title>
    <firstName>kumar</firstName>
    <middleName></middleName>
    <lastName>kumar</lastName>
    <contactDetails>
        <emailIds>
            <emailIdType>Primary</emailIdType>
            <emailId>[email protected]</emailId>
        </emailIds>
        <contactNumber>
            <contactType>Mobile</contactType>
            <candidateContact>9999999999</candidateContact>
        </contactNumber>
    </contactDetails>
    <EICCaseDocuments>
        <DocumentType>AuthorizationForm</DocumentType>
        <fileContent>PDF URL</fileContent>
        <fileType>1</fileType>
    </EICCaseDocuments>
    <checks>
        <CheckId>28</CheckId>
        <Source>Graduation</Source>
        <checkFields>
            <Name>Registration number/Seat number </Name>
            <Value>Value</Value>
        </checkFields>
        <checkFields>
            <Name>Mode of Study: Full time / Part time / Distance learning course</Name>
            <Value>Value</Value>
        </checkFields>
        <files>
            <DocumentName>Document Name</DocumentName>
            <fileContent>PDF URL</fileContent>
            <fileType>1</fileType>
        </files>
    </checks>
    <checks>
        <CheckId>30</CheckId>
        <Source>Previous</Source>
        <checkFields>
            <Name>Employee code</Name>
            <Value>Value</Value>
        </checkFields>
        <checkFields>
            <Name>Designation</Name>
            <Value>Value</Value>
        </checkFields>
        <files>
            <DocumentName>Document Name</DocumentName>
            <fileContent>PDF URL</fileContent>
            <fileType>1</fileType>
        </files>
    </checks>
</root>

Into a JSON Payload that looks like the following:

{
  "ClientId": 1023,
  "PackageId": 1542,
  "LegalEntityId": 30,
  "title": "Mr",
  "firstName": "kumar",
  "middleName": "",
  "lastName": "kumar",
  "contactDetails": {
    "emailIds": [
      {
        "emailIdType": "Primary",
        "emailId": "[email protected]"
      }
    ],
    "contactNumber": [
      {
        "contactType": "Mobile",
        "candidateContact": "9999999999"
      }
    ]
  },
    "EICCaseDocuments": [
        {
            "DocumentType": "AuthorizationForm",
            "fileContent": "<PDF URL>",
            "fileType": "1"
        }
    ],
  "checks": [
    {
      "CheckId": 28,
      "Source": "Graduation",
      "checkFields": [
        {
          "Name": "Registration number/Seat number ",
          "Value": "Value"
        },
        {
          "Name": "Mode of Study: Full time / Part time / Distance learning course",
          "Value": "Value"
        }
      ],
      "files": [{
          "DocumentName": "<Document Name>",
          "fileContent": "<PDF URL>",
          "fileType": "1"
        }]
    },
    {
      "CheckId": 30,
      "Source": "Previous",
      "checkFields": [
        {
          "Name": "Employee code",
          "Value": "Value"
        },
        {
          "Name": "Designation",
          "Value": "Value"
        }
      ],
      "files": [{
          "DocumentName": "<Document Name>",
          "fileContent": "<PDF URL>",
          "fileType": "1"
        }]
    }
  ]
}

As you can see, every node is an array and there are even some fields whose values are not enclosed in quotes.

I am trying to achieve this on SAP CPI using XSLT Mapping. I have played around with the following code but I am not getting the desired output. Please find my code below:

<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="http://use your namespace">
<xsl:output method="text"/>
<xsl:template match="/root">{
    <xsl:apply-templates select="*"/> }
</xsl:template>

<!-- Object or Element Property-->
<xsl:template match="*">

    "<xsl:value-of select="name()"/>" : <xsl:call-template name="Properties"/>
    

</xsl:template>


<!-- Array Element -->
<xsl:template match="*" mode="ArrayElement">
    <xsl:call-template name="Properties"/>
</xsl:template>


<!-- Object Properties -->
<xsl:template name="Properties">
    <xsl:variable name="childName" select="name(*[1])"/>
    <xsl:choose>
        <xsl:when test="not(*|@*)">"<xsl:value-of select="."/>"</xsl:when>
        <xsl:otherwise>{
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates select="*"/>
}</xsl:otherwise>
    </xsl:choose>
    <xsl:if test="following-sibling::*">,</xsl:if>
</xsl:template>


<!-- Attribute Property -->
<xsl:template match="@*">"<xsl:value-of select="name()"/>" : "<xsl:value-of select="."/>",
</xsl:template>
</xsl:stylesheet>

Through this code, I am getting "checks" and "checkFields" the way i require.

However, I am unable to enclose "emailIds","contactNumber","EICCaseDocuments" and any "files" nodes in an array. Also, how can i remove the quotes enclosing ClientId, Packageid, LegalEntity and CheckId?

I understand that this is a generic code. But really need some guidance on how to achieve the answers to both my queries above.

Could really use some help on this.

Thanks!

0

There are 0 answers