使用 mapsource 管理默认映射 <器行为>

可以通过直接在映射源 (.btm) 文件中修改 mapsource 元素的属性来修改 BizTalk 映射器的某些默认行为。

优化“值映射”Functoid 代码生成

当映射器生成 XSLT 代码以调用值 映射 functoid 时,变量用于存储结果。 可以使用 OptimizeValueMapping 标志优化"值映射"functoid 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>  

可以通过将"值映射"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>  

如果将映射源 (.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">  

适应占用较大空间的架构

如果映射器使用的架构具有较大的实例占用空间、较深且复杂的结构和/或递归节点,则对映射进行测试、验证和编译需要较长的时间,甚至有可能导致“内存不足”错误的出现。 较小但是复杂的架构以及较大的架构都可能发生这种情况。

复杂架构的问题是由于映射器必须以递归方式加载整个架构树,以查找已连接到这些节点的链接或设置了 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 属性设置为大于或等于 1 的节点,以及需要其父节点的节点。

注意

GenerateDefaultFixedNodes 设置为"否"或"RequiredDefaults"后,应测试映射并验证输出是否与 GenerateDefaultFixedNodes 设置为默认值"是"时相同,编译器将考虑所有节点。

管理“循环”、“条件”和“值映射”Functoid 的 For-each 用法

使用循环 functoid 、条件 functoid 或值映射 functoid 时,将在xsl:for-each编译的映射中生成 语句。 如果目标架构的子字段具有无限的最大出现次数 xsl:for-each ,则语句将置于子字段。 如果子字段没有无限次的最大匹配项 xsl:for-each ,则语句将置于子字段的父字段中。

但是,由于 语句的位置会影响映射结果,因此,无论子字段的最大出现次数是否设置为 1,你可能希望语句放在目标架构的子字段。xsl:for-eachxsl:for-each

可以通过修改 xsl:for-each map (.btm) 文件中 TreatElementsAsRecords 属性的值来控制 语句的位置,如下所示:

<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 架构中的顺序组不提供循环上下文,因为它们未以消息实例表示。 由于顺序组不存在循环可能性,映射器的编译器不会生成适当的 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>  

另请参阅

使用 BizTalk 映射器创建映射