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>
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>
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
Da der Strukturname mitgeliefert wird ist der "Kontext" nun entscheidend: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.
Code: Alles auswählen.
select = '//TAB1/STRUCTURE1/FELD1'.
select = '//TAB2/STRUCTURE1/FELD1'.
usw.
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>