BizTalk マッパーの特定の既定の動作は、マップ ソース (.btm) ファイル内の mapsource 要素の属性を直接変更することで変更できます。
値マッピングファンクトイドのコード生成の最適化
Mapper が XSLT コードを生成して 値マッピング Functoid を呼び出すと、変数を使用して結果が格納されます。
OptimizeValueMapping フラグを使用すると、if
ステートメントがTrue
に評価される際にのみ変数が生成されるように、値マッピング Functoid を最適化できます。 たとえば、 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 を Yes に設定すると、次のコードが生成されます。
<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>
マップ ソース (.btm) ファイル内の mapsource 要素の OptimizeValueMapping 属性を次のように [はい] に設定すると、Mapper はこの最適化を自動的に実行します。
<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">
この設定では、Mapper はターゲット スキーマの各スキーマ ノードに関連付けられている内部コンパイラ ノードを作成する必要はありません。 コンパイラでは、リンクされたノードのみが考慮されます。 これにより、メモリ消費量が大幅に削減され、"テスト マップ" または "マップの検証" 操作、マップのコンパイル、またはマップの保存時のプロセスが高速化されます。
ただし、 GenerateDefaultFixedNodes フラグが No に設定されている場合、ターゲット スキーマで設定された既定のフィールド値は、マップによって生成されたインスタンスに保持されません。 これは、ターゲット インスタンスでこれらの値が必要な場合に問題になります。 これを回避するには、必要な値をマップで明示的に再び設定する必要があります。 GenerateDefaultFixedNodes フラグを RequiredDefaults に設定できます。つまり、必要なすべてのノードが考慮されます。 これには、リンクされたノード、既定値を持つノード、 MinOccurs プロパティが 1 以上に設定されたノード、親が必要なノードが含まれます。
注
GenerateDefaultFixedNodes を No または RequiredDefaults に設定した後、マップをテストし、GenerateDefaultFixedNodes が既定値の Yes に設定されている場合と同じ出力であることを確認する必要があります。この場合、すべてのノードがコンパイラによって考慮されます。
ループ、条件付き、値マッピング Functoid を使用した for-each 使用法の管理
ループ Functoid、条件付き Functoid、または値マッピング Functoid を使用すると、コンパイル済みマップにxsl:for-each
ステートメントが生成されます。 宛先スキーマの子フィールドに無制限の最大出現回数がある場合、 xsl:for-each
ステートメントは子フィールドに配置されます。 子フィールドに無制限の最大出現回数がない場合、 xsl:for-each
ステートメントは子フィールドの親フィールドに配置されます。
ただし、xsl:for-each
ステートメントの場所はマップの結果に影響するため、子フィールドの最大出現回数が 1 に設定されているかどうかに関係なく、xsl:for-each
ステートメントを宛先スキーマの子フィールドに配置することができます。
次に示すように、マップ (.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 に設定されている場合、子フィールドの最大出現回数が 1 に設定されているかどうかに関係なく、xsl:for-each
ステートメントは宛先スキーマの子フィールドに配置されます。
繰り返しシーケンス グループをマッピングするときの順序の保持
XSD スキーマのシーケンス グループは、メッセージ インスタンスで表されないため、ループ コンテキストを提供しません。 シーケンス グループでループが発生しない場合、Mapper コンパイラはセグメントの順序を維持するための適切な XSLT を生成しません。 その結果、入力インスタンスに存在する相対コンテキストが失われるので、出力インスタンスは、相対コンテキストに依存する追加の処理では役に立ちません。
PreserveSequenceOrder フラグを使用すると、繰り返しシーケンスを別の繰り返しシーケンスにマッピングするときにレコードの順序を維持できます。 既定では、フラグの値は No に設定され、フラグが存在しない以前のバージョンの BizTalk Server で作成された既存のマップの機能が保持されます。 新しく作成されたマップでは、フラグが存在し、その値が [いいえ] に設定されます。 セグメントの順序を維持するには、次に示すように、.btm ファイルで値を Yes に明示的に設定する必要があります。
<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 フラグを Yes に設定すると、出力インスタンスは次のようになります。
<Name>Person1</Name>
<Gender>Male</Gender>
<Address>Bellevue</Address>
<Name>Person2</Name>
<Gender>Female</Gender>
<Address>Redmond</Address>