使用 < mapsource 管理預設對應程式列為>
您可以直接在地圖來源 (.btm) 檔案中修改 mapsource 元素的屬性,以修改 BizTalk Mapper 的特定預設行為。
最佳化值對應運算質程式碼的產生
當 Mapper 產生 XSLT 程式碼來呼叫 值對應 運算質時,會使用變數來儲存結果。 您可以使用OptimizeValueMapping旗標來優化值對應運算質,以便只有在語句評估為 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>
此程式碼可以藉由將 值對應 運算質調用移至 語句主體 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>
如果您將 map source (.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旗標設定為[否],藉以減輕此問題,如下所示:
<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 屬性設定為大於或等於一的節點,以及其父系為必要節點的節點。
注意
將 GenerateDefaultFixedNodes 設定為 No 或 RequiredDefaults之後,您應該測試對應,並確認輸出與 GenerateDefaultFixedNodes 設定為預設值 [是] 時相同,其中編譯器會將所有節點納入考慮。
使用迴圈、條件和值對應運算質管理 for-each 用法
當您使用 迴圈運算 質、 條件 式運算質或 值對應 運算質時, xsl:for-each
語句會在編譯的對應中產生。 如果目的地架構的子欄位有未系結的最大出現次數,語句 xsl:for-each
就會放在子欄位。 如果子欄位沒有未系結的最大出現次數, xsl:for-each
語句就會放在子欄位的父欄位。
不過,由於語句的位置 xsl:for-each
會影響對應結果,因此,不論子欄位的最大出現次數是否設定為1,您可能會想要將 xsl:for-each
語句放在目的地架構的子欄位。
您可以修改 map (.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">
當此屬性設定為 [是] 時, xsl:for-each
不論子欄位的最大出現次數是否設定為 1,語句都會放在目的地架構的子欄位。
在對應重複 Sequence 群組時保留順序
XSD 結構描述中的 Sequence 群組並未提供迴內容,因為這些群組在訊息執行個體中並無代表項目。 由於 Sequence 群組沒有迴圈的可能性,所以對應工具編譯器並不會產生適當的 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 旗標設定為 [否],輸出實例看起來會如下所示:
<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>