Show TOC Anfang des Inhaltsbereichs

Syntaxdokumentation Unter-Templates aufrufen  Dokument im Navigationsbaum lokalisieren

Ein Unter-Template tmpl kann in einem beliebigen anderen Template mit dem ST-Befehl tt:apply aufgerufen werden:

 

<tt:apply name="tmpl" [ref="node"]>
  [<tt:with-root name
="root1" [ref="node1"] />
   <tt:with-root name
="root2" [ref="node2"] />
   ...]
  [<tt:with-parameter name
="para1" [ref="node1"|val="val1"|var="var1"] />
   <tt:with-parameter name
="para2" [ref="node2"|val="val2"|var="var2"] />
   ...]
</tt:apply>

 

Das Unter-Template wird bei Ausführung des einbindenden Templates an dieser Stelle prozessiert.

 

     Wenn im aufgerufenen Unter-Template eigene Datenwurzeln mit tt:root deklariert sind, können diese mit dem ST-Befehl tt:with-root gesetzt werden. Die Angabe des optionalen Attributs ref ist dann im Befehl apply nicht möglich. tt:with-root setzt die Datenwurzel des in name angegebenen Namens auf den in ref angegeben Knoten, bzw. bindet die Datenwurzel an das ABAP-Datenobjekt, das aktuell an den angegebenen Knoten gebunden ist. Falls ref nicht angegeben ist, wird der aktuelle Knoten des aufrufenden Template verwendet. Lokale Datenwurzeln, an die kein Knoten angebunden wird, bleiben undefiniert, d.h. sie verweisen auf kein ABAP-Datenobjekt. Zu Beginn eines solchen Unter-Templates ist der aktuelle Knoten undefiniert.

     Wenn in einem Unter-Template tmpl keine eigenen Datenwurzeln mit tt:root deklariert sind, wird der Wurzelknoten der Baumstruktur des aufgerufenen Unter-Templates entweder explizit mit dem optionalen Attribut ref oder implizit auf den aktuellen Knoten des aufrufenden Templates an der Aufrufstelle gesetzt.

     Wenn im aufgerufenen Unter-Template Formalparameter mit tt:parameter deklariert sind, können diese mit dem ST-Befehl tt:with-parameter mit Aktualparametern verknüpft werden werden. Als Aktualparameter können mit ref Datenwurzeln, mit var Variablen und mit val Werte angegeben werden. Je nach Art des Formalparameters werden die Werte der angegebenen Aktualparameter beim Aufruf übergeben bzw. bei Beendigung des Unter-Templates übernommen (siehe Beispiel unten).

Dabei kann die Parameterübergabe als ein Spezialfall der Zuweisung verstanden werden, d.h. es gilt das gleiche Prinzip wie bei tt:assign:

     Die Zuweisung mit Datenknoten als Ziel ist nur bei Deserialisierung möglich.

     Die Zuweisung mit Datenknoten als Quelle ist nur bei der Serialisierung möglich.

 

Beispiele ohne Parameterübergabe

Die folgende Simple Transformation enthält zwei Templates, ein Haupt-Template TEMP_MAIN und ein Unter-Template TEMP_SUB ohne eigene Datenwurzeln. Das Unter-Template wird sieben mal mit tt:apply in Haupt-Template eingebunden, wobei jeweils der zuvor mit tt:ref gesetzte aktuelle Knoten übergeben wird. Dieses ST-Programm kann eine geschachtelte Struktur symmetrisch transformieren.

 

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

  <tt:root name="ROOT"/>

  <tt:template name="TEMP_MAIN">

    <week>
      <day1 tt:ref="ROOT.DAY1">
        <tt:apply name="TEMP_SUB" />
      </day1>
      <day2 tt:ref="ROOT.DAY2">
        <tt:apply name="TEMP_SUB" />
      </day2>
      <day3 tt:ref="ROOT.DAY3">
        <tt:apply name="TEMP_SUB" />
      </day3>
      <day4 tt:ref="ROOT.DAY4">
        <tt:apply name="TEMP_SUB" />
      </day4>
      <day5 tt:ref="ROOT.DAY5">
        <tt:apply name="TEMP_SUB" />
      </day5>
      <day6 tt:ref="ROOT.DAY6">
        <tt:apply name="TEMP_SUB" />
      </day6>
      <day7 tt:ref="ROOT.DAY7">
        <tt:apply name="TEMP_SUB" />
      </day7>

    </week>
  </tt:template>

  <tt:template name="TEMP_SUB">
    <name>
      <tt:value ref="$ref.name" />
    </name>
    <work>
      <tt:value ref="$ref.work" />
    </work>
  </tt:template>

