使用 <mapsource 管理默认映射器行为>
可以通过直接在映射源 (.btm) 文件中修改 mapsource 元素的属性来修改 BizTalk 映射器的某些默认行为。
优化“值映射”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>
可以通过将 值映射 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 设置为 No 或 RequiredDefaults 后,应测试映射并验证输出是否与 GenerateDefaultFixedNodes 设置为其默认值 “是”时相同,其中编译器将考虑所有节点。
管理“循环”、“条件”和“值映射”Functoid 的 For-each 用法
使用 循环 functoid、 条件 functoid 或 值映射 functoid 时,将在编译的映射中生成语句 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 架构中的顺序组不提供循环上下文,因为它们未以消息实例表示。 由于顺序组不存在循环可能性,映射器的编译器不会生成适当的 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>