Add a prefix namespace in XML using XSLT

Not applicable

My Input XML payload :

<d:table xmlns:d="http://abc/xyz/d" xmlns:m="http://abc/xyz/m" m:type="abc.xyz.123">
  <d:name m:type="Edm.String">African Coffee Table</d:name>
  <d:width m:type="Edm.Boolean">true</d:width>
  <d:height m:type="Edm.Double" >120.50</d:height>
  <d:area m:type="Edm.Double" >120.50</d:area>
  <d:volume m:type="Edm.Double" >120.50</d:volume>
  <d:cube m:type="Edm.Double" >120.50</d:cube>
  <d:length m:type="Edm.Double" >120.50</d:length>
</d:table>

Output expected in JSON :

{
  "table": {
    "abc.xyz.123"
    "name": {
      "type": "Edm.String",
      "content": "African Coffee Table"
    }
    "width": {
      "type": "Edm.Boolean",
      "content": "true"
    }
    "length": {
      "type": "Edm.Double",
      "content": "120.50"
    }
  }
}


MY XSLT code :

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:d="http://abc/xyz/d" xmlns:m="http://abc/xyz/m">
  <xsl:output method="text"/>
  <xsl:variable name="newline">
    <xsl:text>
    </xsl:text>
  </xsl:variable>
  <xsl:template match="/">
    <xsl:text>
      <table>
      </xsl:text>
      <xsl:value-of select="$newline"/>
      <xsl:for-each select="/d:table">
        <xsl:value-of select="$newline"/>
      </xsl:for-each>
      <xsl:for-each select="/d:table">
        <xsl:text>
          <table>
          </xsl:text>
          <xsl:value-of select="d:table"/>
          <xsl:text>
          </table>
        </xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:text>
          <width>>
        </xsl:text>
        <xsl:value-of select="d:width"/>
        <xsl:text>
        </width>
      </xsl:text>
      <xsl:text>
        <length>>
      </xsl:text>
      <xsl:value-of select="d:length"/>
      <xsl:text>
      </length>
    </xsl:text>
  </xsl:for-each>
  <xsl:text>
  </table>
</xsl:text>
</xsl:template>
</xsl:stylesheet>

I need to map xml payload such that the actual value of tag is added inside content tag and data type is mapped under type.
I will use XML to JSON to convert the transformed XML in to JSON

but as of now i am not able to convert the XML payload into the expected XML out

Please help

Thanks in Advance

Solved Solved
0 4 5,272
1 ACCEPTED SOLUTION

To do this, you can add an XSLT policy before the XMLtoJSON policy to modify the input XML so as to whitelist only the elements you need from the request payload. One way to do this would be in XSLT:

Policy:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<XSL async="false" continueOnError="false" enabled="true" name="XSL-Transform-1">
    <DisplayName>XSL Transform-1</DisplayName>
    <Properties/>
    <Source>request</Source>
    <ResourceURL>xsl://XSL-Transform-1.xsl</ResourceURL>
    <Parameters ignoreUnresolvedVariables="true"/>
    <OutputVariable/>
</XSL>

XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="http://abc/xyz/d">
    <xsl:output indent="yes" />
    <d:WhiteList>
        <name>d:table</name>
        <name>d:name</name>
        <name>d:length</name>
        <name>d:width</name>
    </d:WhiteList>

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

    <xsl:template match="*[not(descendant-or-self::*[name()=document('')/*/d:WhiteList/*])]"/>

</xsl:stylesheet>

View solution in original post

4 REPLIES 4

Hi Dheerj,

If I understand this question correctly, you need to generate JSON output from the XML input.

All you need is the default XMLtoJSON policy that does exactly what you are asking as the default implementation. You should not need any XSLT for this.

I tried the policy as pasted below :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<XMLToJSON async="false" continueOnError="false" enabled="true" name="XML-to-JSON-1">
    <DisplayName>XML to JSON-1</DisplayName>
    <Properties/>
    <Format>yahoo</Format>
    <OutputVariable>response.content</OutputVariable>
    <Source>request</Source>
</XMLToJSON>

and got this output from your input XML:

{"table":{"type":"abc.xyz.123","name":{"type":"Edm.String","content":"African Coffee Table"},"width":{"type":"Edm.Boolean","content":"true"},"length":{"type":"Edm.Double","content":120.50}}}

thanks this works but i need to extract only few elements from xml payload which is coming in response and then i need to convert into json
the above code works fine but converts all xml elements
I have also updated the question

hanselm
could you please
update the code 🙂

To do this, you can add an XSLT policy before the XMLtoJSON policy to modify the input XML so as to whitelist only the elements you need from the request payload. One way to do this would be in XSLT:

Policy:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<XSL async="false" continueOnError="false" enabled="true" name="XSL-Transform-1">
    <DisplayName>XSL Transform-1</DisplayName>
    <Properties/>
    <Source>request</Source>
    <ResourceURL>xsl://XSL-Transform-1.xsl</ResourceURL>
    <Parameters ignoreUnresolvedVariables="true"/>
    <OutputVariable/>
</XSL>

XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="http://abc/xyz/d">
    <xsl:output indent="yes" />
    <d:WhiteList>
        <name>d:table</name>
        <name>d:name</name>
        <name>d:length</name>
        <name>d:width</name>
    </d:WhiteList>

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

    <xsl:template match="*[not(descendant-or-self::*[name()=document('')/*/d:WhiteList/*])]"/>

</xsl:stylesheet>