Altova MapForce 2024 Basic Edition

Wenn eine Funktion mit einem Filter verbunden wird, wirkt sich der Prioritätskontext nicht nur auf die Funktion selbst, sondern auch auf die Auswertung des Filters aus. Im Mapping unten sehen Sie ein Beispiel für einen typischen Fall, in dem ein Prioritätskontext definiert werden muss, um das korrekte Ergebnis zu erhalten. Sie finden dieses Mapping unter dem folgenden Pfad: <Dokumente>\Altova\MapForce2024\MapForceExamples\FilterWithPriority.mfd.

 

Anmerkung:In diesem Mapping werden XML-Komponenten verwendet, doch gilt dieselbe unten beschriebene Logik auch für allen anderen in MapForce verwendeten Komponententypen, darunter auch für EDI, JSON usw.
mf_semantics_05

Ziel des oben gezeigten Mappings ist es, Daten aus Articles.xml in eine neue XML-Datei mit einem anderen Schema, nämlich articledata.xml, zu kopieren. Gleichzeitig sollen die Informationen zu jedem Artikel (Article) in der Datei Products.xml abgerufen und mit dem entsprechenden Artikeldatensatz verbunden werden. Beachten Sie, dass jeder Datensatz in Articles.xml eine Nummer (Number) und jeder Datensatz in Products.xml eine id hat. Wenn diese beiden Werte identisch sind, sollen alle andere Werte (Name, SinglePrice, color, size) in dieselbe Zeile (row) in der Zielkomponente kopiert werden.

 

Dieses Ziel wurde durch Hinzufügen eines Filters erreicht. Für jeden Filter wird als Input eine Boolesche Bedingung benötigt. Nur die Nodes/Zeilen, die die Bedingung erfüllen, werden in die Zielkomponente kopiert. Zu diesem Zweck gibt es im Mapping eine equal-Funktion. Mit der equal-Funktion wird überprüft, ob die Artikelnummer und die Produkt-ID in beiden Quelldateien identisch sind. Das Ergebnis wird anschließend als Input für den Filter bereitgestellt. Bei true wird das Article-Datenelement in die Zielkomponente kopiert.

 

Beachten Sie, dass für den zweiten Input-Parameter der zweiten equal-Funktion ein Prioritätskontext definiert wurde. Der Prioritätskontext macht in diesem Mapping einen großen Unterschied. Wenn er nicht definiert wird, führt dies zu einer falschen Mapping-Ausgabe.

 

Anfängliches Mapping: Kein Prioritätskontext

Hier die Mapping-Logik ohne Prioritätskontext:

 

Gemäß der allgemeinen Mapping-Regel wird für jedes Article-Element, das die Filter-Bedingung erfüllt, in der Zielkomponente eine neuen Zeile (row) erstellt. Dafür sorgt die Verbindung zwischen Article und row (via die Funktion und den Filter).

Mit dem Filter wird für jeden Artikel die Bedingung überprüft. Dazu iteriert der Filter durch alle Produkte und bringt mehrere Produkte in den aktuellen Kontext.

Um in der Zielkomponente das Element id zu befüllen, geht MapForce nach der allgemeinen Regel vor (Erstelle für jedes Datenelement in der Quelldatei ein Datenelement in der Zielkomponente). Wie jedoch oben erläutert, befinden sich alle Produkte aus Products.xml im aktuellen Kontext. Es gibt keine Verbindung zwischen product und irgendeinem anderen Node in der Zielkomponente, damit nur die id eines bestimmten Produkts ausgelesen wird. Folglich werden für jeden Artikel (Article) mehrere id-Elemente in der Zielkomponente erstellt. Dasselbe geschieht mit color und size.

 

Zusammenfassung: Die Datenelemente aus Products.xml haben den Kontext des Filters (der durch jedes Produkt iterieren muss). Daher werden die id-, color- und size-Werte so oft in die einzelnen row-Elemente in der Zielkomponente kopiert, wie sich in der Quelldatei Produkte befinden und es wird eine falsche Ausgabe wie die unten gezeigte generiert:

 

<rows>
  <row>
      <id>1</id>
      <id>2</id>
      <id>3</id>
      <name>T-Shirt</name>
      <color>red</color>
      <color>blue</color>
      <color>green</color>
      <size>10</size>
      <size>20</size>
      <size>30</size>
      <price>25</price>
  </row>
</rows>

 

Lösung A: Verwendung eines Prioritätskontexts

Das obige Problem wurde durch Hinzufügen eines Prioritätskontexts zur Funktion, die die Boolesche Bedingung des Filters berechnet, gelöst.

 

Wenn in diesem Fall der zweite Input-Parameter der equal-Funktion als Prioritätskontext definiert wird, erhält die Sequenz, die aus Products.xml eingeht, Priorität. Dies wird in die folgende Mapping-Logik übersetzt:

 

Befülle für jedes Produkt den Input b der equal-Funktion (anders ausgedrückt: gib b Priorität). In dieser Phase befinden sich die Informationen des aktuellen Produkts im Kontext.

Befülle für jeden Artikel den Input a der equal-Funktion und überprüfe, ob die Filterbedingung "true" ist. Falls ja, setze auch die Artikelinformationen in den aktuellen Kontext.

Kopiere als nächstes die Artikel- und Produktinformationen aus dem aktuellen Kontext in die entsprechenden Datenelemente in der Zielkomponente.

 

Mit der obigen Mapping-Logik wird eine korrekte Ausgabe erzeugt, z.B:

 

<rows>
  <row>
      <id>1</id>
      <name>T-Shirt</name>
      <color>red</color>
      <size>10</size>
      <price>25</price>
  </row>
</rows>

 

Lösung B: Verwendung einer Variablen

Als Alternativlösung dazu können Sie auch mit Hilfe einer Zwischenvariablen die einzelnen Artikel und Produkte, die die Filterbedingung erfüllen, in denselben Kontext bringen. Variablen eignen sich für derartige Szenarien, da Sie damit Daten temporär im Mapping speichern und dadurch bei Bedarf den Kontext ändern können.

 

In Szenarien wie diesem können Sie eine Variable zum Mapping hinzufügen, die dasselbe Schema wie die Zielkomponente hat. Klicken Sie im Menü Einfügen auf Variablen und geben Sie das Schema articledata.xsd als Struktur an, wenn Sie gefragt werden.

mf_semantics_06

Im oben gezeigten Mapping geschieht Folgendes:

 

Es wird kein Prioritätskontext mehr verwendet. Statt dessen gibt es eine Variable, die dieselbe Struktur wie die Zielkomponente hat.

Das Mapping beginnt wie gewöhnlich am Ziel-Root-Node. Bevor die Zielkomponente befüllt wird, werden die Daten in der Variablen gesammelt.

Die Variable wird im Kontext jedes einzelnen Produkts berechnet, da eine Verbindung von product zum compute-when-Input der Variablen besteht.

Die Filterbedingung wird daher im Kontext jedes einzelnen Produkts überprüft. Nur, wenn die Bedingung "true" ist, wird die Variablenstruktur befüllt und an die Zielkomponente übergeben.

© 2018-2024 Altova GmbH