Show TOC Anfang des Inhaltsbereichs

Syntaxdokumentation Interne Tabellen  Dokument im Navigationsbaum lokalisieren

Die Serialisierung und Deserialisierung einer internen Tabelle erfolgt in einer Schleife, die den aktuellen Knoten auf die aktuelle Tabellenzeile setzt:

 

<tt:loop [ref=“node“] [name=“alias“]>

  ...

</tt:loop>

 

Mit dem optionalen Attribut ref kann der aktuelle Knoten für den Befehl bestimmt werden. Ohne die Angabe von ref wird implizit der aktuelle Knoten des umgebenden Elements verwendet. Das ABAP-Datenobjekt, das an den aktuellen Knoten angebunden ist, muss eine interne Tabelle sein.

Mit dem Attribut name kann ein Aliasname alias für den aktuellen Knoten innerhalb der Schleife definiert werden. In der <tt:loop>-Schleife ist der aktuelle Knoten dann über $alias ansprechbar. Bei geschachtelten Schleifen erlaubt der Aliasname es, auf die aktuellen Knoten äußerer Schleifen zuzugreifen. Bei nur einer Schleife bzw. in der äußersten Schleife ist $alias beim Eintritt in die Schleife gleichbedeutend zu $ref.

Serialisierung

Bei der Serialisierung wird eine Schleife über die gesamte interne Tabelle ausgeführt. Ist die interne Tabelle leer, wird die Verarbeitung hinter dem Element fortgesetzt. Bei jedem Schleifendurchlauf wird der aktuelle Knoten einen Datenknoten weiter gesetzt und die aktuelle ABAP-Tabellenzeile an den Datenknoten angebunden. Für jeden Datenknoten wird der Inhalt des Elements <tt:loop> prozessiert, der beliebige Template-Elemente enthalten kann.

Deserialisierung

Bei der Deserialisierung wird die ABAP-Tabelle initialisiert und der Inhalt des Elements <tt:loop> ebenfalls in einer Schleife ausgeführt. Er wird solange fortlaufend auf dem XML-Dokument prozessiert, bis dort eine Stelle kommt, die nicht mit dem Inhalt des Elements bearbeitet werden kann. Für jeden Schleifendurchgang wird in der angebundenen ABAP-Tabelle eine neue Zeile erzeugt und diese an den aktuellen Knoten angebunden. Die im aktuellen Schleifendurchgang deserialiserten XML-Werte werden an die aktuelle Tabellenzeile übergeben.

Hinweis

Falls die Transformation interner Tabellen deserialisierbar sein soll, ist insbesonderer bei geschachtelten <tt:loop>-Schleifen darauf zu achten, dass die Ausführung einer Schleife ordnungsgemäß beendet werden kann. Dies ist dann der Fall, wenn der Inhalt eines <tt:loop>-Elements mit den zu deserialisierenden Abschnitten abgeglichen werden kann. Falls die XML-Elemente in einer Schleife dazu nicht ausreichen, kann beispielsweise der gesamte Schleifenkörper mit einem literalen XML-Element umschlossen werden, wodurch eine bei der Deserialisierung auswertbare Hierarchiebene definiert wird.

Achtung

Ein Datenknoten darf in einer Simple Transformation entweder ausschließlich oder gar nicht als interne Tabelle behandelt werden. Dies gilt insbesondere auch für die Aufteilung eines Templates in verschiedene Transformationsrichtungen.

Beispiel

In folgender symmetrischer Simple Transformation werden die interne Tabelle, die an die Datenwurzeln ROOT angebunden ist, und ihre tabellenartige Komponente values in zwei geschachtelten <tt:loop>-Schleifen serialisiert und deserialisiert. In der äußeren Schleife ist zur Demonstration ein Aliasname line definiert, der in der Schleife über $line angesprochen wird. Da $line in der inneren Schleife nicht angesprochen wird, wäre die Definition des Aliasnamens hier eigentlich nicht notwendig.

 

<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">

  <tt:root name="ROOT"/>

  <tt:template>
    <tab1>
      <tt:loop ref=".ROOT" name="line">
        <key>
          <tt:value ref="$line.key" />
        </key>
        <tab2>
          <tt:loop ref="$line.values">
            <value>
              <tt:value />
            </value>
          </tt:loop>
        </tab2>
      </tt:loop>
    </tab1>
  </tt:template>

</tt:transform>

 

Folgendes ABAP-Programm kann die Transformation aufrufen:

 

DATA xml_string TYPE string.
DATA: BEGIN OF line,
        key TYPE i,
        values TYPE TABLE OF i,
      END OF line.
DATA num TYPE i.
DATA itab LIKE TABLE OF line.
DATA result LIKE itab.

DO 3 TIMES.
  CLEAR line.
  line-key = sy-index + 1.
  num = line-key ** 2.
  APPEND num TO line-values.
  num = line-key ** 3.
  APPEND num TO line-values.
  num = line-key ** 4.
  APPEND num TO line-values.
  APPEND line TO itab.
ENDDO.

 

CALL TRANSFORMATION ...
  SOURCE root = itab
  RESULT XML xml_string.

 

cl_abap_browser=>show_xml( EXPORTING xml_string = xml_string ).

 

CALL TRANSFORMATION ...
  
SOURCE XML xml_string
  RESULT root = result.

 

Das Ergebnis der Serialisierung ist wie folgt:

 

<tab1>
  <key>2</key>
  <tab2>
    <value>4</value>
    <value>8</value>
    <value>16</value>
  </tab2>
  <key>3</key>
  <tab2>
    <value>9</value>
    <value>27</value>
    <value>81</value>
  </tab2>
  <key>4</key>
  <tab2>
    <value>16</value>
    <value>64</value>
    <value>256</value>
  </tab2>
</tab1>

 

Nach der Deserialisierung enthält result den gleichen Inhalt wie itab.

Ende des Inhaltsbereichs