mapsource を使用した <既定のマッパー動作の管理>
BizTalk マッパーの特定の既定の動作を変更するには、マップ ソース (.btm) ファイル内の mapsource 要素の属性を直接変更します。
値のマッピング Functoid のコード生成の最適化
マッパーが XSLT コードを生成して 値マッピング Functoid を呼び出すと、結果を格納するために変数が使用されます。 OptimizeValueMapping フラグを使用すると、値マッピング Functoid を最適化して、ステートメントが にTrue
評価されたときにのみif
変数が生成されるようにすることができます。 たとえば、 OptimizeValueMapping が [いいえ] に設定されている場合:
<xsl:variable name="var:v5" select="ScriptNS0:FormatMessage(…)" />
<xsl:if test="string($var:v4)='true'">
<xsl:variable name="var:v6" select="string($var:v5)" />
<ns0:text>
<xsl:value-of select="$var:v6" />
</ns0:text>
</xsl:if>
このコードは、 Value Mapping Functoid 呼び出しをステートメントの if
本体に移動することで最適化できます。これにより、呼び出しが必要なときにのみ実行されます。 OptimizeValueMapping を [はい] に設定すると、次のコードが生成されます。
<xsl:if test="string($var:v4)='true'">
<xsl:variable name="var:v5" select="ScriptNS0:FormatMessage(…)" />
<xsl:variable name="var:v6" select="string($var:v5)" />
<ns0:text>
<xsl:value-of select="$var:v6" />
</ns0:text>
</xsl:if>
Mapper は、マップ ソース (.btm) ファイル内の mapsource 要素の OptimizeValueMapping 属性を次のように [はい] に設定すると、この最適化が自動的に行われます。
<mapsource Name="BizTalk Map" BizTalkServerMapperTool_Version="2.0" Version="2" XRange="100" YRange="420" OmitXmlDeclaration="Yes" TreatElementsAsRecords="No" OptimizeValueMapping="Yes" GenerateDefaultFixedNodes="Yes" CopyPIs="No" method="xml" xmlVersion="1.0" IgnoreNamespacesForLinks="Yes">
大きな容量を使用するスキーマの調整
構造が非常に複雑で容量の大きいスキーマをマッパーが使用している場合は、マップのテスト、マップの検証、またはマップのコンパイルに時間がかかり、最悪の場合、"メモリの不足です" エラーが発生する可能性があります。 これは、小規模で複雑なスキーマだけでなく、大規模なスキーマでも発生する可能性があります。
複雑なスキーマの問題は、Mapper がスキーマ ツリー全体を再帰的に読み込み、リンクが接続されているか 、Value プロパティが設定されているノードを探す必要があるためです。 この問題を軽減するには、次に示すように、.btm ファイル内の mapsource 要素の GenerateDefaultFixedNodes フラグを No に設定します。
<mapsource Name="BizTalk Map" BizTalkServerMapperTool_Version="2.0" Version="2" XRange="100" YRange="420" OmitXmlDeclaration="Yes" TreatElementsAsRecords="No" OptimizeValueMapping="No" GenerateDefaultFixedNodes="No" CopyPIs="No" method="xml" xmlVersion="1.0" IgnoreNamespacesForLinks="Yes">
この設定を使用すると、マッパーはターゲット スキーマの各スキーマ ノードに関連付けられた内部のコンパイラ ノードを作成する必要がなくなります。 コンパイラでは、リンクされたノードだけが考慮されます。 これにより、メモリの使用量が大幅に削減され、"マップのテスト" 操作や "マップの検証" 操作を実行したり、マップのコンパイルや保存を行うときに、処理が高速化されます。
ただし、 GenerateDefaultFixedNodes フラグが [いいえ] に設定されている場合、ターゲット スキーマで設定された既定のフィールド値は、マップによって生成されるインスタンスでは保持されません。 これは、これらの値がターゲット インスタンス内で必要である場合問題になります。 この問題を回避するには、必要な値をマップ内で明示的に設定し直す必要があります。 GenerateDefaultFixedNodes フラグを RequiredDefaults に設定できます。つまり、必要なすべてのノードが考慮されます。 これは、リンクされたノード、既定値を持つノード、 MinOccurs プロパティが 1 以上に設定されたノード、および親が必要なノードについて説明します。
Note
GenerateDefaultFixedNodes を No または RequiredDefaults に設定した後、マップをテストし、GenerateDefaultFixedNodes が既定値の Yes (コンパイラによってすべてのノードが考慮される) に設定されている場合と同じ出力であることを確認する必要があります。
ループ Functoid、条件付き Functoid、および値のマッピング Functoid と for-each の使用の管理
ループ Functoid、条件付き Functoid、または値マッピング Functoid を使用すると、xsl:for-each
コンパイルされたマップにステートメントが生成されます。 宛先スキーマの子フィールドに無制限の最大出現回数がある場合、 xsl:for-each
ステートメントは子フィールドに配置されます。 子フィールドに無制限の最大出現回数がない場合、 xsl:for-each
ステートメントは子フィールドの親フィールドに配置されます。
ただし、ステートメントの場所は xsl:for-each
マップ結果に影響するため、 xsl:for-each
子フィールドの最大出現回数が 1 に設定されているかどうかに関係なく、ステートメントを宛先スキーマの子フィールドに配置することができます。
次に示すように、マップ (.btm) ファイルの TreatElementsAsRecords 属性の値を変更することで、 ステートメントの配置xsl:for-each
を制御できます。
<mapsource Name="BizTalk Map" BizTalkServerMapperTool_Version="2.0" Version="2" XRange="100" YRange="420" OmitXmlDeclaration="Yes" TreatElementsAsRecords="No" OptimizeValueMapping="No" GenerateDefaultFixedNodes="Yes" CopyPIs="No" method="xml" xmlVersion="1.0" IgnoreNamespacesForLinks="Yes">
この属性が Yes に設定されている場合、 xsl:for-each
子フィールドの最大出現回数が 1 に設定されているかどうかに関係なく、ステートメントは宛先スキーマの子フィールドに配置されます。
繰り返されるシーケンス グループをマップする順序の保持
XSD スキーマ内のシーケンス グループは、メッセージ インスタンスで表現できないため、ループ コンテキストを提供しません。 シーケンス グループでループを実現できないので、マッパーのコンパイラではセグメントの順序を維持するための適切な XSLT が生成されません。 その結果、入力インスタンスに存在する相対コンテキストが失われ、以降、相対コンテキストに依存する処理では出力インスタンスが役に立たなくなります。
PreserveSequenceOrder フラグを使用すると、繰り返しシーケンスを別の繰り返しシーケンスにマッピングするときにレコードの順序を維持できます。 既定では、フラグが存在しない以前のバージョンのBizTalk Serverで作成された既存のマップの機能を保持するには、フラグの値が [いいえ] に設定されています。 新しく作成されたマップでは、フラグは値が [いいえ] に設定された状態で表示されます。 セグメントの順序を維持するには、次に示すように、.btm ファイルで値を [はい ] に明示的に設定する必要があります。
<mapsource Name="BizTalk Map" BizTalkServerMapperTool_Version="2.0" Version="2" XRange="100" YRange="420" OmitXmlDeclaration="Yes" TreatElementsAsRecords="No" OptimizeValueMapping="No" GenerateDefaultFixedNodes="Yes" PreserveSequenceOrder="Yes" CopyPIs="No" method="xml" xmlVersion="1.0" IgnoreNamespacesForLinks="Yes">
以下に、サンプルの入力インスタンスを示します。
<Name>Person1</Name>
<Gender>Male</Gender>
<Address>Bellevue</Address>
<Name>Person2</Name>
<Gender>Female</Gender>
<Address>Redmond</Address>
PreserveSequenceOrder フラグを No に設定すると、出力インスタンスは次のようになります。
<Name>Person1</Name>
<Name>Person2</Name>
<Gender>Male</Gender>
<Gender>Female</Gender>
<Address>Bellevue</Address>
<Address>Redmond</Address>
PreserveSequenceOrder フラグを [はい] に設定すると、出力インスタンスは次のようになります。
<Name>Person1</Name>
<Gender>Male</Gender>
<Address>Bellevue</Address>
<Name>Person2</Name>
<Gender>Female</Gender>
<Address>Redmond</Address>