Mit xsl:for-each über inner table loopen

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Getting started ... Alles für einen gelungenen Start.
4 Beiträge • Seite 1 von 1
4 Beiträge Seite 1 von 1

Mit xsl:for-each über inner table loopen

Beitrag von sapnup (ForumUser / 42 / 14 / 12 ) »
Hallo zusammen,

ich bin neu in der ABAP-Welt und kämpfe mich gerade an folgender Problemstellung ab:

Ich baue an einer XSLT welche Daten aus ABAP-Strukturen (eine Zeile) und einer internen Tabelle (mehrere Zeilen) in ein XML-Format bringt. Hier die wesentlichen Code-Auszüge:

Code: Alles auswählen.

..
* diese Struktur erlaubt es mir mit XPath auf ABAP-Daten zu arbeiten
gt_source TYPE abap_trans_srcbind_tab,
gs_source TYPE abap_trans_resbind.
..
* eine Tabelle und eine Struktur
gt_tab TYPE TABLE OF my_tab,
gs_struct TYPE my_struct,
..
* hier fülle ich meine Zauberstruktur
GET REFERENCE OF gs_struct INTO gs_source-value.
gs_source-name = 'STRUCT'.
APPEND gs_source TO gt_source.

GET REFERENCE OF gt_tab INTO gs_source-value.
gs_source-name = 'TAB'.
APPEND gs_source TO gt_source.
..
* und rufe irgendwann die Transformation auf
CALL TRANSFORMATION ZZ_MY_XSLT
SOURCE (gt_source)
RESULT XML gv_raw_xml.

* nachfolgend die Transformation:

<MyXml>
* hier lese ich einen Feldwert aus der Struktur in ein XML-Element als CDATA ein. Das funktioniert auch wunderbar.
    <MyElementOne>
	<xsl:value-of select="//STRUCT/SOME_FLD_VAL"/>
    </MyElementOne>
..
* und hier will ich für jeden Datensatz der Tabelle TAB das selbe machen wie zuvor mit der Struktur - weiß aber nicht wie
   <xsl:for-each select="//TAB(Zeilenindex)">
        <MyElementTwo>
                   <xsl:value-of select="//STRUCT(Zeile XYZ)/SOME_FLD_VAL"/>
        </MyElementTwo>
   </xsl:for-each>
</MyXML> 

Also, wie im Code schon angedeutet, suche ich nach einer Möglichkeit mit der xsl:for-each Anweisung über eine interne Tabelle zu loopen und für jeden Datensatz der Tabelle ein XML-Element anzulegen - ich weiß aber nicht wie. Google hat mir bisher auch nicht weiter helfen können. Falls hier jemand eine Idee hat, immer her damit und Danke im Voraus.

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


Re: Mit xsl:for-each über inner table loopen

Beitrag von a-dead-trousers (Top Expert / 4287 / 214 / 1142 ) »
Hmmm...
Nimm mir das jetzt nicht böse, aber bist du im XSLT Umfeld auch noch Anfänger?
- Normalerweise bildet man eine Transformation über die Templates ab.
- Eine Selektion irgendwohin im Dokument (\\) sollte man aus Performancegründen ganz vermeiden.

Kleiner Tipp:
Gib deine Daten mit CALL TRANSFORMATION ID in einen String aus und schau dir mal das XML (asXML-Format) an das ABAP intern generiert.

Ich würde das XSLT ungefähr so schreiben:

Code: Alles auswählen.

<xsl:template match="/">
<MyXml>
  <xsl:apply-templates>
</MyXml>
</xsl:template>

<xsl:template match="STRUCT">
<MyElementOne>
  <xsl:apply-templates>
</MyElementOne>
</xsl:template>

<xsl:template match="TAB">
<MyElementTwo>
  <xsl:apply-templates>
</MyElementTwo>
</xsl:template>

<xsl:template match="LINE_TYPE_OF_TAB">
<MyElementLine>
  <xsl:apply-templates>
</MyElementLine>
</xsl:template>
LINE_TYPE_OF_TAB ist der Name des Tags einer Zeile deiner Tabelle wobei hier meist der Strukturname aus dem ABAP DDIC verwendet wird. Wie gesagt, schau dir das XML mit der Transformation ID mal an und bau dann darauf deine XSLT Transformation.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Mit xsl:for-each über inner table loopen

Beitrag von sapnup (ForumUser / 42 / 14 / 12 ) »
Hi ADT,

ich nehme es dir überhaupt nicht böse. Bezüglich der Templates hast du natürlich vollkommen Recht, ich hab es nur aus Platzgründen auf das wesentliche Minimum runtergekocht. Bezüglich der Navigation von der Wurzel aus und den Performancegründen hast du generell auch Recht, wobei es hier darauf ankommt groß die XML ist, wie sie aufgebaut ist und wieviel Treffer man erwartet. Wenn deine Zielknoten sich nahe an der Wurzel befinden und der Baum nicht zu sehr auswuchert ist das m.E. kein Problem.

Das Wichtigste ist, dass du auch mit der CALL TRANSFORMATION ID Recht hast :). Ich bin gestern auch irgenwo in den Untiefen des www über diese Lösung gestollpert. Hier die Zusammenfassung für interessierte Mitleser:

Code: Alles auswählen.

