Komplexe XML-Nachricht umwandeln

Wenn Sie ESQL-Code für einen Rechenknoten schreiben, verwenden Sie die SELECT-Anweisung für eine komplexe Nachrichtenumwandlung.

Beispiele

Sehen Sie sich folgende Beispiele an, und ändern Sie sie Ihren Anforderungen entsprechend. Sie basieren alle auf der Nachricht 'Invoice' (Rechnung) als Eingabe:

In diesem Beispiel enthält 'Invoice' eine variable Anzahl Elemente (Item). Die Umwandlung ist im Folgenden dargestellt:

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'
    );

Die generierte Ausgabenachricht lautet:

<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 sind zwei SELECT-Klauseln ineinander verschachtelt. Die äußere Klausel wird auf die Liste mit Rechnungen (Invoice) angewendet. Die innere Klausel wird auf die Liste mit Elementen (Item) angewendet. Die AS-Klausel, die der inneren SELECT-Klausel 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[],

Dadurch erkennt die äußere SELECT-Klausel, dass eine variable Anzahl an Elementen in jedem Ergebnis zu erwarten ist. Jede SELECT-Klausel hat einen eigenen Korrelationsnamen: I für die äußere SELECT-Klausel und II für die innere. Jede SELECT-Klausel verwendet normalerweise ihren eigenen Korrelationsnamen, aber die FROM-Klausel der inneren SELECT-Klausel verweist auf den Korrelationsnamen der äußeren SELECT-Klausel:

            (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[],

Dadurch erkennt die innere SELECT-Klausel, dass sie mit den Elementen der aktuellen Rechnung arbeiten muss. Beide SELECT-Klauseln enthalten WHERE-Klauseln. Die äußere SELECT-Klausel verwendet ein Kriterium zum Löschen bestimmter Kunden (Customer), und die innere verwendet ein anderes Kriterium zum Löschen bestimmter Elemente (Item). Dieses Beispiel veranschaulicht auch die Verwendung von COALESCE, um zu verhindern, dass fehlende Eingabefelder dazu führen, dass auch das entsprechende Ausgabefeld fehlt. Schließlich wird auch die Spaltenfunktion SUM verwendet, um die Werte aller Elemente in jeder Rechnung zu addieren. Spaltenfunktionen werden unter Auf Spalten in einer Datenbank verweisen erläutert.

Wenn die Desc-Felder erstellt werden, wird das gesamte Eingabefeld 'Title' kopiert : die XML-Attribute und der Feldwert. Wenn diese Attribute in der Ausgabenachricht nicht enthalten sein sollen, können Sie sie mit der FIELDVALUE-Funktion löschen. Schreiben Sie z. B. folgenden 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
Einen Nachrichtenfluss entwerfen
Nachrichtenflussinhalte definieren
ESQL-Dateien verwalten
Handhabung umfangreicher XML-Nachrichten
Zugehörige Verweise
Rechenknoten (Compute)
Datenbankknoten (Database)
Filterknoten
ESQL-Referenz
CAST-Funktion
COALESCE-Funktion
SELECT-Funktion
SET-Anweisung
Beispielnachricht
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2006 Letzte Aktualisierung: 23. Aug. 2006
ak05750_