Altova MapForce 2024 Basic Edition

Mapping-Komponenten sind hierarchische Strukturen, die viele Ebenen tief verschachtelt sein können. Zudem kann ein Mapping mehrere Quell- und Zielkomponenten sowie Zwischenkomponente wie Funktionen, Filter, Wertezuordnungen, usw. enthalten. Dies verkompliziert den Mapping-Algorithmus, vor allem, wenn mehrere nicht miteinander in Zusammenhang stehende Komponenten miteinander verbunden sind. Damit das Mapping Schritt für Schritt abschnittsweise ausgeführt werden kann, muss für jede Verbindung ein aktueller Kontext festgelegt sein.

 

Man könnte auch sagen, dass für die Dauer der Mapping-Ausführung mehrere "aktuelle Kontexte" festgelegt werden, da sich der aktuelle Kontext bei jeder verarbeiteten Verbindung ändert.

 

MapForce ermittelt den aktuellen Kontext immer vom Root-Zieldatenelement (Node) aus. Die Mapping-Ausführung beginnt immer hier. Die Verbindung zum Root-Zieldatenelement wird zu allen direkt oder indirekt - auch über Funktionen oder andere Zwischenkomponenten - damit verbundenen Quelldatenelementen, zurückverfolgt. Alle Quelldatenelemente und durch Funktionen erzeugten Ergebnisse werden zum aktuellen Kontext hinzugefügt.

 

Nachdem der Ziel-Node verarbeitet wurde arbeitet sich MapForce von oben nach unten durch die Hierarchie durch. Dabei werden alle gemappten Datenelemente der Zielkomponente von oben nach unten verarbeitet. Für jedes neue Datenelement wird ein neuer Kontext ermittelt, der anfangs alle Datenelemente des Parent-Kontexts enthält. Folglich sind alle gemappten gleichrangigen Datenelemente einer Zielkomponente voneinander unabhängig, haben aber Zugriff auf alle Quelldatenelemente ihrer übergeordneten Datenelemente.

 

Ein praktisches Beispiel dazu sehen Sie im Beispielmapping PersonListByBranchOffice.mfd aus dem Verzeichnis <Dokumente>\Altova\MapForce2024\MapForceExamples\.

mf_udf_19

Im oben gezeigten Mapping handelt es sich sowohl bei der Quell- als auch der Zielkomponente um XML-Dateien. Die XML-Quelldatei enthält zwei Office-Elemente.

 

Wie bereits zuvor erwähnt, beginnt die Mapping-Ausführung immer am Ziel-Root-Node (in diesem Beispiel PersonList). Wenn Sie die Verbindung (über den Filter und die Funktion) zu einem Quelldatenelement zurückverfolgen, sehen Sie, dass das Quelldatenelement Office ist. (Der andere Verbindungspfad führt zu einem Input-Parameter, dessen Zweck weiter unten erläutert wird).

 

Gäbe es eine einfache direkte Verbindung zwischen Office und PersonList, würden gemäß der allgemeinen Mapping-Regel genauso viele PersonList-Instanzdatenelemente erstellt, wie in der Quelldatei Office-Datenelemente vorhanden sind. Dies ist hier jedoch nicht der Fall, weil sich dazwischen ein Filter befindet. Der Filter liefert an die Zielkomponente nur einen Datensatz, der die mit dem Input bool des Filters verbundene Boolesche Bedingung erfüllt. Die Funktion equal gibt true zurück, wenn der Name (Name) des Büros "Nanonull, Inc." ist. Diese Bedingung trifft nur einmal zu, da die XML-Quelldatei nur einen solchen Office-Namen enthält.

 

Mit der Verbindung zwischen Office und PersonList wird folglich nur ein einziges Büro (Office) als Kontext für das gesamte Zieldokument definiert. Das bedeutet, alle Nachfahren des Datenelements PersonList haben Zugriff auf die Daten des Büros "Nanonull, Inc." und es gibt im aktuellen Kontext keine weiteren Büros.

 

Die nächste Verbindung ist die zwischen Contact und Person. Gemäß der allgemeinen Mapping-Regel wird dadurch für jedes Contact.-Quelldatenelement ein Person-Zieldatenelement erstellt. Bei jeder Iteration wird mit dieser Verbindung ein neuer aktueller Kontext festgelegt. Daher liefern die Child-Verbindungen (first zu First, last zu Last) im Kontext jeder einzelnen Person Daten aus der Quellkomponente an das Zieldatenelement.

 

Würden Sie die Verbindung zwischen Contact und Person weglassen, würde nur ein Person-Datenelement mit mehreren First-, Last- und Details-Nodes erstellt. In solchen Fällen gibt MapForce im Fenster "Meldungen" eine Warnmeldung sowie einen Lösungsvorschlag aus, z.B.:

mf_semantics_01

Schließlich enthält das Mapping noch eine benutzerdefinierte Funktion LookupPerson. Aufgrund der übergeordneten Verbindung zwischen Contact und Person wird die benutzerdefinierte Funktion ebenfalls im Kontext der einzelnen Person-Datenelemente ausgeführt. So wird die Funktion jedes Mal, wenn in der Zielkomponente ein neues Person-Datenelement erstellt wird, aufgerufen, um das Element Details der jeweiligen Person zu befüllen. Diese Funktion hat drei Input-Parameter. Mit dem ersten (OfficeName) werden Daten aus dem Input-Parameter des Mappings ausgelesen. Die Quelldaten für diesen Parameter könnten genauso gut durch das Quelldatenelement Name bereitgestellt werden, ohne dass sich die Mapping-Ausgabe auf irgendeine Art ändern würde. Der Ausgangswert ist in beiden Fällen derselbe und stammt aus einem Parent-Kontext. Intern verkettet die Look-up-Funktion die als Argumente erhaltenen Werte und erzeugt einen einzigen Wert. Nähere Informationen zur LookupPerson-Funktion finden Sie unter Beispiel: Look-up und Verkettung.

© 2017-2023 Altova GmbH