Altova MapForce 2024 Enterprise Edition

Mit der Funktion group-by werden anhand eines von Ihnen definierten Gruppierungsschlüssels Datensatzstrukturen erstellt.

mf-func-group-by

So ist etwa in der unten gezeigten abstrakten Transformation der Gruppierungsschlüssel "Department". Da es insgesamt drei eindeutige Abteilungen (Departments) gibt, würden bei Anwendung der Funktion group-by drei Gruppen erstellt:

mf_group-by

 

Sprachen

Built-in, C++, C#, Java, XSLT 2.0, XSLT 3.0.

 

Parameter

Name

Beschreibung

nodes/rows

Mit diesem Input muss ein Mapping-Datenelement verbunden werden, das eine Sequenz von null oder mehr Werten liefert. So kann damit etwa ein Datenelement aus einer XML-Quelldatei, einem CSV-Feld, einem Datenbankdatensatz, usw. verbunden werden.

key

Der Schlüssel, nach dem Datenelemente gruppiert werden sollen.

 

Beispiel 1

Angenommen, bei Ihren Quelldaten handelt es sich um eine XML-Datei folgenden Inhalts (Beachten Sie, dass der Namespace und die XML-Deklarationen im Codefragment unten aus Gründen der Einfachheit entfernt wurden).

 

<company>
  <person department="Administration" name="Vernon Callaby"/>
  <person department="Marketing" name="Susi Sanna"/>
  <person department="Engineering" name="Michelle Butler"/>
  <person department="Engineering" name="Fred Landis"/>
  <person department="Administration" name="Frank Further"/>  
</company>

 

Die Personendatensätze sollen nach Abteilung (department) gruppiert werden. Zu diesem Zweck wird im folgenden Mapping die Funktion group-by aufgerufen und department wird als key (Schlüssel) bereitgestellt.

mf_group-by_map

Das Ergebnis des Mappings sieht folgendermaßen aus:

 

<groups>
  <group>
    <record key="Administration" value="Vernon Callaby"/>
    <record key="Administration" value="Frank Further"/>
  </group>
  <group>
    <record key="Marketing" value="Susi Sanna"/>
  </group>
  <group>
    <record key="Engineering" value="Michelle Butler"/>
    <record key="Engineering" value="Fred Landis"/>
  </group>
</groups>

 

Sie finden dieses Beispiel sowie einige weitere Gruppierungsbeispiele in der folgenden Mapping-Datei: <Dokumente>\Altova\MapForce2024\MapForceExamples\GroupingFunctions.mfd. Klicken Sie auf die Schaltfläche Vorschau mf_ic_preview für die jeweilige Funktion, bevor Sie auf das Fenster Ausgabe klicken.

 

Beispiel 2

In diesem Beispiel wird gezeigt, wie Sie Datensätze mit Hilfe der group-by-Funktion gruppieren. Außerdem wird darin gezeigt, wie Sie Daten aggregieren. Das Demo-Mapping zu diesem Beispiel finden Sie unter dem folgenden Pfad: <Dokumente>\Altova\MapForce2024\MapForceExamples\GroupTemperaturesByYear.mfd. In diesem Mapping werden Daten aus einer XML-Datei ausgelesen, die ein Protokoll monatlicher Temperaturen enthält, siehe Codefragment unten:

 

<Temperatures>
  <data temp="-3.6" month="2006-01" />
  <data temp="-0.7" month="2006-02" />
  <data temp="7.5" month="2006-03" />
  <data temp="12.4" month="2006-04" />
  <data temp="16.2" month="2006-05" />
  <data temp="19" month="2006-06" />
  <data temp="22.7" month="2006-07" />
  <data temp="23.2" month="2006-08" />
  <data temp="18.7" month="2006-09" />
  <data temp="11.2" month="2006-10" />
  <data temp="9.1" month="2006-11" />
  <data temp="0.8" month="2006-12" />
  <data temp="-3.2" month="2007-01" />
  <data temp="-0.3" month="2007-02" />
  <data temp="6.5" month="2007-03" />
  <data temp="10.6" month="2007-04" />
  <data temp="19" month="2007-05" />
  <data temp="20.3" month="2007-06" />
  <data temp="22.3" month="2007-07" />
  <data temp="20.7" month="2007-08" />
  <data temp="19.2" month="2007-09" />
  <data temp="12.9" month="2007-10" />
  <data temp="8.1" month="2007-11" />
  <data temp="1.9" month="2007-12" />