..
* gegeben sei eine interne Tabelle die zu XML verwurstet werden soll
gt_tab TYPE TABLE OF my_tab,
..
* dazu zunächst:
CALL TRANSFORMATION ID
SOURCE TAB = gt_tab
RESULT XML gv_tab_xml. * ist eine string variable
* ein Blick in den Debugger zeigt uns, dass CALL TRANSFORMATION ID unsere Tabelle
* in eine Waschechte XML umgewandelt hat wobei jeder Datensatz der Tabelle in einem "item"-Element
* abgelet wird

* jetzt noch den XML String in die Übergabestruktur geben
GET REFERENCE OF gv_tab_xml INTO gs_source-value.
gs_source-name = 'XML'.
APPEND gs_source TO gt_source.
..
* und die Transformation aufrufen
CALL TRANSFORMATION ZZ_MY_XSLT
SOURCE (gt_source)
RESULT XML gv_raw_xml.

* nun zur Transformation:
<MyXml>
..
* hier kann jedes Feld eines Datensatzes wie folgt ausgelesen werden
   <xsl:for-each select="//item">
        <MyElementTwo>
                   <xsl:value-of select="FELDNAME/text()" />
        </MyElementTwo>
   </xsl:for-each>
</MyXML>
* wobei die Anmerkungen von ADT (generell) zu beachten sind
Jetzt bleibt noch die Frage offen, was ist wenn ich mehrere interene Tabellen mit gleichen Feldern auf diese Weise in eine Transformation hinzugebe und in der Transformation zwischen den einzelnen Tabellen unterscheiden will? XML-mäßig sind die ja alle gleich aufgebaut und einen Variablennamen schleppt CALL TRANSFORMATION ID nicht mit in die XML.

Re: Mit xsl:for-each über inner table loopen

Beitrag von a-dead-trousers (Top Expert / 4287 / 214 / 1142 ) »
sapnup hat geschrieben:Jetzt bleibt noch die Frage offen, was ist wenn ich mehrere interene Tabellen mit gleichen Feldern auf diese Weise in eine Transformation hinzugebe und in der Transformation zwischen den einzelnen Tabellen unterscheiden will? XML-mäßig sind die ja alle gleich aufgebaut und einen Variablennamen schleppt CALL TRANSFORMATION ID nicht mit in die XML.
Da der Strukturname mitgeliefert wird ist der "Kontext" nun entscheidend:

Code: Alles auswählen.

select = '//TAB1/STRUCTURE1/FELD1'.
select = '//TAB2/STRUCTURE1/FELD1'.
usw.
Wie ich schon gesagt hab, wäre das mit TEMPLATE und MATCH übersichtlicher abbildbar:

Code: Alles auswählen.

  <xsl:template match="/">
    <MyXml>
      <xsl:apply-templates>
    </MyXml>
  </xsl:template>

  <xsl:template match="TAB1|TAB2">
    <MyElementTab>
      <xsl:apply-templates>
    </MyElementTab>
  </xsl:template>

  <xsl:template match="STRUCTURE1">
    <MyElementLine>
      <xsl:apply-templates>
    </MyElementLine>
  </xsl:template>

  <xsl:template match="TAB1/STRUCTURE1/FIELD1">
    <MyElementFieldTab1>
      <xsl:apply-templates>
    </MyElementFieldTab1>
  </xsl:template>

  <xsl:template match="TAB2/STRUCTURE1/FIELD1">
    <MyElementFieldTab2>
      <xsl:apply-templates>
    </MyElementFieldTab2>
  </xsl:template>
Alternativ kann man auch das MODE-Attribut bei TEMPLATE und APPLY-TEMPLATES für die Aussteuerung der Sonderfälle verwenden.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Seite 1 von 1

Vergleichbare Themen

3
Antw.
3541
Views
Über feldsymbol loopen?
von Zubasa » 17.05.2011 08:09 • Verfasst in ABAP® für Anfänger
1
Antw.
218
Views
Select-Option Auswahl loopen
von kaim77 » 07.06.2023 18:54 • Verfasst in ABAP® für Anfänger
7
Antw.
2356
Views
Problem beim Loopen einer internen Tabelle
von kurdy91x » 14.08.2014 12:32 • Verfasst in ABAP® für Anfänger
1
Antw.
4734
Views
sorted table, hashed table: Übergabe Workarea -> Performa
von Jürgen Fischer » 30.01.2006 08:09 • Verfasst in ABAP® Core
5
Antw.
9512
Views
standard table vs. sorted table
von ralf.wenzel » 31.07.2014 12:49 • Verfasst in ABAP® Core

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Updates der Daten, Fehlermeldung
vor 23 Stunden von Egzon gelöst 1 / 50
Wie benutze ich COMMIT WORK richtig
vor 2 Tagen von msfox 17 / 431

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

Updates der Daten, Fehlermeldung
vor 23 Stunden von Egzon gelöst 1 / 50
Wie benutze ich COMMIT WORK richtig
vor 2 Tagen von msfox 17 / 431

Unbeantwortete Forenbeiträge

Updates der Daten, Fehlermeldung
vor 23 Stunden von Egzon 1 / 50
Zwischensumme Adobe Forms
vor 5 Wochen von Lucyalison 1 / 269
Group Items auf einer Filterbar
letzen Monat von Bright4.5 1 / 321