uCosminexus Interschema ユーザーズガイド

[目次][用語][索引][前へ][次へ]

6.6.6 マップ式

出力フォーマットのコンポーネントの値を定義するための式です。マップ式は,MDLエディタのマップビューに記述します。マップビューを次に示します。

図6-19 マップビュー

[図データ]

マップ式の左辺には,出力フォーマットリストで選択しているコンポーネントの名前が表示されます。マップ式の右辺には,左辺のコンポーネントに対するマップ式を記述します。マップ式を記述するための規則について次に説明します。

マップ式には,複数の種類があります。

各マップ式の記述方法について次に説明します。

<この項の構成>
(1) 要素のマップ式
(2) 構造のマップ式
(3) 評価順序遅延指定のマップ式
(4) NULLマップ式
(5) UNDEFマップ式
(6) XML属性のマップ式評価
(7) 無限回出現コンポーネントのマップ式
(8) 全体式と個別式
(9) 式表記と出力規則

(1) 要素のマップ式

出力側のフォーマットの型コンポーネントに対して定義し,そのコンポーネントの値を決める式です。マップ式を記述するコンポーネントがDTDフォーマットのEMPTY要素の場合,この式はEMPTY要素の出力の有無を決めるために使用され,値そのものは無視されます。

次に例を示します。

図6-20 要素のマップ式の例

[図データ]

Xの値としてA,Yの値としてB+Cの結果が出力されます。

(2) 構造のマップ式

型コンポーネントだけでなく,構造コンポーネントに対してもマップ式が定義できます。CII標準のマルチ明細のように,構造が複数回出現する場合に構造のマップ式を記述します。この場合,対応付けをする親コンポーネントの構造同士でマップ式を記述し,その子コンポーネントのマップ式に「$」を用いて親コンポーネントのマップ式を引き継ぐ形で記述します。この記述方法によって,親コンポーネントの構造間では構造としての出現を対応付け,その構造の個々の子コンポーネントの対応を決めることができます。

トランスレータでは,複数回出現する構造に対して構造のマップ式を定義し,その子コンポーネントのマップ式に「$」を用いて親コンポーネントのマップ式を引き継ぐ方法を推奨しています。ただし,無限回出現できる構造に対しては,原則として「INDEX(0)」を使用した1コンポーネントの代入式でなければいけません。

次の構造を例に,構造のマップ式について説明します。

図6-21 構造のマップ式の例

[図データ]

入力側の構造「MM」と出力側の構造「SS」の間でマップ式を定義しています。この場合,「SS[i]@X = MM[i]@A(i = 1, 2, 3)」の意味になり,構造「MM」と構造「SS」の持つコンポーネント同士が対応付けられます。

(3) 評価順序遅延指定のマップ式

マップ式の評価順序を変更する指定です。通常のマップ式では,フォーマットに定義されたコンポーネントの順序に従い,コンポーネントが出現した時点で値を決定します。しかし,コンポーネントのサイズが次に出現するコンポーネントによって決まるような場合,次のコンポーネントが評価されていない時点では値を決定できません。

このようなとき,マップ式の評価順序を遅延させるために,評価順序遅延(%delay)を指定します。評価順序遅延の指定には,次の2種類があります。

評価順序遅延の指定は,マップビュー内にテキスト記入するか,又は記号として選択して指定できます。

次の構造を例に,評価順序遅延の指定について説明します。

図6-22 評価順序遅延指定のマップ式の例

[図データ]

この例では,コンポーネント「B」「C」は可変長のサイズを持ち,コンポーネント「A」は構造「ROOT」のサイズを表す固定長要素とします。この例でコンポーネント「B」に対して評価順序遅延の指定をする場合の例を示します。なお,マップ式で使用する「LENGTH」は,引数で指定されたコンポーネントのサイズを計算する関数です。

