Umwandeln einer komplexen XML-Nachricht

Verwenden Sie beim Erstellen des ESQL-Codes für einen Rechenknoten die SELECT-Anweisung zum Umwandeln komplexer 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.

In diesem Beispiel enthält die Invoice-Nachricht eine variable Anzahl von Elementen (Items). Die Umwandlung wird im Folgenden gezeigt:

SET OutputRoot.XML.Data.Statement[] =
(SELECT I.Customer.Title                                   AS Customer.Title, 
I.Customer.FirstName || ' ' || I.Customer.LastName AS Customer.Name,
COALESCE(I.Customer.PhoneHome,'')                  AS Customer.Phone,
(SELECT II.Title                          AS Desc,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity                       AS Qty 
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],
(SELECT SUM( CAST(II.UnitPrice AS FLOAT) *
CAST(II.Quantity  AS FLOAT) *
1.6                           )
FROM I.Purchases.Item[] AS II        )        AS Amount,
'Dollars'                                      AS Amount.(XML.Attribute)Currency
FROM InputRoot.XML.Invoice[] AS I
WHERE I.Customer.LastName <> 'Brown'
);

Es wird folgende Ausgabenachricht generiert:

<Data>
<Statement>
<Customer>
		<Title>Mr</Title><Name>Andrew Smith</Name>
<Phone>01962818000</Phone>
</Customer>
<Purchases>
<Article>
<Desc Category="Computer" Form="Paperback" Edition="2">The XML Companion</Desc>
<Cost>4.472E+1</Cost>
<Qty>2</Qty>
</Article>
<Article>
<Desc Category="Computer" Form="Paperback" Edition="2">
A Complete Guide to DB2 Universal Database</Desc>
<Cost>6.872E+1</Cost>
<Qty>1</Qty>
</Article>
<Article>
<Desc Category="Computer" Form="Hardcover" Edition="0">JAVA 2 Developers Handbook</Desc>
<Cost>9.5984E+1</Cost>
<Qty>1</Qty>
</Article>
</Purchases>
<Amount Currency="Dollars">2.54144E+2</Amount>
</Statement>
</Data>

Bei dieser Umwandlung werden zwei SELECT-Anweisungen verwendet, die ineinander verschachtelt sind. Die äußere bearbeitet die Liste der Rechnungen (Invoices). Die innere bearbeitet die Liste der Elemente (Items). Die AS-Klausel, die der inneren SELECT-Anweisung zugeordnet ist, erwartet eine Feldgruppe:

(SELECT II.Title                          AS Desc,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity                       AS Qty 
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice > 0.0 )
-- Beachten Sie die Verwendung von [] im nächsten Ausdruck
AS Purchases.Article[],

Dies sagt der äußeren SELECT-Anweisung, dass sie in jedem Ergebnis mit einer variablen Anzahl von Elementen rechnen muss. Jede SELECT-Anweisung hat einen eigenen Korrelationsnamen: I für die äußere und II für die innere. In der Regel verwendet jede SELECT-Anweisung ihren eigenen Korrelationsnamen, wobei die FROM-Klausel der inneren SELECT-Anweisung auf den Korrelationsnamen der äußeren SELECT-Anweisung verweist:

(SELECT II.Title                          AS Desc,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity                       AS Qty 
-- Beachten Sie die Verwendung von I.Purchases.Item im nächsten Ausdruck
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],

Dies sagt der inneren SELECT-Anweisung, dass sie die Elemente der aktuellen Invoice-Nachricht bearbeiten soll. Beide SELECT-Anweisungen enthalten WHERE-Klauseln. Die äußere verwendet ein Kriterium, um bestimmte Kunden (Customer) zu löschen, und die innere verwendet ein anderes Kriterium, um bestimmte Elemente (Items) zu löschen. Das Beispiel zeigt, wie mit Hilfe von COALESCE verhindert wird, dass fehlende Eingabefelder dazu führen, dass auch die entsprechenden Ausgabefelder fehlen. Schließlich verwendet das Beispiel die Spaltenfunktion SUM, um den Wert aller Elemente in jeder einzelnen Rechnung zu addieren. Spaltenfunktionen werden unter Verweise auf Spalten in einer Datenbank erläutert.

Bei der Erstellung der Beschreibungsfelder (Desc) wird der vollständige Inhalt des Eingabefeldes für den Titel kopiert: die XML-Attribute und der Feldwert. Falls die Ausgabenachricht diese Attribute nicht enthalten soll, können Sie sie mit Hilfe der Funktion FIELDVALUE löschen, z. B. mit folgendem ESQL-Code:

SET OutputRoot.XML.Data.Statement[] =
(SELECT I.Customer.Title                                   AS Customer.Title, 
I.Customer.FirstName || ' ' || I.Customer.LastName AS Customer.Name,
COALESCE(I.Customer.PhoneHome,'')                  AS Customer.Phone,
(SELECT FIELDVALUE(II.Title)                       AS Desc,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity                       AS Qty 
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],
(SELECT SUM( CAST(II.UnitPrice AS FLOAT) *
CAST(II.Quantity  AS FLOAT) *
1.6                           )
FROM I.Purchases.Item[] AS II        )        AS Amount,
'Dollars'                                      AS Amount.(XML.Attribute)Currency
FROM InputRoot.XML.Invoice[] AS I
WHERE I.Customer.LastName <> 'Brown'
);

Auf diese Weise wird folgende Ausgabenachricht generiert:

<Data>
<Statement>
<Customer>
		<Title>Mr</Title><Name>Andrew Smith</Name>
<Phone>01962818000</Phone>
</Customer>
<Purchases>
<Article>
<Desc>The XML Companion</Desc>
<Cost>4.472E+1</Cost>
<Qty>2</Qty>
</Article>
<Article>
<Desc>A Complete Guide to DB2 Universal Database</Desc>
<Cost>6.872E+1</Cost>
<Qty>1</Qty>
</Article>
<Article>
<Desc>JAVA 2 Developers Handbook</Desc>
<Cost>9.5984E+1</Cost>
<Qty>1</Qty>
</Article>
</Purchases>
<Amount Currency="Dollars">2.54144E+2</Amount>
</Statement>
</Data>
Zugehörige Konzepte
Nachrichtenflüsse - Übersicht
Übersicht zu ESQL
Nachrichten modellieren
Zugehörige Tasks
Nachrichtenfluss entwerfen
Nachrichtenflussinhalt definieren
ESQL-Dateien verwalten
Handhabung umfangreicher XML-Nachrichten
Zugehörige Verweise
Rechenknoten
Datenbankknoten
Filterknoten
ESQL-Referenz
Funktion CAST
Funktion COALESCE
Funktion SELECT
SET-Anweisung
Musternachricht
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2006 Letzte Aktualisierung: 18.05.2006
ak05750_