ABAP XML und XSLT-Transformation

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
13 Beiträge • Seite 1 von 1
13 Beiträge Seite 1 von 1

ABAP XML und XSLT-Transformation

Beitrag von zora20 (ForumUser / 5 / 0 / 0 ) »
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

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von Gast ( / / 0 / 3 ) »
Hallo,

folgede Coding funktioniert bei uns:

P.S: in iv_xml_xstr ist die XML in binär form .

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.
Viel Glück!

Beitrag von zora20 (ForumUser / 5 / 0 / 0 ) »
Danke für die schnelle Antwort.

HAb da aber noch ein Problem.
Ich lese die Datei jetzt in Binärform in einen xstring ein.
Dies funktioniert auch.
Hab ansonsten den oben genannten Quellcode übernommen.
Bei mir ist iv_xml_xstr das eingelesene File in xstring,
ev_csv_xstr eine Variable vom Typ xstring
und ix_xslt_pname der Wert 'zdh5_xsl_startseite'.

Der Aufruf der Methode lo_xsltp->run
liefert folgende Exception im Debug-Mode
Fehlermeldung: Error SYSTEM_CORE_DUMPED occured. P1=11 ( Abbruchsart: RABAX_STATE )
und die Fehlermeldung ohne Debug
Fehlermeldung: Es ist eine Ausnahme aufgetreten, die nicht abgefangen wurde. ( Abbruchsart: RABAX_STATE ).

Weiß jemand eine Lösung?

Gruß

zora20

Beitrag von Hermann ( / / 0 / 3 ) »
Kannst Du mal schauen, ob Du in der ST22 im Dump evtl. Hinweise auf die Codingstelle (Codingausschnitt) findest und hier posten?

Hermann

Beitrag von Gast ( / / 0 / 3 ) »
Hört sich nach Kernel-Problem an. Schau mal Hinweis 460437.

Beitrag von deDieter ( / / 0 / 3 ) »
genau das wollte ich auch gerade fragen... Welche Kernelversion hast du denn?
MfG deDieter

Beitrag von zora20 (ForumUser / 5 / 0 / 0 ) »
Danke erstmal.

Ich weiß nicht genau, wo man die Kernelpatch Version finden kann.

Hab was unter System->Status gefunden.

Der Eintrag lautet:
SAP_BASIS 620 0039 SAPKB62039 SAP Basiskomponente

Hilft dies weiter?

Beitrag von Gast ( / / 0 / 3 ) »
Transaktion SM51.
Cursor auf eine Instanz stellen und Button "Release-Info" drücken

Beitrag von Gast ( / / 0 / 3 ) »
OK.

Der Kernelpatch lautet:

SAP R/3 Kernel 620
Kernel Patchnummer 1363

xslt transformation

Beitrag von gohome (ForumUser / 1 / 0 / 0 ) »
hallo zora20

bist du schon weitergekommen mit deinem problem oder kann man dir noch helfen?

Re: ABAP XML und XSLT-Transformation

Beitrag von Gast ( / / 0 / 3 ) »
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

Beitrag von kirmuh (ForumUser / 64 / 0 / 0 ) »
hallo ich hab eine frage, kann ich das angegebene coding auch verwenden wenn mein xml in einer variablen vom typ string ist, verwenden?

ich habe mein xml in ein lf_string gezogen und würde gerne auf die einzelnen tags vom xml zugreifen, geht das mit dem xslt transformator?

XSLT mit SAP

Beitrag von terrabyte (ForumUser / 1 / 0 / 0 ) »
Hallo

Um im Dump eine aussagekräftige Information zu erhalten, müssen Sie den CATCH Block deaktivieren. So wird in der ST22 genau das TAG angezeigt, wo der Fehler auftritt. Mit diesen Problemen haen wir auch gekämpft, aber es geht. Meines Wissens kann kein Binärstring in die Transformation übergeben werden. Diesen können Sie aber umwandeln in einen String. Wenn Sie den Dump in der ST22 haben, dann Posten Sie Ihn doch bitte ins Forum. Aber nur der Ersteteil in wechem man den Tagnamen sieht.

Wenn de Einstieg im Transformation richtig ist, kann man die Transformation auch Debugen und sieht genau wo der Haken liegt. Wenn sie nicht in den Debug modus kommen, kann es daran liegen, dass die ersten Zeilen des XSLT schon falsch sind.

Der Kernal Fehler der hier angesprochen wird tritt mienes Wissen auch nur auf, wenn ein Speicherüberlauf vorhanden ist.

Ich werde versuchen das Problem auf unserem System nach zu bilden. Sollten Sie schon eine Löseung haben, währe ich um ein Feedback froh.

Mit freundlichen Grüssen

Seite 1 von 1

Vergleichbare Themen

7
Antw.
6425
Views
XSLT SIMPLE Transformation
von Prego » 19.04.2010 12:16 • Verfasst in ABAP® Core
1
Antw.
2403
Views
XSLT Transformation CAMT.053.001.02
von Ben2408 » 22.07.2022 10:25 • Verfasst in Financials
1
Antw.
2478
Views
Call Transformation (XSLT)
von Prego » 19.11.2010 14:03 • Verfasst in ABAP® Core
1
Antw.
2050
Views
XSLT (CALL TRANSFORMATION)
von MarkusW » 20.03.2007 14:52 • Verfasst in ABAP Objects®
2
Antw.
991
Views
Transaktion STRANS - XSLT-Transformation ändern
von ralf.wenzel » 21.01.2022 12:09 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

Daten an Tabelle binden
vor 8 Stunden von Bright4.5 3 / 1482
Regex in where
vor 10 Stunden von tar 6 / 152

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Daten an Tabelle binden
vor 8 Stunden von Bright4.5 3 / 1482
Regex in where
vor 10 Stunden von tar 6 / 152

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9821