您可以直接在地圖來源 (.btm) 檔案中修改 mapsource 元素的屬性,以修改 BizTalk Mapper 的特定預設行為。
優化值映射功能元代碼生成
當 Mapper 產生 XSLT 代碼來呼叫 值對應 functoid 時,會使用變數來儲存結果。 您可以使用 OptimizeValueMapping 標誌來優化 值對應 函數元,這樣一來,只有在 if 語句評估為 True 時才會產生變數。 例如,將 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>
如果您將地圖來源 (.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 使用的架構擁有非常大型的實例佔用記憶體,且包括深層複雜結構或遞歸節點,那麼測試地圖、驗證地圖或編譯地圖可能需要很長的時間,或者在最壞的情況下,會出現「記憶體不足」的錯誤。 這可能會發生於小型複雜架構,以及大型架構。
複雜架構的問題在於 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">
使用此設定時,Mapper 不需要建立與目標架構之每個架構節點相關聯的內部編譯程序節點。 編譯程式只會考慮連結節點。 這可大幅減少記憶體耗用量,並在執行「測試對應」或「驗證地圖」作業、編譯地圖或儲存地圖時加速程式。
不過,當 GenerateDefaultFixedNodes 旗標設定為 [否] 時,目標架構中設定的預設域值不會保留在對應所產生的實例中。 當目標實例中需要這些值時,這是個問題。 若要規避此狀況,必須在地圖中明確設定必要的值。 您可以將 GenerateDefaultFixedNodes 旗標設定為 RequiredDefaults,這表示所有必要的節點都會納入考慮。 這涵蓋連結節點、具有預設值的節點、屬性 MinOccurs 設定為大於或等於一的節點,以及其父節點為必需的節點。
備註
將 GenerateDefaultFixedNodes 設定為 No 或 RequiredDefaults 之後,您應該測試對應,並確認輸出與 GenerateDefaultFixedNodes 設定為預設值 [是] 時相同,其中編譯程式會將所有節點納入考慮。
使用迴圈、條件式和值映射函數元來管理 for-each 的用法
當您使用 迴圈 函數元、條件 函數元或 值映射 函數元時,會在編譯的映射中產生xsl:for-each語句。 如果目的地架構的子欄位有未系結的最大發生次數,語句 xsl:for-each 就會放在子字段。 如果子欄位沒有未系結的最大出現次數,語句 xsl:for-each 會放在子欄位的父字段。
不過,由於語句xsl:for-each的位置會影響對應結果,因此您可能希望將xsl:for-each語句放在目的地架構的子欄位中,而不論子欄位的發生次數上限是否設定為 1。
您可以透過修改 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。
映射重複序列群組時保留順序
XSD 架構中的時序群組不提供循環內容,因為它們不會在訊息實例中表示。 如果序列群組上沒有迴圈的可能性,Mapper 編譯程式不會產生適當的 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>