Show TOC Anfang des Inhaltsbereichs

Syntaxdokumentation Gruppierung  Dokument im Navigationsbaum lokalisieren

Um bei der Deserialisierung auf variable XML-Eingangsströme, die Gruppen zusammengehöriger  Elemente in freier Reihenfolge enthalten, zu reagieren, können bedingte Transformationen mit der Anweisung tt:group zu einer Gruppe zusammengefasst werden, die bei der Deserialisierung mehrmals prozessiert werden kann:

 

<tt:group>
 
case1
 
case2
  ...

</tt:group>

 

In tt:group kann eine Liste von Fällen case1, case2, ...  aufgeführt werden. Syntaktisch wird jeder Fall case1, case2, ... durch eine bedingte Transformation, d.h. ein Unterelement tt:[s-|d-]cond. formuliert werden. Dabei definiert tt:[s-]cond. einen serialisierungs-relevanten und tt:[d-]cond. einen deserialisierungs-relevanten Fall. Andere direkte Unterelemente sind in tt:group nicht möglich. Die Anweisung tt:group kann aber Unterelement von tt:[s-|d-]cond sein.

Im Gegensatz zu bedingten Transformationen, die außerhalb von tt:group stehen, muss bei einem Fall nicht mindestens ein Attribut using, data oder check angegeben werden, wenn der Inhalt von tt:[s-|d-]cond kein Muster ist.

In der Liste von Fällen case1, case2, ... ist folgendes zu beachten:

·        Es dürfen beliebig viele serialisierungs-relevante Fälle angegeben werden, in denen kein Attribut using, data oder check angegeben ist.

·        Es darf maximal ein deserialisierungs-relevanter Fall angegeben werden, der kein Muster enthält. Dieser Fall wird als Standard-Deserialisierung bezeichnet.

Zur Steuerung, wie oft ein deserialisierungs-relevanter Fall bei der Deserialisierung ausgeführt werden muss oder darf, kann tt:[d-]cond innerhalb von tt:group das zusätzliche Attribut frq (Fallhäufigkeit) mit einem von drei erlaubten Werten enthalten:

·        </tt:[d-]cond ... frq="1" >

Notwendiger Fall. Der Fall muss während der Verarbeitung der Gruppe genau einmal ausgeführt werden.

·        </tt:[d-]cond ... frq="?" >

Optionaler Fall. Der Fall wird während der Verarbeitung der Gruppe maximal einmal ausgeführt.

·        </tt:[d-]cond ... frq="*" >

Mehrfach-Fall. Der Fall darf während der Verarbeitung der Gruppe beliebig oft ausgeführt werden.

Für frq="?" und frq="*" muss das erwartete Element also nicht unbedingt im XML-Eingangsstrom vorhanden sein.

Implizite Fallhäufigkeit: Falls das Attribut frq nicht explizit angegeben ist, wird

     bei Fällen tt:cond, die keine Datenbedingung enthalten (also bei der Serialisierung unbedingt ausgeführt werden), implizit frq="1" verwendet und

     bei Fällen tt:cond, die eine Datenbedingung enthalten (also bei der Serialisierung potentiell nicht ausgeführt werden), implizit frq="?" verwendet.

 

Serialisierung

Bei der Serialisierung wird das Element tt:group einmal wie folgt ausgeführt:

Alle serialisierungs-relevanten Fälle mit erfüllter oder keiner Voraussetzung using, data oder check werden in der vorgegebenen Reihenfolge ausgeführt.

 

Deserialisierung

Bei der Deserialisierung führt das Element tt:group zu einer Schleife. Es wird versucht, jeden notwendigen Fall (Fallhäufigkeit 1) einmal zu selektieren. Sobald dies erreicht ist, endet die Schleife. Bis dahin können auch optionale Fälle (Fallhäufigkeit ?, maximal einmal ) und mehrfache Fälle (Fallhäufigkeit *, auch mehrfach) selektiert werden. In jedem Schleifendurchgang wird aus den deserialisierungs-relevanten Fällen, deren maximale Fallhäufigkeit noch nicht erreicht ist, ein Fall wie folgt selektiert:

       1.      Der erste Fall, der ein passendes Muster enthält, wird ausgeführt (Deserialisierung und Erfüllung der Zusicherungen).

       2.      Falls kein solcher Fall existiert, wird versucht, die Standard-Deserialisierung, falls vorhanden, auszuführen. Falls die eventuellen Voraussetzungen using, data, check der Standard-Deserialisierung nicht erfüllt sind, kommt es zur Ausnahme CX_ST_REF_ACCESS.

       3.      Falls keine Standard-Deserialisierung vorhanden ist, kommt es zur Ausnahme CX_ST_GROUP_MISSING_CASE.

 

Beispiel

Zur Demonstration von Gruppierungen betrachten wir folgende Transformation:

 

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

  <tt:root name="ROOT1"/>
  <tt:root name="ROOT2"/>
  <tt:root name="ROOT3"/>
  <tt:root name="ROOT4"/>

  <tt:template>

    <X0>
      <tt:group>
        <tt:cond>
          <X3>
            <tt:value ref="ROOT3"/>
          </X3>
        </tt:cond>
        <tt:cond frq="?">
          <X2>
            <tt:value ref="ROOT2"/>
          </X2>
        </tt:cond>
        <tt:cond frq="*">
          <X1>
            <tt:value ref="ROOT1"/>
          </X1>
        </tt:cond>
        <tt:cond>
          <tt:skip count="1"/>
        </tt:cond>
      </tt:group>
      <X4>
        <tt:value ref="ROOT4"/>
      </X4>

    </X0>
  </tt:template>

</tt:transform>

 

Ein XML-Eingangsstrom habe folgende Form:

 

<X0>
  <X1>1</X1>
  <X1>2</X1>
  <X2>3</X2>
  <X2>4</X2>
  <X3>5</X3>
  <X4>6</X4>
</X0>

 

Die Deserialisierung verläuft wie folgt:

...

       1.      Im ersten Schleifendurchgang wird das Element X1 verwendet und das erste Element X1 deserialisiert, wobei ROOT1 auf 1 gesetzt wird.

       2.      Im zweiten Schleifendurchgang wird wegen der Bedingung tt:cond frq="*" wieder das Element X1 verwendet und das zweite Element X1 deserialisiert, wobei ROOT1 auf 2 gesetzt wird.

       3.      Im dritten Schleifendurchgang wird das Element X2 verwendet und das erste Element X2 deserialisiert, wobei ROOT2 auf 3 gesetzt wird.

       4.      Im vierten Schleifendurchgang kann wegen der Bedingung tt:cond frq="?"  das Element X2 nicht wieder verwendet werden. Statt dessen wird das zweite Element X2 in der Standard-Deserialisierung mit tt:skip übersprungen. Die Angabe von count ist notwendig, da ansonsten alle folgenden Elemente übersprungen würden.

       5.      Im fünften Schleifendurchgang wird das Element X3 verwendet und das Element X3 deserialisiert, wobei ROOT3 auf  5 gesetzt wird.

       6.      Alle notwendigen Fälle der Gruppe sind selektiert und die Schleife wird verlassen. Das Element X4 wird außerhalb von tt:group deserialisiert, wobei ROOT4 auf 6 gesetzt wird.

 

 

 

Ende des Inhaltsbereichs