単純な XML メッセージの変換

Compute ノードに ESQL をコーディングする際に、SELECT ステートメントを使用して単純なメッセージを変換できます。

以下の例を考慮し、独自にご使用になるために変更を加えてください。入力は、すべて Invoice メッセージに基づいています。

次の ESQL をご覧ください。

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

ESQL が Invoice メッセージを処理する場合、以下の出力メッセージが生成されます。

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

3 つの Output フィールドがあり、Item フィールドごとに 1 つ存在しています。これは、デフォルトで SELECT は結果リスト内に、FROM リストによって記述された各項目に対して、 項目を 1 つずつ作成するためです。 各 Output フィールド内には、SELECT 文節で指定されている各フィールドのためのフィールドがあります。 これらは着信メッセージにおける順序ではなく、SELECT で指定されている順序で配列されています。

最後の AS キーワードの後にある R は、相関名として知られています。 これは、FROM 文節によってアドレッシングされたフィールドのそれぞれを順番に表すローカル変数です。 選択された名前は、特に重要ではありません。 要約すると、この単純な変換は、次の 2 つの事柄を行います。

  1. 不要なフィールドを廃棄する。
  2. フィールドの順序を確定する。

これは、プロシージャー型のアルゴリズムによってインプリメントされたものと同じ変換です。

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;

以上の例から分かるように、SELECT を使用した変換のほうが、はるかに簡潔です。 また、そのほうがより速く実行されます。

次の例は、より高度な変換を示しています。

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

この変換では、SELECT 文節内の各項目に関連した AS 文節があります。 これは、結果内の各フィールドに、入力から継承したフィールド名ではなく、明示的な名前を与えます。 これらの名前は、例に示されたようなパス (つまり、ドットで区切られた名前のリスト) であってもかまいません。 したがって、出力メッセージの構造は、入力メッセージのものとは異なることがあります。 同じ Invoice メッセージを使用すると、結果は次のようになります。

<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>

SELECT 文節内の式は、どれだけ複雑であってもかまわず、特に制約事項はありません。 演算子、関数、リテラル、変数の参照、または相関名に関連していないフィールドの参照を組み込むことができます。 次に、さらに複雑な式の例を示します。

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,
                                                   'End'    AS Trailer
                        FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
    );

同じ Invoice メッセージを使用すると、この場合の結果は次のようになります。

<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>

上記のとおり、SELECT 文節の AS 文節には、 結果内に作成されるフィールドの絶対パス名を記述したパスを含めることができます。 これらのパスはまた、作成されるフィールドのタイプを指定することもできます (パスの場合には標準の指定)。 フィールド・タイプを指定した変換例を以下に示します。 この場合、XML タグ付きデータは、XML 属性に変換されます。

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

同じ Invoice メッセージを使用すると、結果は次のようになります。

<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>

最後に、WHERE 文節を使用して、結果のいくつかを除去することができます。 次の例では、WHERE 文節を使用して、特定の基準に合う結果を除去します。 結果全体が組み込まれるか、または除外されます。

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

同じ入力メッセージを使用すると、結果は次のようになります。

<Data>
 <Output>
  <Book>
         <Quantity>2</Quantity>
         <Author>Neil Bradley</Author>
  </Book>
 </Output>
</Data>

関連概念
メッセージ・フロー
ESQL
メッセージのモデル化

関連タスク
メッセージ・フローの設計
メッセージ・フローの内容の定義
ESQL ファイルの管理

関連資料
Compute ノード
Database ノード
Filter ノード
ESQL
CARDINALITY 関数
DECLARE ステートメント
SELECT 関数
SET ステートメント
WHILE ステートメント
サンプル・メッセージ