DTL <foreach>
構文
<foreach property="P1" key="K1">
...
</foreach>
属性
属性 | 説明 | 値 |
---|---|---|
property | 必須項目。繰り返しが行われるコレクション・プロパティ (リストまたは配列)。これは、実行コンテキスト内の有効なオブジェクト名およびプロパティ名である必要があります。 | 1 文字以上の文字列。 |
key | 必須項目。コレクション内で繰り返しを実行するために使用するインデックス。これは、実行コンテキスト内の有効なオブジェクト名およびプロパティ名である必要があります。コレクション内の要素ごとに値が割り当てられます。 | 1 文字以上の文字列。 |
要素
要素 | 目的 |
---|---|
<annotation> | オプション。<foreach> 要素について記述するテキスト文字列。 |
ほとんどのアクティビティ | オプション。<foreach> には、<assign>、<code>、<foreach>、<if>、<sql>、<subtransform>、および <trace> をゼロ個以上、自由に組み合わせて使用できます。 |
説明
<foreach> 要素では、繰り返し実行される一連のアクティビティを定義します。これらのアクティビティは、指定したコレクション・プロパティ内にある各要素について 1 回ずつ実行されます。要素が NULL の場合、このシーケンスは実行されません。このシーケンスは、要素に空の値がある場合に (つまり、セパレータはあるがその間に値がない場合に) 実行されます。しかし、NULL 値に対しては実行されません。つまり、フィールドが指定される前にメッセージが終了します。
以下に例を示します。
<foreach key='i' property='target.{PID:3()}'>
<assign property='target.{PID:3(i).4}' value='"001"' action='set'/>
</foreach>
または
<foreach key='key' property='source.{PID:PatientIDInternalID()}'>
<if condition='source.{PID:PatientIDInternalID(key).identifiertypecode}="PAS"'>
<true>
<assign property='target.{PID:PatientIdentifierList(key).identifiertypecode}'
value='"MR"'
action='set'/>
</true>
</if>
<if condition='source.{PID:PatientIDInternalID(key).identifiertypecode}="GMS"'>
<true>
<assign property='target.{PID:PatientIdentifierList(key).identifiertypecode}'
value='"MC"'
action='set'/>
<assign property='target.{PID:PatientIdentifierList(key).assigningfacility}'
value='"AUSHIC"'
action='set'/>
</true>
</if>
</foreach>
<foreach> 要素で参照するプロパティは、データ変換のソースまたはターゲット・オブジェクト内のプロパティである必要があります。
ネストされた <foreach>
<foreach> 要素をネスト構造にすることができます。
次のトピックでは、この <foreach> 構文をどのように簡素化できるかを説明します。
<foreach> のショートカット
ドキュメントベースのメッセージまたは “仮想ドキュメント” タイプを扱っている場合は、<assign> 文によって、ドキュメント構造内の反復フィールドのすべてのインスタンスを通して繰り返されるショートカット表記が提供されます。したがって、繰り返しフィールドを処理するためだけに、'i' 'j' および 'k' を使用した <foreach> ループを実際に設定する必要はありません。代わりに、空のかっこを使用したより簡単な表記を使用できます。
このかっこを使用するショートカットは、ネスト構造の <foreach> にも使用できます。
ラージ・メッセージでの <STORE> エラーの回避
メッセージまたはオブジェクト・コレクションでセグメントのループ処理を行う際には、セグメントがメモリに書き込まれます。これらのオブジェクトによって現在のプロセスに割り当てられているすべてのメモリが消費されると、予期しないエラーが発生することがあります。
これを避けるために、不要になったオブジェクトはメモリから削除します。例えば、<foreach> ループで多数のセグメントを処理する場合、ループの最終ステップでソースとターゲットの両方に対して commitSegmentByPath メソッドを呼び出します。同様に、オブジェクト・コレクションの場合は %UnSwizzleAt メソッドを使用します。
コードを変更できない場合の一時的な回避策としては、各プロセスに割り当てられているメモリの量を増やします。この変更を行うには、管理ポータルの [メモリ詳細設定] ページで bbsiz パラメータを設定します。この場合、システムを再起動する必要がある点に注意してください。また、この変更を行う前に、必ずシステム管理者に相談してください。