Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Problem converting XML back to structure using XSLT

0 Likes
785

hi experts,

I am currently trying to convert this xml file back to my structure but i have been unsuccessful so far. Initially i keep getting illegal operation but now i manage to retrieve only part of my xml data(2nd record). Please enlighten, thank you~!

my structure:

types: begin of data_t,

key1(10),

key2(10),

CONTENT1(20),

CONTENT2(20),

end of data_t.

types: data_det type data_t occurs 0.

types: begin of i_det,

data_detail type data_det,

end of i_det.

data: I_DATA type table of i_det.

my xml file:

<?xml version="1.0" encoding="iso-8859-1"?>

<asx:abap xmlns:asx="http://www.sap.com/abapxml">

<asx:values>

<I_DATA>

<DETAIL>

<KEY1>John</KEY1>

<KEY2>Smith</KEY2>

<CONT>

<CONTENT1>RICK ROAD</CONTENT1>

<CONTENT2>Japan</CONTENT2>

</CONT>

</DETAIL>

<DETAIL>

<KEY1>Micheal</KEY1>

<KEY2>June</KEY2>

<CONT>

<CONTENT1>PAN ROAD</CONTENT1>

<CONTENT2>England</CONTENT2>

</CONT>

</DETAIL>

</I_DATA>

</asx:values>

</asx:abap> my xslt:

<xsl:transform version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:sap="http://www.sap.com/abapxml"

>

<xsl:template match="/">

<asx:abap xmlns:asx="http://www.sap.com/abapxml">

<asx:values>

<I_DATA>

<I_DATA>

<xsl:for-each select="//DETAIL">

<KEY1><xsl:value-of select="KEY1"/></KEY1>

<KEY2><xsl:value-of select="KEY2"/></KEY2>

<CONTENT1><xsl:value-of select="CONT/CONTENT1"/></CONTENT1>

<CONTENT2><xsl:value-of select="CONT/CONTENT2"/></CONTENT2>

</xsl:for-each>

</I_DATA>

</I_DATA>

</asx:values>

</asx:abap>

</xsl:template>

</xsl:transform>

Point will be awarded, thank you again~!

1 ACCEPTED SOLUTION
Read only

athavanraja
Active Contributor
0 Likes
311

if i had understood your question correctly, you are having problem transfomring XML into nested ITAB. here is a complete code sample for such a case.

<u><b>XSLT Program</b></u>

Named as "YCOMPLEX_XML_TO_ABAP"

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/abapxml" version="1.0">
  <xsl:template match="//I_DATA">
    <asx:abap xmlns:asx="http://www.sap.com/abapxml">
      <asx:values>
        <I_DATA>

          <xsl:for-each select="DETAIL">
            <I_DATA1>
              <KEY1>
                <xsl:value-of select="KEY1"/>
              </KEY1>
              <KEY2>
                <xsl:value-of select="KEY2"/>
              </KEY2>
              <CONT>

                <xsl:for-each select="CONT">
                  <CONT1>
                    <CONTENT1>
                      <xsl:value-of select="CONTENT1"/>
                    </CONTENT1>
                    <CONTENT2>
                      <xsl:value-of select="CONTENT2"/>
                    </CONTENT2>
                  </CONT1>
                </xsl:for-each>

              </CONT>
            </I_DATA1>
          </xsl:for-each>

        </I_DATA>
      </asx:values>
    </asx:abap>
  </xsl:template>
</xsl:transform>

<u><b>ABAP Program to test the transformation</b></u>

REPORT  y_test_xml_tran.
TYPES: BEGIN OF con ,
       content1(20),
content2(20),
END OF con .
TYPES: contype TYPE con OCCURS 0.

TYPES: BEGIN OF i_det,
key1(10),
key2(10),
cont TYPE contype ,
END OF i_det.
DATA: i_data TYPE TABLE OF i_det.

DATA: xml_string TYPE string .
DATA: xslt_error	TYPE REF TO	cx_xslt_exception,
xslt_message	TYPE	string .

CLEAR xml_string .
CONCATENATE

