Skip to Content
0
Former Member
Feb 20, 2009 at 09:04 PM

Problem with XSLT transformation while converting XMLfile to internal table

81 Views

Hi all

I have a requirement where I need to convert the data of XML file to internal table data. I need this as I need to do a Goods Recipt with the data from the internal table.

Please find my XML file, ABAP pgm and XSLT pgm . I donu2019t know what I am missing I am not getting any output. I donu2019t know what is wrong please help me with this

Below is my XML file, My code and XSLT Program. In the below XML file I need to collect Vendor Number, Order Number, and Date tags which occur only once for one XML file.

I also need to collect the following tags from <Shipmentdetail>

<Shipmentdetail> has following child nodes and I need to collect them

TrackingNumber

Freight

Weight

ShipmentDate

ShipmentMethod

Need to collect to collect the following tags from <ProductInformation>

<ProductInformation> has following child nodes and I need to collect them

LineNumber

SKUNumber

OrderedQuantity

ShippedQuantity

UOM

The <Shipmentdetail> and <ProductInformation> are child nodes of <OrderShipment>

The <Shipmentdetail> occurs only ones but the <ProductInformation> can occur once or many times and will be dynamic and differs depening on the input file.

My XML file is as follows

 
 <?xml version="1.0" encoding="iso-8859-1" ?> 
- <ShipmentHeader>
  <AccountID /> 
- <OrderShipment>
      <VendorNumber>1000</VendorNumber> 
      <OrderNumber>P00009238</OrderNumber> 
      <OrderType>Stock</OrderType> 
      <Company /> 
      <Division /> 
     <Department /> 
     <Date>20061120</Date> 
     <CartonCount>2</CartonCount> 
     <ShipAllProducts>No</ShipAllProducts> 
-             <ShipmentDetail>
                  <TrackingNumber>1ZR3W891PG47477811</TrackingNumber> 
                  <Freight>000000010000</Freight> 
                  <ShipmentDate>20061120</ShipmentDate> 
                  <ShipmentMethod>UPS1PS</ShipmentMethod> 
             </ShipmentDetail>
-            <ProductInformation>
                 <LineNumber>000000001</LineNumber> 
                 <SKUNumber>110FR</SKUNumber> 
                 <AdvSKUNumber>003 4518</AdvSKUNumber> 
                 <SKUID /> 
                 <OrderedQuantity>00000001000000</OrderedQuantity> 
                 <ShippedQuantity>00000001000000</ShippedQuantity> 
                 <UOM>EA</UOM> 
                 <Factor>1</Factor> 
            </ProductInformation>
-           <ProductInformation>
                <LineNumber>000000002</LineNumber> 
                <SKUNumber>938EN</SKUNumber> 
                <AdvSKUNumber>001 7294</AdvSKUNumber> 
                <SKUID /> 
                <OrderedQuantity>00000000450000</OrderedQuantity> 
                <ShippedQuantity>00000000450000</ShippedQuantity> 
                <UOM>EA</UOM> 
                <Factor>1</Factor> 
            </ProductInformation>
-           <CaseInformation>
               <LineNumber>000000001</LineNumber> 
               <SKUNumber>110FR</SKUNumber> 
               <AdvSKUNumber>003 4518</AdvSKUNumber> 
               <SKUID /> 
               <SSCCNumber>00000001668000002487</SSCCNumber> 
               <CaseQuantity>00000001000000</CaseQuantity> 
               <UOM>EA</UOM> 
               <Factor>1</Factor> 
             </CaseInformation>
             <CaseInformation>
               <LineNumber>000000001</LineNumber> 
               <SKUNumber>110FR</SKUNumber> 
               <AdvSKUNumber>003 4518</AdvSKUNumber> 
               <SKUID /> 
               <SSCCNumber>00000001668000002487</SSCCNumber> 
               <CaseQuantity>00000001000000</CaseQuantity> 
               <UOM>EA</UOM> 
               <Factor>1</Factor> 
             </CaseInformation>