</tt:transform>

 

Folgendes ABAP-Programm kann die Transformation aufrufen:

 

TYPES: BEGIN OF day,
         name TYPE string,
         work(1) TYPE c,
       END OF day.

DATA: BEGIN OF week,
        day1 TYPE day,
        day2 TYPE day,
        day3 TYPE day,
        day4 TYPE day,
        day5 TYPE day,
        day6 TYPE day,
        day7 TYPE day,
      END OF week.

DATA xml_string TYPE string.
DATA result LIKE week.

week-day1-name = 'Monday'.    week-day1-work = 'X'.
week-day2-name = 'Tuesday'.   week-day2-work = 'X'.
week-day3-name = 'Wednesday'. week-day3-work = 'X'.
week-day4-name = 'Thursday'.  week-day4-work = 'X'.
week-day5-name = 'Friday'.    week-day5-work = 'X'.
week-day6-name = 'Saturday'.  week-day6-work = ' '.
week-day7-name = 'Sunday'.    week-day7-work = ' '.

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

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

 

Das Ergebnis der Serialisierung ist wie folgt:

 

<week>
  <day1>
    <name>Monday</name>
    <work>X</work>
  </day1>
  <day2>
    <name>Tuesday</name>
    <work>X</work>
  </day2>
  <day3>
    <name>Wednesday</name>
    <work>X</work>
  </day3>
  <day4>
    <name>Thursday</name>
    <work>X</work>
  </day4>
  <day5>
    <name>Friday</name>
    <work>X</work>
  </day5>
  <day6>
    <name>Saturday</name>
    <work/>
  </day6>
  <day7>
    <name>Sunday</name>
    <work/>
  </day7>
</week>

 

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

 

Die folgende Simple Transformation hat die gleiche Funktionalität wie die vorhergehende und kann mit dem gleichen Ergebnis mit dem dort angegebenen ABAP-Programm aufgerufen werden. Im Unterschied zur obigen Transformation hat das Unter-Template TEMP_SUB hier eine eigene Datenwurzel local, der im Befehl tt:apply bei jedem Einbinden ein anderer Datenknoten übergeben wird.

 

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

  <tt:root name="ROOT"/>

  <tt:template name="TEMP_MAIN">

    <week>
      <day1>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local" ref="ROOT.DAY1" />
        </tt:apply>
      </day1>
      <day2>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local" ref="ROOT.DAY2" />
        </tt:apply>
      </day2>
      <day3>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local" ref="ROOT.DAY3" />
        </tt:apply>
      </day3>
      <day4>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local" ref="ROOT.DAY4" />
        </tt:apply>
      </day4>
      <day5>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local" ref="ROOT.DAY5" />
        </tt:apply>
      </day5>
      <day6>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local" ref="ROOT.DAY6" />
        </tt:apply>
      </day6>
      <day7>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local" ref="ROOT.DAY7" />
        </tt:apply>
      </day7>

    </week>
  </tt:template>

  <tt:template name="TEMP_SUB">
    <tt:context>
      <tt:root name="local" />
    </tt:context>
    <name>
       <tt:value ref="local.name" />
    </name>
    <work>
       <tt:value ref="local.work" />
    </work>

  </tt:template>

</tt:transform>

 

