基本のマッピング操作と複雑なマッピング操作
BizTalk マッパーは、単純な親子ツリー型の操作から、ループ レコードや階層を含む詳細で複雑な操作まで、さまざまなマッピング シナリオに対するソリューションを提供します。 マッピング シナリオの複雑さは、ユーザーの好みとビジネス ニーズによって異なります。XML スキーマ定義 (XSD) 言語を使用すると、構造化形式を定義する際に柔軟性が高まります。 ほぼすべてのマッピング シナリオは、2 つのカテゴリ (基本的なマッピングと複雑なマッピング) のいずれかに分類されます。
基本的なマッピング
基本的なマッピングとは、最も一般的なマッピングのことをいいます。 基本的なマップでは、入力項目と出力項目が 1 対 1 の関係になります。 入力項目は、対応する 1 つの出力項目にのみマップされます。 複数の Functoid やカスケード Functoid を使用してコピーされる値を操作するなど、基本的なマッピングでは多くの種類の変換と変換が可能ですが、基になるシナリオは比較的単純なままです。 基本的なマッピング操作では、2 つの異なる親レコード (一度だけ発生する) に属するフィールドを、送信先スキーマの単一の親レコードに属するフィールドへマッピングすることもあります。
複雑なマッピング
複雑なマッピングには、スキーマ ツリーの Record ノードまたは Field Element ノードの 1 つのインスタンスに対して複数回発生するレコードまたはフィールドが含まれます。 このようなノードの Max Occurs プロパティは 1 より大きい値に設定され、インスタンス メッセージに対応する要素が複数存在する可能性があることを示します。 BizTalk マップでこの種類の変数数マッピング (ループとも呼ばれます) を使用 する場合、拡張スタイルシート言語 (XSL) スタイル シート コンパイラは、必要な出力を生成するために反復処理する適切なループ パスを決定できる必要があります。
通常、送信元スキーマのループ レコードのフィールドを、送信先スキーマのループ レコードのフィールドにリンクできます。 入力インスタンス メッセージ内にある要素の数によって、出力インスタンス メッセージ内に作成される要素の数が決まります。 送信元スキーマおよび送信先スキーマを基にした、次の XSD フラグメントを考えてみます。
送信元スキーマのフラグメント
<xs:element minOccurs="1" maxOccurs="5"
name="SrcLoopingRecord">
<xs:complexType>
<xs:sequence>
<xs:element name="" type="xs:string" />
<xs:element name="" type="xs:integer" />
</xs:sequence>
</xs:complexType>
</xs:element>
送信先スキーマのフラグメント
<xs:element minOccurs="0" maxOccurs="unbounded"
name="DstLoopingRecord">
<xs:complexType>
<xs:sequence>
<xs:element name="" type="xs:string" />
<xs:element name="" type="xs:integer" />
</xs:sequence>
</xs:complexType>
</xs:element>
これらのフラグメントを説明します。
入力インスタンス メッセージの Record ノードである SrcLoopingRecord は、1 回から 5 回まで発生する可能性があります。 また、親の各インスタンスに対して 1 回発生する Field1 (文字列) ノードと Field2 (整数) の子 Field 要素ノードも含まれます。
出力インスタンス メッセージの Record ノードである DstLoopingRecord は、無制限の 0 回以上発生する可能性があります。 また、親の各インスタンスに対して 1 回発生する FieldA (文字列) ノードと FieldB (整数) の子 Field 要素ノードも含まれます。
Field1 と FieldA、および Field2 と FieldB がマップされ、次に示す入力インスタンス メッセージのフラグメントがこれらをマップすると仮定した場合、出力インスタンス メッセージから次のフラグメントが生成されます。
入力インスタンス メッセージのフラグメント
<SrcLoopingRecord>
<Field1>A string</Field1>
<Field2>10</Field2>
</SrcLoopingRecord>
<SrcLoopingRecord>
<Field1>Another string</Field1>
<Field2>11</Field2>
</SrcLoopingRecord>
<SrcLoopingRecord>
<Field1>A ball of string</Field1>
<Field2>12</Field2>
</SrcLoopingRecord>
出力インスタンス メッセージのフラグメント
<DstLoopingRecord>
<FieldA>A string</FieldA>
<FieldB>10</FieldB>
</DstLoopingRecord>
<DstLoopingRecord>
<FieldA>Another string</FieldA>
<FieldB>11</FieldB>
</DstLoopingRecord>
<DstLoopingRecord>
<FieldA>A ball of string</FieldA>
<FieldB>12</FieldB>
</DstLoopingRecord>
入力インスタンス メッセージ (3) 内の SrcLoopingRecord 要素の出現回数によって、出力インスタンス メッセージ内の DstLoopingRecord 要素の出現回数が決まります。
BizTalk マッパーでサポートされていないマッピングでは、複数のループ パスが使用されます。 このようなマッピングでは、送信元スキーマの 2 つ以上のループ レコードに属するフィールドから、送信先スキーマの単一のルーピング レコードに属するフィールドへのマップ操作が行われます。 これにより問題が発生します。出力インスタンス メッセージで生成する要素の数を決定する効果的な方法はありません。 複数のループ パスを使用すると、送信先ノードが複数の送信元ループ パスを持つことを示す、マップのコンパイル警告が発生します。 ただし、これは単なる警告であり、最初の送信元ループ パスの繰り返し回数が使用されて、出力インスタンス メッセージに生成される要素の数が決定されます。 ループの動作を明示的に制御するには、ループ functoid を 使用します。
Microsoft BizTalk Serverでは、テーブル駆動型ループと呼ばれる新しい種類のループが導入されました。 1 つ以上の定数、送信元スキーマからのリンク、または Functoid を組み合わせた入力インスタンス メッセージのデータに基づいて、出力インスタンス メッセージを使用する必要がある場合、テーブルドリブン ループは便利です。 この場合、出力インスタンス メッセージは、異なる定数を組み合わせた入力インスタンス メッセージの単一のレコードのデータに基づいて (または、入力インスタンス メッセージの複数のレコードのデータに基づいて)、複数のレコードを持つことができます。 テーブル ループとテーブル抽出 Functoid を使用したテーブル駆動型ループの詳細については、「テーブル ループとテーブル抽出 Functoid」を参照してください。