xsd::list タイプのエレメントの処理

XML スキーマ仕様では、それぞれの値を空白文字で区切るという簡単な種類の、複数の値からなるリストをエレメントまたは属性に含めることができます。

次のような XML 入力メッセージがあるとします。
   <message1>
     <listE1 listAttr="one two three"> four five six</listE1>
   </message1> 

結果として生成されるメッセージ・ツリーでは、xsd::list タイプは、リスト項目ごとに無名値の子を持つ名前ノードとして表されます。これにより、反復リストは情報を失わずに処理されます。

反復リストは兄弟名エレメントとして現れます。それぞれのエレメントには、個々のリスト項目ごとに独自の無名値の子ノードがあります。上記のメッセージ例の場合、以下のような論理ツリーを生成します。
   MRM	   	listEl  (名前)
		       	listAttr (名前)
			       "one"   (値)
			       "two"   (値)
			       "three" (値)
		        "four" (値)
		        "five" (値)
		        "six"  (値)
個々のリスト項目には、ElementName.*[n] としてアクセスすることができます。例えば、以下のようになります。
  SET OutputRoot.MRM.listEl.listAttr.*[3] = ...
の場合、listAttr の 3 番目の項目が変更されます。

リストと反復エレメントの間のマッピング

次のような形式の XML 入力メッセージがあるとします。
   <MRM>
     <inner>abcde fghij 12345</inner>
   </MRM> 
ここで、inner エレメントのタイプは xsd::list であるため、1 つではなく 3 つのストリング値が関連付けられています。
次のように、各値が反復エレメントの 1 つのインスタンスに関連付けられる形式で 3 つの値を出力メッセージにコピーしたい場合には、
   <MRM>
     <str1>abcde</str1>
     <str1>fghij</str1>
     <str1>12345</str1>
   </MRM> 
以下のような ESQL 構文は適切に見えるかもしれません。
   DECLARE D INTEGER;
   SET D = CARDINALITY(InputBody.str1.*[]);
   DECLARE M INTEGER 1;
   WHILE M <= D DO
      SET OutputRoot.MRM.str1[M] = InputBody.inner.*[M];
      SET M = M + 1;
   END WHILE;
しかし、次のステートメントの場合、
   SET OutputRoot.MRM.str1[M] = InputBody.inner.*[M];
ソースからターゲットへのツリー・コピーが要求されます。ターゲット・エレメントがまだ存在しないため、それが作成され、ソースと同じ値およびタイプ が設定されます。

これは他の ESQL の振る舞いと一貫していますが、タイプ list の値を持つエレメントの場合には、このコードによって誤った妥当性検査エラーが生成される可能性があります。

この問題を避けるには、ソース・エレメントの値だけを明示的に取り出すために、FIELDVALUE 関数を以下のように使用することをお勧めします。
      SET OutputRoot.MRM.str1[M] = FIELDVALUE(InputBody.inner.*[M]);
関連タスク
ESQL の開発
メッセージ本体のエレメントへのアクセス
関連資料
SET ステートメント
FIELDVALUE 関数
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
ak05141_