Rekursion

Normalerweise wird ein Literal direkt nach seiner Verarbeitung an das nächste command weitergeleitet. Es ist durch eine spezielle Syntax - ein führendes @ im Namen - allerdings möglich, seine Werte bis zum Prozessierungsende des Datensatzes im Cache zu halten:

<data source="eingabename" name="@loop"/>
<data source="@loop" name="ausgabename"/>

Bei der Verwendung dieser Syntax sind einige Dinge zu beachten:

Durch Rekursion lassen sich verschiedene Probleme lösen, so:

Allerdings gibt es auch Einschränkungen. Der gecachte Literal verhält sich aus Sicht der ihn aufrufen Morph-Definition wie ein Iterator: Jeder seiner Werte kann nur einmal wiederverwendet werden und geht dann verloren. Es ist zudem nicht möglich, einen gecachten Literal gestaffelt abzuarbeiten.

Beispiel

Eingabe

{ litA: wertAA, litA: wertAB, litB: wertBA, litB: wertBB }

Morph-Definitionen

<rules>
    <data source="litA" name="@loop"/>
    <entity name="entAB" flushWith="litB" reset="true">
        <data source="@loop" name="litA"/>
        <data source="litB" name="litB"/>
    </entity>
</rules>

Ausgabe

{ entAB { litA: wertAA, litA: wertAB, litB: wertBA }, entAB { litB: wertBB } }