</Temperatures>

 

Dieses Mapping hat zwei Aufgaben:

 

1.Zusammengruppierung der Temperaturen jedes Jahres

2.Eruierung der jeweiligen Minima, Maxima und Durchschnittstemperaturen jedes Jahres

 

Für Aufgabe Nr. 1 wird die Funktion group-by im Mapping aufgerufen. Für Aufgabe Nr. 2 werden die Aggregierungsfunktionen min, max und avg aufgerufen.

mf_GroupTemperaturesByYear_map

GroupTemperaturesByYear.mfd

Bei der Ausführung eines MapForce-Mappings (dies ist auch die empfohlene Methode, um ein Mapping zu lesen), wird mit dem obersten Datenelement der Zielkomponente begonnen. In diesem Beispiel wird für jede von der Funktion group-by zurückgegebene Gruppe ein YearlySales-Datenelement zurückgegeben. Die Funktion group-by nimmt als erstes Argument alle data-Datenelemente aus der Quellkomponente und gruppiert diese nach dem Input, der mit dem Input key verbunden ist. Da die Temperaturen nach Jahr gruppiert werden sollen, muss zuerst das Jahr ermittelt werden. Zu diesem Zweck extrahiert die Funktion substring-before das Jahr aus dem Attribut month der einzelnen data-Elemente. Dabei wird als Argument der Wert von month verwendet und es wird der Teil vor der ersten Instanz von substr zurückgegeben. Wie oben gezeigt, wird in diesem Beispiel für substr das Bindestrichzeichen definiert. Wenn die Funktion daher den Wert "2006-01" verarbeitet, ist das Ergebnis der Funktion "2006".

 

Die Werte von MinimumTemp, MaximumTemp und AverageTemp werden schließlich durch Verbinden dieser Datenelemente mit der jeweiligen Aggregationsfunktion min, max und avg ermittelt. Alle drei Funktionen erhalten als Input die aus der Quellkomponente ausgelesene Sequenz von Temperaturen. Für diese Funktionen wird kein parent-context-Argument benötigt, da sie bereits im Kontext der einzelnen Gruppen verwendet werden, d.h. es gibt eine übergeordnete Verbindung von data zu YearlyStats, die den Kontext für die einzelnen Aggrationsfunktionen liefert.

 

Klicken Sie auf das Register Ausgabe, um eine Vorschau auf das Mapping-Ergebnis zu sehen. Beachten Sie, dass die Anzahl der Gruppen der Anzahl der in der Quelldatei vorhandenen Jahre entspricht, z.B.:

 

<Temperatures>
  <YearlyStats Year="2006">
    <MinimumTemp>-3.6</MinimumTemp>
    <MaximumTemp>23.2</MaximumTemp>
    <AverageTemp>11.375</AverageTemp>
  </YearlyStats>
  <YearlyStats Year="2007">
    <MinimumTemp>-3.2</MinimumTemp>
    <MaximumTemp>22.3</MaximumTemp>
    <AverageTemp>11.5</AverageTemp>
  </YearlyStats>
</Temperatures>

 

Anmerkung:Die oben gezeigten Codefragmente enthalten aus Gründen der Einfachheit weniger Daten als die tatsächliche Input- und Output-Datei aus dem Demo-Mapping.

 

© 2017-2023 Altova GmbH