Code: Alles auswählen.
DATA:
lo_xslt_err TYPE REF TO cx_xslt_exception,
lo_xsltp TYPE REF TO cl_xslt_processor,
lo_ixml TYPE REF TO if_ixml,
lo_stream_factory TYPE REF TO if_ixml_stream_factory,
lo_istream TYPE REF TO if_ixml_istream,
lo_ostream TYPE REF TO if_ixml_ostream.
* iv_xml_xstr
TRY.
CREATE OBJECT lo_xsltp.
lo_ixml = cl_ixml=>create( ).
lo_stream_factory = lo_ixml->create_stream_factory( ).
lo_istream = lo_stream_factory->create_istream_xstring(
string = iv_xml_xstr ).
* set source
CALL METHOD lo_xsltp->set_source_stream
EXPORTING
stream = lo_istream.
* set result
lo_ostream = lo_stream_factory->create_ostream_xstring(
string = ev_csv_xstr ).
CALL METHOD lo_xsltp->set_result_stream( stream = lo_ostream ).
* Run XSLT
CALL METHOD lo_xsltp->run
EXPORTING
progname = iv_xslt_pname.
CATCH cx_xslt_exception INTO lo_xslt_err.
CALL METHOD cx_bbp_bd_meta_bapis_error=>root_to_pd_error
EXPORTING
io_exception = lo_xslt_err
IMPORTING
et_messages = et_message.
ENDTRY.
zora20 hat geschrieben:Hallo an alle,
kennt sich jemand mit dem Handling vom XML und ABAP aus?
Ich habe nämlich folgendes Problem:
Ich möchte eine XML-Datei einlesen und mit einer xslt-Transformation in eine html-Seite umwandeln.
Mit dem xslt-Editor funktioniert alles einwandfrei. MEin Problem ist aber, dass ich diese Transformation in meinem ABAP-Programm benötige. In einem Buch hab ich auch die benötigten Klassen gefunden.
Ich hab das Beispiel dort auf meine Bedürfnisse angepasst.
Es fliegt "nur" einer Exception an der Stelle xsltp->run. Hab bsi zu der Stelle debuggt (System) dort sind allerdings alle Parameter gefüllt. Weiß nur nicht ob die Werte korrekt sind (alles ein wenig kryptisch).
Zur besseren Verständigung hier die einzelnen Elemente:
XML-Datei:
<seite>
<Dienste>
<Dienst>
<Name>Uebungen</Name>
<Standort>Ludwigshafen</Standort>
<Hinweis>Dies ist ein Test</Hinweis>
</Dienst>
</Dienste>
<Infos>
<Info>
<Einschalten>ja</Einschalten>
<Text>Dies ist der erste Test mit XML</Text>
</Info>
</Infos>
</seite>
xslt-Transformation:
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sapxsl="http://www.sap.com/sapxsl"
>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<html>
<head>
<title>Generische Startseite des Portals</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="Dienste">
<table width="100%">
<tr>
<xsl:for-each select="./Dienst">
<td>
<xsl:value-of select="./Name"/>
</td>
<td>
<xsl:value-of select="./Standort"/>
</td>
<td>
<xsl:value-of select="./Hinweis"/>
</td>
</xsl:for-each>
</tr>
</table>
</xsl:template>
<xsl:template match="Infos">
<table width="100%">
<xsl:for-each select="./Info">
<xsl:if test="./Einschalten = 'ja'">
<tr>
<td>
<xsl:value-of select="./Text"/>
</td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
</xsl:transform>
ABAP-Methode:
method TRANSFORM_XML .
DATA: xsltp TYPE REF TO cl_xslt_processor,
ixml TYPE REF TO if_ixml,
stream_factory TYPE REF TO if_ixml_stream_factory,
encoding TYPE REF TO if_ixml_encoding,
tabelle TYPE TABLE OF String,
tabline TYPE string,
srcstr TYPE REF TO if_ixml_istream,
resstr TYPE REF TO if_ixml_ostream,
result TYPE string.
DATA:
*'/home/yhrd/xhrd001/test/U7D1301/ausgabe.txt',
indat TYPE c LENGTH 50 VALUE
'/home/yhrd/xhrd001/test/U0DH501/hinweisansi.txt',
linesize TYPE i,
size TYPE i.
* hole mir den xslt-Prozessor
TRY.
CREATE OBJECT xsltp.
CATCH cx_xslt_exception.
ENDTRY.
* initialisiere die XML-Klassen
ixml = cl_ixml=>create( ).
stream_factory = ixml->create_stream_factory( ).
encoding = ixml->create_encoding(
byte_order = 0
character_set = 'SAP*').
* lese die XML-Datei ein und schreibe sie in eine Tabelle
OPEN DATASET indat FOR INPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc = 8.
EXIT.
ENDIF.
size = 0.
* aus Datei in eine Tabelle voller Strings lesen
DO.
READ DATASET indat INTO tabline.
IF sy-subrc <> 0.
EXIT.
ENDIF.
APPEND tabline TO tabelle.
* Länge ermitteln
DESCRIBE FIELD tabline LENGTH linesize IN BYTE MODE.
size = size + linesize.
ENDDO.
CLOSE DATASET indat.
IF sy-subrc <> 0.
ENDIF.
* erzeuge einen Stream für den xslt-Prozessor
srcstr = stream_factory->create_istream_itable(
table = tabelle
size = size ).
TRY.
CALL METHOD xsltp->set_source_stream
EXPORTING stream = srcstr.
CATCH cx_xslt_exception.
EXIT.
ENDTRY.
* initialsiere den Output
TRY.
resstr = stream_factory->create_ostream_cstring( string = result ).
CALL METHOD resstr->set_encoding( encoding = encoding ).
CALL METHOD xsltp->set_result_stream( stream = resstr ).
CATCH cx_xslt_exception.
EXIT.
ENDTRY.
CALL METHOD xsltp->run
EXPORTING progname = 'zdh5_xsl_startseite'.
endmethod.
Wäre für jede Hilfe dankbar
Gruß zora20