`<?xml version="1.0" encoding="utf-8"?>`
`<asx:abap xmlns:asx="http://www.sap.com/abapxml">`
`<asx:values>`
`<I_DATA>`
`<DETAIL>`
`<KEY1>John</KEY1>`
`<KEY2>Smith</KEY2>`
`<CONT>`
`<CONTENT1>RICK ROAD</CONTENT1>`
`<CONTENT2>Japan</CONTENT2>`
`</CONT>`
`<CONT>`
`<CONTENT1>RICK ROAD1</CONTENT1>`
`<CONTENT2>Japan1</CONTENT2>`
`</CONT>`
`<CONT>`
`<CONTENT1>RICK ROAD2</CONTENT1>`
`<CONTENT2>Japan2</CONTENT2>`
`</CONT>`
`</DETAIL>`
`<DETAIL>`
`<KEY1>Micheal</KEY1>`
`<KEY2>June</KEY2>`
`<CONT>`
`<CONTENT1>PAN ROAD</CONTENT1>`
`<CONTENT2>England</CONTENT2>`
`</CONT>`
`<CONT>`
`<CONTENT1>PAN ROAD1</CONTENT1>`
`<CONTENT2>England1</CONTENT2>`
`</CONT>`
`</DETAIL>`
`</I_DATA>`
`</asx:values>`
`</asx:abap>`
INTO xml_string .


TRY .
    CALL TRANSFORMATION (`YCOMPLEX_XML_TO_ABAP`)
    SOURCE XML  xml_string
    RESULT     i_data = i_data.
  CATCH cx_xslt_exception INTO xslt_error.
    xslt_message = xslt_error->get_text( ).
ENDTRY.

Hope this helps.

Regards

Raja

1 REPLY 1
Read only

athavanraja
Active Contributor
0 Likes
312

if i had understood your question correctly, you are having problem transfomring XML into nested ITAB. here is a complete code sample for such a case.

<u><b>XSLT Program</b></u>

Named as "YCOMPLEX_XML_TO_ABAP"

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/abapxml" version="1.0">
  <xsl:template match="//I_DATA">
    <asx:abap xmlns:asx="http://www.sap.com/abapxml">
      <asx:values>
        <I_DATA>

          <xsl:for-each select="DETAIL">
            <I_DATA1>
              <KEY1>
                <xsl:value-of select="KEY1"/>
              </KEY1>
              <KEY2>
                <xsl:value-of select="KEY2"/>
              </KEY2>
              <CONT>

                <xsl:for-each select="CONT">
                  <CONT1>
                    <CONTENT1>
                      <xsl:value-of select="CONTENT1"/>
                    </CONTENT1>
                    <CONTENT2>
                      <xsl:value-of select="CONTENT2"/>
                    </CONTENT2>
                  </CONT1>
                </xsl:for-each>

              </CONT>
            </I_DATA1>
          </xsl:for-each>

        </I_DATA>
      </asx:values>
    </asx:abap>
  </xsl:template>
</xsl:transform>

<u><b>ABAP Program to test the transformation</b></u>

REPORT  y_test_xml_tran.
TYPES: BEGIN OF con ,
       content1(20),
content2(20),
END OF con .
TYPES: contype TYPE con OCCURS 0.

TYPES: BEGIN OF i_det,
key1(10),
key2(10),
cont TYPE contype ,
END OF i_det.
DATA: i_data TYPE TABLE OF i_det.

DATA: xml_string TYPE string .
DATA: xslt_error	TYPE REF TO	cx_xslt_exception,
xslt_message	TYPE	string .

CLEAR xml_string .
CONCATENATE

`<?xml version="1.0" encoding="utf-8"?>`
`<asx:abap xmlns:asx="http://www.sap.com/abapxml">`
`<asx:values>`
`<I_DATA>`
`<DETAIL>`
`<KEY1>John</KEY1>`
`<KEY2>Smith</KEY2>`
`<CONT>`
`<CONTENT1>RICK ROAD</CONTENT1>`
`<CONTENT2>Japan</CONTENT2>`
`</CONT>`
`<CONT>`
`<CONTENT1>RICK ROAD1</CONTENT1>`
`<CONTENT2>Japan1</CONTENT2>`
`</CONT>`
`<CONT>`
`<CONTENT1>RICK ROAD2</CONTENT1>`
`<CONTENT2>Japan2</CONTENT2>`
`</CONT>`
`</DETAIL>`
`<DETAIL>`
`<KEY1>Micheal</KEY1>`
`<KEY2>June</KEY2>`
`<CONT>`
`<CONTENT1>PAN ROAD</CONTENT1>`
`<CONTENT2>England</CONTENT2>`
`</CONT>`
`<CONT>`
`<CONTENT1>PAN ROAD1</CONTENT1>`
`<CONTENT2>England1</CONTENT2>`
`</CONT>`
`</DETAIL>`
`</I_DATA>`
`</asx:values>`
`</asx:abap>`
INTO xml_string .


TRY .
    CALL TRANSFORMATION (`YCOMPLEX_XML_TO_ABAP`)
    SOURCE XML  xml_string
    RESULT     i_data = i_data.
  CATCH cx_xslt_exception INTO xslt_error.
    xslt_message = xslt_error->get_text( ).
ENDTRY.

Hope this helps.

Regards

Raja