Einfache XML-Nachricht umwandeln

Verwenden Sie beim Erstellen des ESQL-Codes für einen Rechenknoten die SELECT-Anweisung zum Umwandeln einfacher Nachrichten.

Beispiele

Überprüfen Sie die folgenden Beispiele, und passen Sie sie Ihren Anforderungen entsprechend an. Alle Beispiele basieren auf der Invoice-Nachricht (Rechnung) als Eingabe.

Betrachten Sie folgende ESQL-Anweisung:

SET OutputRoot.XML.Data.Output[] =
(SELECT R.Quantity, R.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R);

Bei der Verarbeitung der Invoice-Nachricht durch diese ESQL-Anweisung wird folgende Ausgabenachricht erstellt:

<Data>
<Output>
<Quantity>2</Quantity>
<Author>Neil Bradley</Author>
</Output>
<Output>
<Quantity>1</Quantity>
<Author>Don Chamberlin</Author>
</Output>
<Output>
<Quantity>1</Quantity>
<Author>Philip Heller, Simon Roberts</Author>
</Output>
</Data>

Es gibt drei Ausgabefelder (Output), eins für jedes Elementfeld (Item). Der Grund dafür ist, dass SELECT standardmäßig für jedes in der FROM-Liste beschriebene Element ein Element in seiner Ergebnisliste erstellt. In jedem Ausgabefeld befindet sich ein Feld für jedes in der SELECT-Klausel genannte Feld und zwar in der Reihenfolge, in der sie in der SELECT-Klausel angegeben sind, und nicht in der Reihenfolge, in der sie in der ankommenden Nachricht stehen.

Das R, das mit dem letzten AS-Schlüsselwort eingeführt wird, wird als Korrelationsname bezeichnet. Es handelt sich um eine lokale Variable, die nacheinander jedes der durch die FROM-Klausel adressierten Felder darstellt. Der gewählte Name hat keine Bedeutung. Kurz gefasst heißt dies, dass bei dieser einfachen Umwandlung zwei Aktionen ausgeführt werden:

  1. Unerwünschte Felder werden gelöscht.
  2. Die Reihenfolge der Felder wird garantiert.

Es folgt die gleiche Umwandlung, implementiert von einem prozeduralen Algorithmus:

DECLARE i INTEGER 1;
DECLARE count INTEGER CARDINALITY(InputRoot.XML.Invoice.Purchases.Item[]);
WHILE (i <= count)
SET OutputRoot.XML.Data.Output[i].Quantity = InputRoot.XML.Invoice.Purchases.Item[i].Quantity;
SET OutputRoot.XML.Data.Output[i].Author   = InputRoot.XML.Invoice.Purchases.Item[i].Author;
SET i = i+1;
END WHILE;

Diese Beispiele zeigen, dass die SELECT-Version der Umwandlung wesentlich kürzer und präziser ist. Sie wird außerdem schneller ausgeführt.

Das folgende Beispiel zeigt eine anspruchsvollere Umwandlung:

SET OutputRoot.XML.Data.Output[] =
(SELECT R.Quantity AS Book.Quantity, 
R.Author   AS Book.Author
FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
);

In dieser Umwandlung ist jedem Element in der SELECT-Klausel eine AS-Klausel zugeordnet. Dadurch erhält jedes Feld im Ergebnis einen expliziten Namen, statt dass die Feldnamen aus der Eingabe übernommen werden. Diese Namen können Pfade sein (d. h. eine durch Punkte getrennte Liste von Namen), so wie im Beispiel gezeigt. Auf diese Weise kann die Struktur der Ausgabenachricht beliebig anders als die der Eingabenachricht aufgebaut werden. Auf der Basis derselben Invoice-Nachricht führt dies zu folgendem Ergebnis:

<Data>
<Output>
<Book>
<Quantity>2</Quantity>
<Author>Neil Bradley</Author>
</Book>
</Output>
</Data>
<Data>
<Output>
<Book>
<Quantity>2</Quantity>
<Author>Neil Bradley</Author>
</Book>
</Output>
<Output>
<Book>
<Quantity>1</Quantity>
<Author>Don Chamberlin</Author>
</Book>
</Output>
<Output>
<Book>
<Quantity>1</Quantity>
<Author>Philip Heller, Simon Roberts</Author>
</Book>
</Output>
</Data>

