Mapping-Regeln und -Strategien

www.altova.com Dieses Kapitel drucken Vorherige Seite Eine Ebene nach oben Nächste Seite

Startseite >  Erstellen von Mappings >

Mapping-Regeln und -Strategien

MapForce mappt Daten im Allgemeinen auf intuitive Art, doch gibt es einige Situationen, in denen die erzeugte Ausgabe scheinbar zu viele oder zu wenige Datenelemente hat. Dieses Kapitel enthält einige Hilfestellungen zu diesem Thema.

 

Allgemeinregel

Im Allgemeinen bedeutet jede Verbindung zwischen einem Quell- und einem Zieldatenelement: Erstelle für jedes Quelldatenelement ein Zieldatenelement. Wenn der Quell-Node simple Content (z.B. String, Ganzzahl usw.) enthält und im Ziel-Node simple Content gestattet ist, so wird der Inhalt in den Ziel-Node kopiert und der Datentyp wird gegebenenfalls konvertiert.

 

Diese Regel gilt für alle Verbindungen, doch gibt es die folgenden Ausnahmen:

 

Ein XML-Root-Zielelement wird immer nur ein einziges Mal erstellt. Wenn eine Sequenz damit verbunden wird, so wird nur der Inhalt des Elements wiederholt, nicht aber das Root-Element selbst. Das Ergebnis ist unter Umständen dem Schema gemäß nicht gültig. Wenn auch Attribute des Root-Elements verbunden werden, so schlägt die XML-Serialisierung zur Laufzeit fehl. Daher sollten Sie Sequenzen nicht mit einem Root-Element verbinden. Um mehrere Ausgabedateien zu erzeugen, verbinden Sie die Sequenz statt dessen über eine Funktion, die Dateinamen generiert, mit dem "Datei"-Node.
Bei einigen anderen Nodes, wie z.B. XML-Attributen, Datenbankfeldern und Ausgabekomponenten innerhalb einer benutzerdefinierten Funktion, ist nur ein einziger Wert zulässig.

 

Kontext-Datenelement und aktuelles Datenelement

MapForce zeigt die Struktur eines Schemas, einer Datenbank in Form einer Hierarchie mapbarer Datenelemente in der Komponente an. Jeder dieser Nodes kann in der Instanzdatei bzw. der Datenbank viele (oder keine) Instanzen haben.

 

Beispiel: Wenn Sie sich in der Datei PersonListByBranchOffice.mfd die Quellkomponente ansehen, so gibt es dort nur einen einzigen Node namens first (unter Contact). In der Instanzdatei BranchOffices.xml gibt es unterhalb unterschiedlicher übergeordneter Office-Nodes mehrere first-Nodes und Contact-Nodes mit jeweils unterschiedlichem Inhalt.

 

Es hängt vom aktuellen Kontext (des Ziel-Node) ab, welche Quell-Nodes tatsächlich ausgewählt werden, damit ihre Daten über den Konnektor in die Zielkomponente/das Zieldatenelement kopiert werden.

mfeg-personListBranchOff

PersonListByBranchOffice.mfd

Dieser Kontext definiert sich durch den aktuellen Ziel-Node und seine Verbindungen mit übergeordneten Nodes.

 

Am Anfang enthält der Kontext nur die Quellkomponenten, aber keine spezifischen Nodes. MapForce verarbeitet beim Mapping zuerst den Ziel-Node (PersonList) und arbeitet sich anschließend durch die Hierarchie nach unten.
Der Konnektor zum Ziel-Node wird zurück zu allen direkt oder indirekt (über Funktionen zwischen den zwei Komponenten) damit verbundenen Quell-Nodes verfolgt. Die Quell-Nodes und die Ergebnisse der Funktionen werden zum Kontext für diesen Node hinzugefügt.
Für jeden neuen Ziel-Node wird ein neuer Kontext angelegt, der anfangs alle aktuellen Datenelemente des Kontexts des übergeordneten Nodes enthält. Gleichrangige Ziel-Nodes sind daher voneinander unabhängig, haben aber Zugriff auf alle Quelldaten der übergeordneten Datenelemente.

 

Angewendet auf das obige Beispielmapping (PersonListByBranchOffice.mfd):

 

Die Verbindung von Office durch den Filter (Office) zu PersonList definiert ein einziges Büro (office) als den Kontext für das gesamte Zieldokument (weil PersonList des Root-Element der Zielkomponente ist). Der Büroname wird von der Input-Komponente geliefert, deren Standardinhalt "Nanonull, Inc." ist.
Die Filterbedingung wirkt sich auf alle Verbindungen zu den Nachfahren bzw. Daten des Root-Elements "PersonList" aus, da sich das ausgewählte Büro im Kontext befindet.
Durch die Verbindung von Contact zu Person wird eine Ziel-Person pro Contact-Element der XML-Quelldatei (allgemeine Regel) angelegt. Für jede Person wird ein bestimmter Contact zum Kontext, anhand dessen die untergeordneten Nodes von Person erstellt werden, hinzugefügt.
Der Konnektor von first zu First wählt den Vornamen des aktuellen Kontakts (Contact) aus und schreibt ihn in das Zieldatenelement "First".

 

Wenn wir den Konnektor von Contact zu Person weglassen, würde nur ein Person-Element mit mehreren First-, Last- und Detail-Nodes erstellt werden, was nicht das gewünschte Ergebnis erzielt. In solchen Fällen gibt MapForce eine Warnmeldung aus und schlägt eine Lösung für das Problem vor: "Sie können zur Behebung des Problems versuchen, eine Verbindung von Contact zu Person herzustellen".