評価順序遅延の指定の注意事項
  • 評価順序遅延の指定は,マップ式の左辺に記述してください。
  • 評価順序遅延の指定は,選択構造のコンポーネントに対しては指定できません。
  • 「%delay %next」を指定する場合,「%next」が指す次のコンポーネントには「%delay」を含んだマップ式は定義できません。
  • 構造全体のマップ式評価を遅延させる場合は,構造に対して「%delay %next;」又は「%delay n;」と記述してマップ式を定義します。
  • 親(先祖)コンポーネントの階層数を指定した場合,階層数が示すコンポーネントから,評価順序遅延マップ式を指定したコンポーネントが出現するまでの間に,選択構造のコンポーネントがあってはいけません。
  • マップ式の評価順序遅延の指定は,同じ親コンポーネントを持つ兄弟コンポーネントの中で複数指定できません。
  • 評価順序遅延を指定するコンポーネントのサイズは固定です(可変長要素,及び可変回数出現するコンポーネントを含む構造などには,評価順序遅延を指定してはいけません)。

(4) NULLマップ式

ある条件によってコンポーネントを出力するかどうかを指定したい場合,定数「NULL」をマップ式の値として記述できます。「NULL」を指定した場合,そのコンポーネントに対してはマップ式を定義していないことになり,そのコンポーネントは出力されません。

次に例を示します。

 
= IF(EXIST(A), "aaa", NULL);
 

この場合,コンポーネント「A」がある場合は,"aaa"を代入します。ない場合は,マップ式を記述したコンポーネントを出力しません。

Sea-NACCS EDI電文フォーマットのコンポーネントに対してNULLマップ式が記述された場合は,スペース文字を出力します。XML要素に対してNULLマップ式が記述された場合は,EMPTY要素と見なし,タグだけを出力します。

NULLマップ式の注意事項
コンポーネントが省略できない場合に「NULL」をマップ式の値として記述すると変換時にエラーになります。

(5) UNDEFマップ式

コンポーネント未定義を表すマップ式を記述する場合,%UNDEF定数を使用します。主に次の二つの用法があります。

  1. 選択構造の子コンポーネントを,意図的に選択しない
  2. 可変回出現コンポーネントの出力を終了させる

1.は,特に出力XMLフォーマットに対して有効です。XMLフォーマットの場合,通常は選択構造の順序決定式と順序決定値は設定されないため,選択構造の2番目以降の子コンポーネントを出力するためには,1番目の子コンポーネントのマップ式としてエラーになるような式を記述する必要があります。このような式としてUNDEFマップ式を記述できます。

なお,省略できる子コンポーネントに%UNDEF定数をマッピングした場合,ほかに妥当な子コンポーネントがないときは,選択構造の子コンポーネントが省略されることになります。このような場合は,%UNDEF定数をマッピングするのではなく,未使用のコンポーネントを指定して,コンポーネントを除外してください。

UNDEFマップ式の例を示します。

図6-23 UNDEFマップ式の例

[図データ]

2.は,可変回出現コンポーネントの出力数を,入力コンポーネント数に関係なく決めたい場合に適用する方法です。通常,可変回出現コンポーネントには,入力コンポーネントを代入する式を記述します。さらに,INDEX関数を使用することで,入力コンポーネントの数だけ出力するのが一般的です。しかし,場合によっては,固定数分だけ出力したい場合もあります。このような場合は,IF文のマップ式と%UNDEF定数を使用して,意図した数量分を出力できるようにします。

[図データ]

Xは入力コンポーネントAの数だけ出力されます。Yは最大2回出力されます。

%UNDEFは,INDEX関数を含むパスの代入式を評価した結果,入力コンポーネントが終了したときと同じ状態と表すものです。なお,XML要素に対して%UNDEFマップ式が記述された場合は,タグを含めてデータを出力しません。

(6) XML属性のマップ式評価

トランスレータは,XML属性を,構造又は型の下位にあるものとして扱います。式の評価規則は次のとおりです。

属性のマップ式とデフォルト値の出力の関係を次に示します。

列挙型(デフォルト値有り)
  • マップ式の評価結果を出力します。マップ式がない場合はデフォルト値を出力します。
  • マップ式の評価結果がUNDEFの場合は,値を出力しません。
  • マップ式の評価結果(UNDEF以外)に対しては,列挙された値との合致を検証します。

