‎2006 Oct 12 2:20 AM
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~!
‎2006 Oct 15 10:51 AM
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
‎2006 Oct 15 10:51 AM
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