uCosminexus Interschema ユーザーズガイド
出力フォーマットのコンポーネントの値を定義するための式です。マップ式は,MDLエディタのマップビューに記述します。マップビューを次に示します。
図6-19 マップビュー
マップ式の左辺には,出力フォーマットリストで選択しているコンポーネントの名前が表示されます。マップ式の右辺には,左辺のコンポーネントに対するマップ式を記述します。マップ式を記述するための規則について次に説明します。
マップ式には,複数の種類があります。
各マップ式の記述方法について次に説明します。
出力側のフォーマットの型コンポーネントに対して定義し,そのコンポーネントの値を決める式です。マップ式を記述するコンポーネントがDTDフォーマットのEMPTY要素の場合,この式はEMPTY要素の出力の有無を決めるために使用され,値そのものは無視されます。
次に例を示します。
図6-20 要素のマップ式の例
Xの値としてA,Yの値としてB+Cの結果が出力されます。
型コンポーネントだけでなく,構造コンポーネントに対してもマップ式が定義できます。CII標準のマルチ明細のように,構造が複数回出現する場合に構造のマップ式を記述します。この場合,対応付けをする親コンポーネントの構造同士でマップ式を記述し,その子コンポーネントのマップ式に「$」を用いて親コンポーネントのマップ式を引き継ぐ形で記述します。この記述方法によって,親コンポーネントの構造間では構造としての出現を対応付け,その構造の個々の子コンポーネントの対応を決めることができます。
トランスレータでは,複数回出現する構造に対して構造のマップ式を定義し,その子コンポーネントのマップ式に「$」を用いて親コンポーネントのマップ式を引き継ぐ方法を推奨しています。ただし,無限回出現できる構造に対しては,原則として「INDEX(0)」を使用した1コンポーネントの代入式でなければいけません。
次の構造を例に,構造のマップ式について説明します。
図6-21 構造のマップ式の例
入力側の構造「MM」と出力側の構造「SS」の間でマップ式を定義しています。この場合,「SS[i]@X = MM[i]@A(i = 1, 2, 3)」の意味になり,構造「MM」と構造「SS」の持つコンポーネント同士が対応付けられます。
マップ式の評価順序を変更する指定です。通常のマップ式では,フォーマットに定義されたコンポーネントの順序に従い,コンポーネントが出現した時点で値を決定します。しかし,コンポーネントのサイズが次に出現するコンポーネントによって決まるような場合,次のコンポーネントが評価されていない時点では値を決定できません。
このようなとき,マップ式の評価順序を遅延させるために,評価順序遅延(%delay)を指定します。評価順序遅延の指定には,次の2種類があります。
評価順序遅延の指定は,マップビュー内にテキスト記入するか,又は記号として選択して指定できます。
次の構造を例に,評価順序遅延の指定について説明します。
図6-22 評価順序遅延指定のマップ式の例
この例では,コンポーネント「B」「C」は可変長のサイズを持ち,コンポーネント「A」は構造「ROOT」のサイズを表す固定長要素とします。この例でコンポーネント「B」に対して評価順序遅延の指定をする場合の例を示します。なお,マップ式で使用する「LENGTH」は,引数で指定されたコンポーネントのサイズを計算する関数です。
%delay%next = LENGTH(OUT@ROOT);
%delay 1 = LENGTH(OUT@ROOT);
ある条件によってコンポーネントを出力するかどうかを指定したい場合,定数「NULL」をマップ式の値として記述できます。「NULL」を指定した場合,そのコンポーネントに対してはマップ式を定義していないことになり,そのコンポーネントは出力されません。
次に例を示します。
= IF(EXIST(A), "aaa", NULL);
この場合,コンポーネント「A」がある場合は,"aaa"を代入します。ない場合は,マップ式を記述したコンポーネントを出力しません。
Sea-NACCS EDI電文フォーマットのコンポーネントに対してNULLマップ式が記述された場合は,スペース文字を出力します。XML要素に対してNULLマップ式が記述された場合は,EMPTY要素と見なし,タグだけを出力します。
コンポーネント未定義を表すマップ式を記述する場合,%UNDEF定数を使用します。主に次の二つの用法があります。
1.は,特に出力XMLフォーマットに対して有効です。XMLフォーマットの場合,通常は選択構造の順序決定式と順序決定値は設定されないため,選択構造の2番目以降の子コンポーネントを出力するためには,1番目の子コンポーネントのマップ式としてエラーになるような式を記述する必要があります。このような式としてUNDEFマップ式を記述できます。
なお,省略できる子コンポーネントに%UNDEF定数をマッピングした場合,ほかに妥当な子コンポーネントがないときは,選択構造の子コンポーネントが省略されることになります。このような場合は,%UNDEF定数をマッピングするのではなく,未使用のコンポーネントを指定して,コンポーネントを除外してください。
UNDEFマップ式の例を示します。
図6-23 UNDEFマップ式の例
2.は,可変回出現コンポーネントの出力数を,入力コンポーネント数に関係なく決めたい場合に適用する方法です。通常,可変回出現コンポーネントには,入力コンポーネントを代入する式を記述します。さらに,INDEX関数を使用することで,入力コンポーネントの数だけ出力するのが一般的です。しかし,場合によっては,固定数分だけ出力したい場合もあります。このような場合は,IF文のマップ式と%UNDEF定数を使用して,意図した数量分を出力できるようにします。
Xは入力コンポーネントAの数だけ出力されます。Yは最大2回出力されます。
%UNDEFは,INDEX関数を含むパスの代入式を評価した結果,入力コンポーネントが終了したときと同じ状態と表すものです。なお,XML要素に対して%UNDEFマップ式が記述された場合は,タグを含めてデータを出力しません。
トランスレータは,XML属性を,構造又は型の下位にあるものとして扱います。式の評価規則は次のとおりです。
属性のマップ式とデフォルト値の出力の関係を次に示します。
属性のマップ式の例を次に示します。「e」はコンポーネント,「attri」はXML属性を表します。
図6-24 属性のマップ式の例
無限回出現コンポーネントに対しては,出力の終了が明確に判明するマップ式を記述する必要があります。通常は,INDEX(0)を含むパスの代入式で,特殊な例として%UNDEF定数による出力終了を宣言する式です。
許容されるマップ式の形態は全体式であり,次のどれかになります。
= xxx[INDEX(0)]; ・・・1. = %UNDEF; ・・・2. = IF (条件, <A>, <B>); ・・・3.
<A><B>は,IF文の条件によって有限回数以内の評価と見なされる場合は任意です※。その他の場合は,1.〜3.でなければなりません。IF文がネストしてもかまいません。
マップ式とデフォルト式には,コンポーネントの全出現に対して一つの式を定義する全体式と,個々の出現に対して式を定義する個別式があります。MDLエディタのドラッグ&ドロップで作成される式は,全体式です。
個別式は,個々の出現ごとに別々の値や,コンポーネントを代入したい場合に使用します。全体式と個別式が両方指定された場合は,個別式が優先されます。
全体式の形式: = 式; 個別式の形式: [インデクス] = 式1; [インデクス] = 式2;...
次に例を示します。コンポーネントAには全体式,コンポーネントBには個別式,コンポーネントCには全体式と個別式を記述しています。
図6-25 全体式と個別式の例
マップ式として次のように記述した場合について説明します。
= IN@xxx[INDEX(0)]; ・・・1. = %NULL; ・・・2. = %UNDEF; ・・・3.
All Rights Reserved, Copyright (C) 2000, Information-technology Promotion Agency, Japan.
All Rights Reserved. Copyright (C) 2005, 2008, Hitachi, Ltd.
All Rights Reserved, Copyright (C) 1985-1998, Microsoft Corporation.