マッピングのルールと戦略

www.altova.com このトピックを印刷 前のページ 1つ上のレベル 次のページ

ホーム >  マッピングのデザイン > ノード名のマッピング >

マッピングのルールと戦略

MapForce は、通常、データを直感的にマップしますが、出力の結果が、多すぎるアイテム、または少なすぎるアイテムを含む場合があります。このトピックでは、上記のような問題を避けるための説明がされています。

 

一般的なルール

通常、ソースとターゲットアイテム間のそれぞれの接続は、以下を意味します: 各ソースアイテムのために、1つのターゲットアイテムが作成されます。ソース ノードが単純コンテンツ (例えば、 文字列または整数) を含み、ターゲットノードた単純コンテンツを受け入れる場合、 MapForce は、コンテンツをターゲットノードにコピーし、必要であれば、データ型を変換します。

 

次の例外を除いて、上記は全ての接続に対して当てはまります:

 

ターゲット XML ルート要素は、通常、1度のみ作成されます。シーケンスをこの要素に接続すると、要素のコンテンツのみが繰り返され、ルートノード要素自身は繰り返されず、結果は、スキーマに対して有効でない可能性があります。ルート要素の属性はも接続されている場合、 XML シリアル化は、ランタイムで失敗するため、ルート要素のシーケンスへの接続は回避されるべきです。複数の出力ファイルを作成して、達成する場合は、ファイル名を作成する関数を使用して、シーケンスを「ファイル」 ノードに接続してください。
ノードの一部は、シーケンスではなく単一の値を受け入れます。(例えば、 XML 属性、 データベース フィールド 、 およびユーザー定義関数内の出力 コンポーネントなど)。

 

「コンテキスト」と「現在」の アイテム

MapForce は、 スキーマ、データベース、または、 EDI ファイルの構成を、コンポーネント内でマップすることのできるアイテムの階層として表示します。これらの各ノードは、インスタンスファイル、または、データベース内で、多数のインスタンスを有する場合があります。もしくは、まったくインスタンスを有さない場合もあります。

 

例: PersonListByBranchOffice.mfd 内のソースコンポーネントを確認してください、(Contact の下に)単一の ノード first が存在します。BranchOffices.xml インスタンスファイル内には、異なる Office 親 ノードの下に、異なるコンテンツを有する複数の first ノードと Contact ノードが存在します。

 

どのソースノードが実際に選択され、データがターゲット コンポーネント/アイテムにコネクタを使用してコピーされるかは(ターゲット ノードの) 現在のコンテキストにより決定されます。

mfeg-personListBranchOff

PersonListByBranchOffice.mfd

このコンテキストは、現在のターゲットノードにより定義され、祖先に接続されます:

 

最初は、 コンテキストは、ソースコンポーネントのみを含みますが特定のノードは含みません。マッピングを評価する際には、 MapForce は、ターゲット ルート ノード(PersonList) を最初に処理します。そして、階層順に処理します。
ターゲット ノードへのコネクタは、全てのソースアイテムを直接トレースすることができ、間接的に 2 つのコンポーネント間に存在する場合でもトレースすることができます。ソースアイテムと関数の結果は、このノードのためにコンテキストに追加されます。
各新しいターゲットノードに対して、最初は親ノードコンテキストの全てのアイテムを含む新しいコンテキストが確立されます。ターゲット兄弟ノードは、ですから、互いから独立していますが、親ノードの全てのソースデータにアクセスすることができます。

 

サンプルマッピング(PersonListByBranchOffice.mfd)に適用:

 

Office からフィルター (Office) を介した PersonList への接続は、ターゲットドキュメント全体のためのコンテキストとして単一のオフィスをコンテキストとします。(これは、 PersonList がターゲットコンポーネントのルート要素のためです)。オフィスの名前は、デフォルトで「Nanonull, Inc.」 を含む入力コンポーネントにより与えられます。
ルート要素 PersonList の子孫へのすべての接続/データは、選択された単一のオフィスがコンテキスト内に存在するため、自動的にフィルターの条件により影響されます。
Contact から Person への接続は、 1 つのターゲット Person をソース XML (一般ルール)の Contact アイテム のために作成します。
first から First への接続は、現在の Contact の最初の名前を選択し、ターゲットアイテム First に書き込みます。

 

Contact から Person へのコネクタが作成されない場合、複数の First, Last、および Detail ノードを持つ 1 人の Person が作成されます。このような場合、 MapForce は、警告を表示し、次のような問題を解決する提案をします : 「 Contact と Person を接続して解決することができます」:

 