mfeg-personListBranchOff-Msg

 

Sequenzen

MapForce zeigt die Struktur eines Schemas, einer Datenbank in Form einer Hierarchie mapbarer Datenelemente in der Komponente an.

 

Je nach dem (Ziel)-Kontext kann ein mapbares Datenelement einer Quellkomponente Folgendes repräsentieren:

 

einen einzelnen Instanz-Node der zugewiesenen Input-Datei (oder Datenbank)
eine Sequenz von null bis zu mehreren Instanz-Nodes der Input-Datei (oder Datenbank)

 

 

Wenn eine Sequenz mit einem Ziel-Node verbunden wird, wird eine Schleife erstellt, mit der so viele Ziel-Nodes angelegt werden, wie Quell-Nodes vorhanden sind.

 

Wenn ein Filter zwischen die Sequenz und den Ziel-Node platziert wird, wird die Boolsche Bedingung für jeden Input-Node, also für jedes Datenelement in der Sequenz, überprüft. Genauer gesagt, wird überprüft, ob es mindestens eine Boolsche Bedingung in jeder Sequenz gibt, deren Ergebnis "true" ist. Die Prioritätskontext-Einstellung kann sich auf die Reihenfolge der Auswertung auswirken. Siehe unten.

 

Wie bereits oben erwähnt, werden Filterbedingungen automatisch auf alle untergeordneten Nodes angewendet.

 

Hinweis: Wenn im Quellschema angegeben ist, dass ein bestimmter Node nur genau einmal vorkommt, kann MapForce die Schleife entfernen und nur das erste Datenelement verwenden, weil ja bekannt ist, dass der Node vorhanden sein muss. Diese Optimierung kann im Dialogfeld "Komponenteneinstellungen" deaktiviert werden (Kontrollkästchen "Input-Verarbeitungsoptimierungen auf Basis von min/maxOccurs aktivieren").

 

Funktions-Inputs (von normalen Funktionen, die keine Sequenz-Funktionen sind) funktionieren ähnlich wie Ziel-Nodes: Wenn eine Sequenz mit einem solchen Input verbunden wird, wird eine Schleife rund um den Funktionsaufruf erstellt, damit so viele Ergebnisse erzeugt werden, wie es Datenelemente in der Sequenz gibt.

 

Wenn eine Sequenz mit mehr als einem solchen Funktions-Input verbunden wird, erzeugt MapForce verschachtelte Schleifen, die das kartesische Produkt aller Inputs verarbeiten. Gewöhnlich ist dies nicht erwünscht. Daher sollte nur eine einzige Sequenz mit mehreren Datenelementen mit einer  Funktion (und allen anderen Parametern, die an einzelne aktuelle Datenelemente aus übergeordneten Nodes oder anderen Komponenten gebunden sind) verbunden werden .

 

Hinweis: Wenn eine leere Sequenz mit einer solchen Funktion (z.B. concat) verbunden ist, erhalten Sie als Ergebnis eine leere Sequenz und somit keinen einzigen Output Node. Wenn Ihre Ausgabedatei kein Ergebnis enthält, weil es keine Input-Daten gibt, können Sie mit Hilfe der “substitute-missing” Funktion einen Ersatzwert einfügen.

 

Funktionen mit Sequenz-Inputs sind die einzigen Funktionen, die ein Ergebnis erzeugen können, wenn die Input-Sequenz leer ist:

 

exists, not-exists und substitute-missing (sowie is-not-null, is-null und substitute-null, die Aliasnamen für die erstgenannten drei Funktionen sind)
aggregate Funktionen (sum, count usw.)
reguläre benutzerdefinierte Funktionen, die Sequenzen unterstützen (also nicht-inline-Funktionen),

 

Der Sequenz-Input für derartige Funktionen wird immer unabhängig vom aktuellen Ziel-Node im Kontext seiner übergeordneten Nodes ausgewertet. Dies bedeutet auch, dass alle Filter- oder SQL-Where-Komponenten, die mit solchen Funktionen verbunden sind, sich nicht auf andere Verbindungen auswirken.

 

Prioritätskontext

Im Allgemeinen werden Funktionsparameter von oben nach unten ausgewertet, es kann aber mit Hilfe der Einstellung "Prioritätskontext" auch ein Parameter definiert werden, der vor allen anderen ausgewertet werden soll.

 

In Funktionen, die mit dem Boolschen Input von Filterbedingungen verbunden sind, wirkt sich der Prioritätskontext nicht nur auf die Vergleichsfunktion selbst, sondern auch auf die Auswertung des Filters aus, daher können auch zwei Quellsequenzen (siehe CompletePO.mfd, CustomerNo und Number) miteinander verbunden werden.

Siehe Prioritätskontext Node/Datenelement

context-switch

 

Außerkraftsetzung des Kontexts

Einige aggregate-Funktionen haben einen optionalen “parent-context” Input.

 

Wenn dieser Input nicht verbunden wird, hat dies keine Auswirkung und die Funktion wird innerhalb des normalen Kontexts für Sequenz-Inputs (also im Kontext des übergeordneten Node des Ziel-Node) ausgewertet.

agg-func2

Wenn der parent-context-Input mit einem Quell-Node verbunden ist, wird die Funktion für jeden parent-context-Node ausgewertet und für jede Instanz wird ein separates Ergebnis erzeugt. Siehe auch Außerkraftsetzen des Mapping-Kontexts.

 

Einbeziehen mehrerer Nodes derselben Quellkomponente in den Kontext

Dies ist in einigen speziellen Fällen nötig und kann mit Hilfe von Zwischenvariablen erzielt werden.


© 2019 Altova GmbH