#REQUIRED属性
  • マップ式の評価結果を出力します。評価結果がNULLの場合は,NULL文字を出力します。
  • 評価結果がUNDEF又はマップ式がない場合は,結果としてエラーになります。

#IMPLIED属性
  • マップ式の評価結果を出力します。NULLの場合は,NULL文字を出力します。
  • 評価結果がUNDEF又はマップ式がない場合は,値を出力しません。

#FIXED属性
  • マップ式の評価結果を出力します。マップ式がない場合は,デフォルト値を出力します。
  • マップ式の評価結果がUNDEFの場合は,値を出力しません。
  • マップ式の評価結果(UNDEF以外)に対しては,デフォルト値との合致を検証します。

属性のマップ式の例を次に示します。「e」はコンポーネント,「attri」はXML属性を表します。

図6-24 属性のマップ式の例

[図データ]

  1. コンポーネントの代入式
  2. 入力側のコンポーネントの値を属性値として代入,インデクスはeに対応する
  3. eの入力元コンポーネント(XMLとして)の属性attrの値を代入する
  4. 現在のeコンポーネント値に従って属性値を決定する
  5. eのコンポーネント値に従って属性値の出力有無を決定する
  6. eのコンポーネント値に従って1番目のeの属性値と同じ値を代入する

(7) 無限回出現コンポーネントのマップ式

無限回出現コンポーネントに対しては,出力の終了が明確に判明するマップ式を記述する必要があります。通常は,INDEX(0)を含むパスの代入式で,特殊な例として%UNDEF定数による出力終了を宣言する式です。

許容されるマップ式の形態は全体式であり,次のどれかになります。

 
= xxx[INDEX(0)];          ・・・1.
= %UNDEF;                 ・・・2.
= IF (条件, <A>, <B>);    ・・・3.
 

<A><B>は,IF文の条件によって有限回数以内の評価と見なされる場合は任意です。その他の場合は,1.〜3.でなければなりません。IF文がネストしてもかまいません。

注※ 例えば,= IF(INDEX(0)<10,(任意の式),%UNDEF);のようなケースです。ただし,条件はINDEX(0)と定数の比較でなければなりません。

(8) 全体式と個別式

マップ式とデフォルト式には,コンポーネントの全出現に対して一つの式を定義する全体式と,個々の出現に対して式を定義する個別式があります。MDLエディタのドラッグ&ドロップで作成される式は,全体式です。

個別式は,個々の出現ごとに別々の値や,コンポーネントを代入したい場合に使用します。全体式と個別式が両方指定された場合は,個別式が優先されます。

 
全体式の形式: = 式;
個別式の形式: [インデクス] = 式1; [インデクス] = 式2;...
 

次に例を示します。コンポーネントAには全体式,コンポーネントBには個別式,コンポーネントCには全体式と個別式を記述しています。

図6-25 全体式と個別式の例

[図データ]

(9) 式表記と出力規則

マップ式として次のように記述した場合について説明します。

 
= IN@xxx[INDEX(0)];   ・・・1.
= %NULL;              ・・・2.
= %UNDEF;             ・・・3.
 

マップ先がXMLの型コンポーネントの場合
  1. 入力側xxxの出現数分データを出力し,途中にNULLがある場合は空要素として出力します。
  2. 空要素として出力します。
  3. タグを含めて出力しません(コンポーネントが省略できなければ,結果としてエラーになります)。

マップ先がXMLの構造コンポーネントの場合
  1. 入力側xxxの出現数分データ出力,途中のNULLは出力しません。
  2. タグを含めて出力しません。
  3. タグを含めて出力しません(コンポーネントが省略できなければ,結果としてエラーになります)。

マップ先がXML以外のコンポーネントの場合
  1. 入力側xxxの出現数分データ出力します。
  2. 出力しません(コンポーネントが省略できなければ,結果としてエラーになります)。
  3. 出力しません(コンポーネントが省略できなければ,結果としてエラーになります)。