-  </OrderShipment>
  </ShipmentHeader> 

My Program

TYPE-POOLS abap.

CONSTANTS gs_file TYPE string VALUE 'C:\temp\test.xml'.

* This is the structure for the data from the XML file

TYPES: BEGIN OF ts_shipment,
         VendorNumber(10)     TYPE n,
         OrderNumber(20)      TYPE n,
         OrderType(8)         TYPE c,
         Date(8)              TYPE c,

       END OF ts_shipment.

TYPES: BEGIN OF ts_shipmentdetail,
         TrackingNumber(30)     TYPE n,
         Freight(12)            TYPE n,
         Weight(14)             TYPE n,
         ShipmentDate(8)        TYPE c,
         ShipmentMethod(8)      TYPE c,

         END OF ts_shipmentdetail.

TYPES: BEGIN OF ts_productinformation,
         LineNumber(9)          TYPE n,
         SKUNumber(20)          TYPE c,
         OrderedQuantity(14)    TYPE n,
         ShippedQuantity(14)    TYPE n,
         UOM(4)                 TYPE c,

         END OF ts_productinformation.

* Table for the XML content

DATA: gt_itab       TYPE STANDARD TABLE OF char2048.

* Table and work ares for the data from the XML file

DATA: gt_shipment               TYPE STANDARD TABLE OF ts_shipment,
      gs_shipment               TYPE ts_shipment.

DATA: gt_shipmentdetail         TYPE STANDARD TABLE OF ts_shipmentdetail,
      gs_shipmentdetail         TYPE ts_shipmentdetail.

DATA: gt_productinformation     TYPE STANDARD TABLE OF ts_productinformation,
      gs_productinformation     TYPE ts_productinformation.


* Result table that contains references
* of the internal tables to be filled

DATA: gt_result_xml TYPE abap_trans_resbind_tab,
      gs_result_xml TYPE abap_trans_resbind.

* For error handling

DATA: gs_rif_ex     TYPE REF TO cx_root,
      gs_var_text   TYPE string.

* Get the XML file from your client

CALL METHOD cl_gui_frontend_services=>gui_upload
  EXPORTING
    filename                = gs_file
  CHANGING
    data_tab                = gt_itab
  EXCEPTIONS
    file_open_error         = 1
    file_read_error         = 2
    no_batch                = 3
    gui_refuse_filetransfer = 4
    invalid_type            = 5
    no_authority            = 6
    unknown_error           = 7
    bad_data_format         = 8
    header_not_allowed      = 9
    separator_not_allowed   = 10
    header_too_long         = 11
    unknown_dp_error        = 12
    access_denied           = 13
    dp_out_of_memory        = 14
    disk_full               = 15
    dp_timeout              = 16
    not_supported_by_gui    = 17
    error_no_gui            = 18
    OTHERS                  = 19.

IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

* Fill the result table with a reference to the data table.
* Within the XSLT stylesheet, the data table can be accessed with
* "ISHIPMENT".

GET REFERENCE OF gt_shipment INTO gs_result_xml-value.
gs_result_xml-name = 'ISHIPMENT'.
APPEND gs_result_xml TO gt_result_xml.

* Fill the result table with a reference to the data table.
* Within the XSLT stylesheet, the data table can be accessed with
* "ISHIPDET".

GET REFERENCE OF gt_shipmentdetail INTO gs_result_xml-value.
gs_result_xml-name = 'ISHIPDET'.
APPEND gs_result_xml TO gt_result_xml.

* Fill the result table with a reference to the data table.
* Within the XSLT stylesheet, the data table can be accessed with
* "IPRODDET".

GET REFERENCE OF gt_productinformation  INTO gs_result_xml-value.
gs_result_xml-name = 'IPRODDET'.
APPEND gs_result_xml TO gt_result_xml.

* Perform the XSLT stylesheet

TRY.

    CALL TRANSFORMATION z_xml_to_abap3
    SOURCE XML gt_itab
    RESULT (gt_result_xml).

  CATCH cx_root INTO gs_rif_ex.

    gs_var_text = gs_rif_ex->get_text( ).
    MESSAGE gs_var_text TYPE 'E'.

