いくつかの方法で、ESQL のあるノードを構成して反復フィールドをコピーすることができます。
反復構造を含む入力 XML メッセージについて考えます。
... <Field_top> <field1></field1> <field1></field1> <field1></field1> <field1></field1> <field1></field1> </Field_top> .....
以下のステートメントで、この全体の構造フィールドをコピーすることはできません。
SET OutputRoot.XML.Output_top.Outfield1 = InputRoot.XML.Field_top.field1;
上のステートメントは、最初の反復のみをコピーします。したがって、このステートメントと同じ結果になります。
SET OutputRoot.XML.Output_top.Outfield1[1] = InputRoot.XML.Field_top.field1[1];
入力フィールドの CARDINALITY を伴う反復を制御して、ループ内のフィールドをコピーすることができます。
SET I = 1; SET J = CARDINALITY(InputRoot.XML.Field_top.field1[]); WHILE I <= J DO SET OutputRoot.XML.Output_top.Outfield1[I] = InputRoot.XML.Field_top.field1[I]; SET I = I + 1; END WHILE;
入力フィールドからコピーするとおりに、 出力メッセージの各フィールドを変更したい場合(例えば、数を追加する、または内容を大文字に変換する)、 またはそれがコピーされた後に、これが適切な場合もあります。 出力メッセージが、入力メッセージに存在するより多くの Field1 フィールドをすでに含んでいた場合、余分のフィールドはループによって変更されず、出力メッセージ内に残ります。
以下の単一ステートメントは、入力フィールドの反復を出力フィールドにコピーし、 出力メッセージの余分のフィールドを削除します。
SET OutputRoot.XML.Output_top.Outfield1.[] = InputRoot.XML.Field_top.field1[];
下記の例は、出力ツリーにエレメントをコピーする場合に、 どのようにエレメントの名前を変更できるかを示しています。 このステートメントは、ソースのエレメント名を介してはコピーしません。 したがって、各 field1 エレメントは Target エレメントになります。
SET OutputRoot.XML.Output_top.Outfield1.Target[] = (SELECT I FROM InputRoot.XML.Field_top.field1[] AS I );
次の例は、同じ操作を行う異なる方法を示しています。同じ終了結果となります。
SET OutputRoot.XML.Output_top.Outfield2.Target[] = InputRoot.XML.Field_top.field1[];
以下の例は、ソースのエレメント名を介してコピーします。 各 field1 エレメントは、 Target エレメントの下にある field1 エレメントとして保存されます。
SET OutputRoot.XML.Output_top.Outfield3.Target.[] = InputRoot.XML.Field_top.field1[];
この例は、Target エレメントの下に作成された field1 エレメントを用いて、 同じ結果を達成する代替方法です。
SET OutputRoot.XML.Output_top.Outfield4.Target.*[] = InputRoot.XML.Field_top.field1[];
これらの例は、ESQL をコーディングしてソースからターゲットへフィールドを繰り返しコピーすることができる、いくつかの方法があることを示しています。 必要な結果を達成するために、最も適切な方法を選択します。
ここで示されているプリンシパルは、出力メッセージ・ツリーのみにではなく、 データを書き込むことができるメッセージ・ツリーのすべての領域に等しく当てはまります。