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, 2005 Letzte Aktualisierung: Nov 17, 2005
ak05750_