ENDTRY.

* Writing the data from file for gt_shipment
*Collecting the Shipping Data from the XML file to internal table gt_shipment
*and writing the data to the screen

LOOP AT gt_shipment INTO gs_shipment.
  WRITE: / 'VendorNumber:', gs_shipment-VendorNumber.
  WRITE: / 'OrderNumber :', gs_shipment-OrderNumber.
  WRITE: / 'OrderType  :', gs_shipment-OrderType.
  WRITE: / 'Date  :',      gs_shipment-Date.

  WRITE : /.
ENDLOOP. "gt_shipment.



LOOP AT gt_shipmentdetail INTO gs_shipmentdetail.
  WRITE: / 'TrackingNumber:',     gs_shipmentdetail-TrackingNumber.
  WRITE: / 'Freight :',           gs_shipmentdetail-Freight.
  WRITE: / 'Weight  :',           gs_shipmentdetail-Weight.
  WRITE: / 'ShipmentDate  :',     gs_shipmentdetail-ShipmentDate.
* WRITE: / 'ShipmentMethod  :'    gs_shipmentdetail-ShipmentMethod

  WRITE : /.
ENDLOOP. "gt_shipmentdetail.



LOOP AT gt_productinformation INTO gs_productinformation.
  WRITE: / 'LineNumber:',         gs_productinformation-LineNumber.
  WRITE: / 'SKUNumber :',         gs_productinformation-SKUNumber.
  WRITE: / 'OrderedQuantity  :',  gs_productinformation-OrderedQuantity.
  WRITE: / 'ShippedQuantity  :',  gs_productinformation-ShippedQuantity.
  WRITE: / 'UOM  :',              gs_productinformation-UOM.
  WRITE : /.
ENDLOOP. "gt_productinformation.

XSLT Program

.


 
 <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output encoding="iso-8859-1" indent="yes" method="xml" version="1.0"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
      <asx:values>
        <ISHIPMENT>
          <xsl:apply-templates select="//OrderShipment"/>
        </ISHIPMENT>
      </asx:values>
    </asx:abap>
  </xsl:template>

  <xsl:template match="OrderShipment">
    <item>
      <VENDORNUMBER>
        <xsl:value-of select="VendorNumber"/>
      </VENDORNUMBER>
      <ORDERNUMBER>
        <xsl:value-of select="OrderNumber"/>
      </ORDERNUMBER>
      <ORDERTYPE>
        <xsl:value-of select="OrderType"/>
      </ORDERTYPE>
      <DATE>
        <xsl:value-of select="Date"/>
      </DATE>

    </item>
  </xsl:template>

  <xsl:template match="/">
    <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
      <asx:values>
        <ISHIPDET>
          <xsl:apply-templates select="//OrderShipment/ShipmentDetail"/>
        </ISHIPDET>
      </asx:values>
    </asx:abap>
  </xsl:template>

  <xsl:template match="ShipmentDetail">
    <item>
      <TRACKINGNUMBER>
        <xsl:value-of select="TrackingNumber"/>
      </TRACKINGNUMBER>
      <FREIGHT>
        <xsl:value-of select="Freight"/>
      </FREIGHT>
      <SHIPMENTDATE>
        <xsl:value-of select="ShipmentDate"/>
      </SHIPMENTDATE>
      <SHIPMENTMETHOD>
        <xsl:value-of select="ShipmentMethod"/>
      </SHIPMENTMETHOD>

    </item>
  </xsl:template>



</xsl:transform> .

Any help is highly appreciated. If anyone encountered this situation before please let me know where i am going wrong in my XSLT transformation.

Any Help will be highly apppreciated. Thanks in advance

Regards,

Jessica Sam

Edited by: jessica sam on Feb 20, 2009 9:22 PM

Edited by: jessica sam on Feb 22, 2009 5:33 PM

Edited by: jessica sam on Feb 22, 2009 5:35 PM