Die folgende Simple Transformation hat ebenfalls die gleiche Funktionalität wie die vorhergehenden. Hier hat das Unter-Template TEMP_SUB zwei eigene Datenwurzeln local1 und local2 denen im Befehl tt:apply Datenknoten übergeben werden.

 

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

  <tt:root name="ROOT"/>

  <tt:template name="TEMP_MAIN">

    <week>
      <day1>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local1" ref="ROOT.DAY1.NAME" />
          <tt:with-root name="local2" ref="ROOT.DAY1.WORK" />
        </tt:apply>
      </day1>
      <day2>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local1" ref="ROOT.DAY2.NAME" />
          <tt:with-root name="local2" ref="ROOT.DAY2.WORK" />
        </tt:apply>
      </day2>
      <day3>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local1" ref="ROOT.DAY3.NAME" />
          <tt:with-root name="local2" ref="ROOT.DAY3.WORK" />
        </tt:apply>
      </day3>
      <day4>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local1" ref="ROOT.DAY4.NAME" />
          <tt:with-root name="local2" ref="ROOT.DAY4.WORK" />
        </tt:apply>
      </day4>
      <day5>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local1" ref="ROOT.DAY5.NAME" />
          <tt:with-root name="local2" ref="ROOT.DAY5.WORK" />
        </tt:apply>
      </day5>
      <day6>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local1" ref="ROOT.DAY6.NAME" />
          <tt:with-root name="local2" ref="ROOT.DAY6.WORK" />
        </tt:apply>
      </day6>
      <day7>
        <tt:apply name="TEMP_SUB">
          <tt:with-root name="local1" ref="ROOT.DAY7.NAME" />
          <tt:with-root name="local2" ref="ROOT.DAY7.WORK" />
        </tt:apply>
      </day7>

    </week>
  </tt:template>

  <tt:template name="TEMP_SUB">
    <tt:context>
      <tt:root name="local1" />
      <tt:root name="local2" />
    </tt:context>
    <name>
      <tt:value ref=".local1" />
    </name>
    <work>
      <tt:value ref=".local2" />
    </work>
  </tt:template>

</tt:transform>

 

Das vorhergehende Beispiel dient der Demonstration lokaler Datenwurzeln und ihrer Adressierung. Im Realfall dienen Unter-Templates der Wiederverwendung von Code und um Simple Transformations übersichtlicher zu machen.

 

Beispiel mit Parameterübergabe

Die folgende Transformation demonstriert die Parameterübergabe an ein Unter-Template:

 

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

  <tt:variable name="VARI1" val="1"/>
  <tt:variable name="VARI2" val="2"/>
  <tt:variable name="VARI3" val="3"/>

  <tt:template>
    <tt:apply name="SUB">
      <tt:with-parameter name="PARA1" var="VARI1"/>
      <tt:with-parameter name="PARA2" var="VARI2"/>
      <tt:with-parameter name="PARA3" var="VARI3"/>
    </tt:apply>
    <X0>

      <X1>
        <tt:write var="VARI1"/>
      </X1>
      <X2>
        <tt:write var="VARI2"/>
      </X2>
      <X3>
        <tt:write var="VARI3"/>
      </X3>

    </X0>
  </tt:template>

  <tt:template name="SUB">
    <tt:context>
      <tt:parameter kind="in" name="PARA1" val="4"/>
      <tt:parameter kind="out" name="PARA2"/>
      <tt:parameter kind="in/out" name="PARA3"/>
    </tt:context>
    <tt:assign to-var="PARA2" var="PARA3"/>
    <tt:assign to-var="PARA3" var="PARA1"/>
    <tt:assign to-var="PARA1" val="555"/>
  </tt:template>

</tt:transform>

 

Das Ergebnis der Transformation ist:

 

<X0>
  <X1>1</X1>
  <X2>3</X2>
  <X3>1</X3>
</X0>

 

Der Eingabeparameter PARA1 wird im Unter-Template zwar verändert, der geänderte Wert aber nicht an den Aktualparameter VARI1 zurückgegeben.

Der Ausgabeparameter PARA2 wird auf den an das Unter-Template übergebenen Wert des Aktualparameters VARI3 gesetzt und dieser an den Aktualparameter VARI2 zurückgegeben.

Der Ein-/Ausgabeparameter PARA3 wird auf den an das Unter-Template übergebenen Wert des Aktualparameters VARI1 gesetzt und dieser an den Aktualparameter VARI3 zurückgegeben.

 

Ende des Inhaltsbereichs