mfeg-personListBranchOff-Msg

 

シーケンス

MapForce は、スキーマ、 データベース、または、 EDI ファイルの構造を、コンポーネント内のマップすることが可能な階層として表示します。

 

(ターゲット) コンテキストにより、ソースコンポーネントの各マップすることのできるアイテムは以下を表します:

 

割り当てられた入力 ファイル単一のインスタンス ノード  (または、 データベース)
入力 ファイルのゼロから 複数の インスタンス ノード のシーケンス  (または、 データベース)

 

シーケンスがターゲット ノードに接続されている場合、ソースノードの数と同数のターゲットノードを作成するためのループが作成されます。

 

フィルター がシーケンス と ターゲットノードの間に存在する場合、ブール値の条件は、シーケンス内の各アイテムなどの各入力ノードのためにチェックされます。具体的には、 true を評価する各シーケンス内に少なくとも1つのブール値が存在するかがチェックされます。優先 コンテキスト 設定は、評価の順序を影響します。以下を参照してください。

 

上記の通り、フィルターの条件は自動的に全ての子孫ノードに適用されます。

 

メモ:ソーススキーマが特定のノードが1度のみ発生することを指定する場合、MapForce は、ループを削除し、存在が既知の場合、最初のアイテムのみを取る場合があります。この機能は、ソースコンポーネント内の設定 ダイアログボックス( 「min/maxOccurs をベースにした入力処理のオプティマイゼーション」チェックボックス) 内で無効化することができます。

 

関数 入力 (または、ノーマルな 非-シーケンス 関数) は、ターゲットノードと同様に作動します。シーケンスがこのような入力に接続されている場合、シーケンス内のアイテムと同数作成されるようにループが関数の呼び出しの周りに作成されます。

 

シーケンスが1つ以上のそのような関数入力に接続されている場合、 MapForce は、全ての入力のデカルト積を処理するネストされたループを作成します。通常これは、理想的ではないため、複数の (親または他のコンポーネントから単一の現在のアイテムにバウンドされている全ての他のパラメータなどの)アイテムを持つ単一のシーケンスのみを関数に接続してください。

 

メモ:空のシーケンスがこのような関数 (例、concat) に接続されている場合、出力 ノードを生成しない、空のシーケンスが結果として出力されます。入力データが存在しないために、 ターゲット 出力に結果がない場合、 「substitute-missing」 関数 を使用して、値を代替することができます。

 

シーケンス入力 を持つ関数のみが入力シーケンスがの場合、結果を生成することのできる関数です:

 

exists, not-existssubstitute-missing (また、最初の3つのエイリアスである is-not-null, is-nullsubstitute-null )
集計 関数 (sum、 count など)
シーケンスを受け入れる通常のユーザー定義 関数 (例、 非インライン 関数)

 

このような関数のシーケンス 入力は、常に、祖先のコンテキスト内の現在のターゲットノードとは別に評価されます。コンポーネント 、または、 SQL-Where をフィルターする、関数は、他の接続に影響を与えません。

 

優先 コンテキスト

通常、 関数 パラメータは、上から下に評価されますが、優先 コンテキスト 設定を使用して1つのパラメーターが他のパラメーターよりも先に評価されるように設定することができます。

 

filter 条件のブール値入力に接続されている関数では、優先 コンテキストは、比較関数自身のみではなく、フィルターの評価にも影響を与えます。このため、2つのソースシーケンスを組み合わせることができます  (次を参照: CompletePO.mfd、 CustomerNo および Number)。

 

次も参照してください: 優先コンテキストノード/アイテム

 

context-switch

 

コンテキストのオーバーライド

集計 関数 の一部には、任意「親コンテキスト」 入力があります。

 

この入力が接続されていない場合、 この関数は効果がなく、関数は、(ターゲットノードの親のコンテキスト内で)通常のコンテキストでシーケンス入力のために評価されます。

agg-func2

 

parent-context 入力がソース ノードに接続されている場合、関数は、 「parent-context」 ノードに対して評価され、個別の結果を各発生のために作成します。次も参照してください: マッピングコンテキストのオーバーライド

 

同じ ソースコンポーネントの複数のノードをコンテキストに移動させる

これは、特定のケースで必要とされ、中間関数を使用して移動することができます。


(C) 2019 Altova GmbH