Joe2013
Joe2013

Reputation: 997

XSLT - Transformation not working correctly

I have a request XML as follows which would need to be convereted into a different format. Can some pne please help me with this.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:fetchOrderListResponse xmlns:ns2="http://impl.lob.wipro.com/">
         <return>
            <customerOrderNumber>1</customerOrderNumber>
            <orderId>E147011D-AE9F-4AC8-AF37-05DC538AF1D0</orderId>
            <ordertotal>0</ordertotal>
         </return>
         <return>
            <customerOrderNumber>1</customerOrderNumber>
            <orderDetails>
               <itemPrice>50.0</itemPrice>
               <itemQty>2</itemQty>
               <itemUnit>0</itemUnit>
               <orderDetailsId>37516016-D71B-4790-951F-55D00B0CC159</orderDetailsId>
            </orderDetails>
            <orderDetails>
               <itemPrice>39.0</itemPrice>
               <itemQty>3</itemQty>
               <itemUnit>0</itemUnit>
               <orderDetailsId>6095ABC7-0D0D-4B2E-92E5-80F24E9092B8</orderDetailsId>
            </orderDetails>
            <orderId>84EC371D-40CA-455E-A0FA-7EA733E9BFD3</orderId>
            <ordertotal>217</ordertotal>
         </return>
         <return>
            <customerOrderNumber>1</customerOrderNumber>
            <orderId>54712493-2172-4ADB-814B-BC7AA0BB72C3</orderId>
            <ordertotal>0</ordertotal>
         </return>
         <return>
            <customerOrderNumber>1</customerOrderNumber>
            <deliverydate>2013-02-06T00:00:00+05:30</deliverydate>
            <orderDetails>
               <itemPrice>565.0</itemPrice>
               <itemQty>1</itemQty>
               <itemUnit>0</itemUnit>
               <orderDetailsId>9A5030BE-F95F-4C62-B5A2-41FF85423218</orderDetailsId>
            </orderDetails>
            <orderDetails>
               <itemPrice>4.0</itemPrice>
               <itemQty>90</itemQty>
               <itemUnit>0</itemUnit>
               <orderDetailsId>65A8B3BE-D407-43D8-8754-EA1E26AA56E4</orderDetailsId>
            </orderDetails>
            <orderId>0BDCB222-0117-47A9-8813-DF03A1D19E5E</orderId>
            <ordertotal>925</ordertotal>
         </return>
         <return>
            <customerOrderNumber>1</customerOrderNumber>
            <orderId>8E4220DC-884B-47BC-A565-E26B80BA5249</orderId>
            <ordertotal>0</ordertotal>
         </return>
         <return>
            <customerOrderNumber>1</customerOrderNumber>
            <deliverydate>2013-02-06T00:00:00+05:30</deliverydate>
            <orderDetails>
               <itemPrice>10.0</itemPrice>
               <itemQty>4</itemQty>
               <itemUnit>0</itemUnit>
               <orderDetailsId>5A2DF895-BB0F-4039-80DB-F44CED31697B</orderDetailsId>
            </orderDetails>
            <orderDetails>
               <itemPrice>20.0</itemPrice>
               <itemQty>3</itemQty>
               <itemUnit>0</itemUnit>
               <orderDetailsId>8034FBF4-B573-4B19-BDF5-FAF6C4247A55</orderDetailsId>
            </orderDetails>
            <orderId>60161E3E-3C4A-4CE6-AAC3-E4D2BC240046</orderId>
            <ordertotal>100</ordertotal>
         </return>
      </ns2:fetchOrderListResponse>
   </soap:Body>
</soap:Envelope>

Response should be of the format as below. Please help with the XSLT to transform the same

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.client.inmemory.eim.wipro.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:getOrderDetailResponse>
         <!--Zero or more repetitions:-->
         <return>
            <itemPrice>?</itemPrice>
            <itemQty>?</itemQty>
            <itemUnit>?</itemUnit>
            <!--Optional:-->
            <orderDetailsId>?</orderDetailsId>
            <!--Optional:-->
            <orderId>?</orderId>
         </return>
      </ser:getOrderDetailResponse>
   </soapenv:Body>
</soapenv:Envelope>

I came up with a XSLT to do this. Unfortunately it is not working and not pulling any data. Kindly let me know what I am doing wrong

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.client.inmemory.eim.wipro.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:getOrderDetailResponse>
         <!--Zero or more repetitions:-->
         <return>
<xsl:for-each select="return/orderDetails">
            <itemPrice><xsl:value-of select="return/orderDetails/itemPrice"/></itemPrice>
            <itemQty><xsl:value-of select="return/orderDetails/itemQty"/></itemQty>
            <itemUnit><xsl:value-of select="return/orderDetails/itemUnit"/></itemUnit>
            <orderDetailsId><xsl:value-of select="return/orderDetails/orderDetailsId"/></orderDetailsId>
            <orderId><xsl:value-of select="orderId"/></orderId>
</xsl:for-each>
         </return>
      </ser:getOrderDetailResponse>
   </soapenv:Body>
</soapenv:Envelope>
</xsl:template>
</xsl:stylesheet>

Upvotes: 0

Views: 126

Answers (1)

Daniel Haley
Daniel Haley

Reputation: 52888

Not sure why you deleted your first question and posted the exact same one over again. After you added the XSLT, it was an answerable question.

Anyway the issue is that your template matches /, but then you try to do an xsl:for-each starting at return/orderDetails. You really have to pay attention to context in XSLT.

First add the appropriate namespaces to xsl:stylesheet...

xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns2="http://impl.lob.wipro.com/"

Second, adjust your select accordingly:

<xsl:for-each select="/soap:Envelope/soap:Body/ns2:fetchOrderListResponse/return/orderDetails">

I'm not sure if this returns exactly what you're looking for, but it returns data. You should be able to adjust after you see the output

Upvotes: 1

Related Questions