Für die Ausdrücke in der SELECT-Klausel gelten keine Begrenzungen hinsichtlich der Komplexität und auch sonst keine besonderen Einschränkungen. Sie können Operatoren, Funktionen und Literale enthalten sowie auf Variablen oder Felder verweisen, die keine Beziehung zum Korrelationsnamen haben. Das folgende Beispiel enthält einige komplexere Ausdrücke:

SET OutputRoot.XML.Data.Output[] =
(SELECT 'Start'                          AS Header,
'Number of books:' || R.Quantity AS Book.Quantity, 
R.Author || ':Name and Surname'  AS Book.Author,
n'End'                            AS Trailer
FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
);

Auf der Basis derselben Invoice-Nachricht führt dies in diesem Fall zu folgendem Ergebnis:

<Data>
<Output>
<Header>Start</Header>
<Book>
<Quantity>Number of books:2</Quantity>
<Author>Neil Bradley:Name and Surname</Author>
</Book>
<Trailer>End</Trailer>
</Output>
<Output>
<Header>Start</Header>
<Book>
<Quantity>Number of books:1</Quantity>
<Author>Don Chamberlin:Name and Surname</Author>
</Book>
<Trailer>End</Trailer>
</Output>
<Output>
<Header>Start</Header>
<Book>
<Quantity>Number of books:1</Quantity>
<Author>Philip Heller, Simon Roberts:Name and Surname</Author>
</Book>
<Trailer>End</Trailer>
</Output>
</Data>

Wie oben gezeigt, enthalten die AS-Klauseln der SELECT-Klausel einen Pfad, der den vollständigen Namen des Feldes, das im Ergebnis erstellt werden soll, beschreibt. Diese Pfade können auch den Typ des zu erstellenden Feldes angeben (wie normalerweise bei Pfaden). In der folgenden Beispielumwandlung sind die Feldtypen angegeben. In diesem Fall werden mit Tags versehene XML-Daten in XML-Attribute umgewandelt:

SET OutputRoot.XML.Data.Output[] =
(SELECT R.Quantity.* AS Book.(XML.Attribute)Quantity, 
R.Author.*   AS Book.(XML.Attribute)Author
FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
);

Auf der Basis derselben Invoice-Nachricht führt dies zu folgendem Ergebnis:

<Data>
<Output>
<Book Quantity="2" Author="Neil Bradley"/>
</Output>
<Output>
<Book Quantity="1" Author="Don Chamberlin"/>
</Output>
<Output>
<Book Quantity="1" Author="Philip Heller, Simon Roberts"/>
</Output>
</Data>

Schließlich haben Sie die Möglichkeit, einige der Ergebnisse mit Hilfe einer WHERE-Klausel auszuschließen. Im folgenden Beispiel wird eine WHERE-Klausel verwendet, um Ergebnisse, die eine bestimmte Bedingung erfüllen, entfernt werden. Ein vollständiges Ergebnis wird entweder ein- oder ausgeschlossen:

SET OutputRoot.XML.Data.Output[] =
(SELECT R.Quantity AS Book.Quantity, 
R.Author   AS Book.Author
FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
WHERE R.Quantity = 2
);

Auf der Basis derselben Eingangsnachricht führt dies zu folgendem Ergebnis:

<Data>
<Output>
<Book>
<Quantity>2</Quantity>
<Author>Neil Bradley</Author>
</Book>
</Output>
</Data>
Zugehörige Konzepte
Nachrichtenflüsse - Übersicht
Übersicht zu ESQL
Nachrichten modellieren
Zugehörige Tasks
Nachrichtenfluss entwerfen
Nachrichtenflussinhalt definieren
ESQL-Dateien verwalten
Zugehörige Verweise
Rechenknoten
Datenbankknoten
Filterknoten
ESQL-Referenz
Funktion CARDINALITY
DECLARE-Anweisung
Funktion SELECT
SET-Anweisung
WHILE-Anweisung
Musternachricht
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2006 Letzte Aktualisierung: 18.05.2006
ak05740_