Compartir a través de


Administración del comportamiento predeterminado del asignador mediante <mapsource>

Puede modificar determinados comportamientos predeterminados del asignador de BizTalk modificando los atributos del elemento mapsource directamente en un archivo de origen de mapa (.btm).

Optimizar la generación del código de functoid Asignación de valores

Cuando el asignador genera código XSLT para llamar al functoid Asignación de valores, se usa una variable para almacenar el resultado. Puede usar la marca OptimizeValueMapping para optimizar el functoid De asignación de valores para que una variable solo se genere cuando la if instrucción se evalúe como True. Por ejemplo, con OptimizeValueMapping establecido en No:

<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>  

Este código se puede optimizar moviendo la invocación functoid Asignación de valores al cuerpo de la if instrucción, lo que garantiza que la invocación solo se produce cuando es necesario. Al establecer OptimizeValueMapping en , se produce el código siguiente:

<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>  

Mapper realiza esta optimización automáticamente si establece el atributo OptimizeValueMapping del elemento mapsource en el archivo de origen de mapa (.btm) en , como se muestra:

<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">  

Dar cabida a esquemas con huellas grandes

Cuando el Asignador usa un esquema que tiene una huella de instancia muy grande, con estructuras complejas profundas o nodos recursivos, puede ser necesario mucho tiempo para probar, validar o compilar la asignación; en el peor de los casos, puede producirse un error por memoria insuficiente. Esto puede ocurrir tanto con pequeños esquemas complejos como con esquemas grandes.

El problema con esquemas complejos se debe al hecho de que el asignador tiene que cargar de forma recursiva el árbol de esquema completo buscando nodos que tienen vínculos conectados a ellos o que tienen la propiedad Value establecida en ellos. Para solucionar este problema, establezca la marca GenerateDefaultFixedNodes del elemento mapsource en los archivos .btm en No como se muestra:

<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">  

Con esta configuración, el Asignador no necesita crear nodos de compilador interno asociados a cada nodo de esquema de un esquema de destino. El compilador sólo tendrá en cuenta los nodos vinculados. Esto reduce significativamente el consumo de memoria y agiliza el proceso al realizar una operación "comprobar asignación" o "validar asignación", al compilar una asignación o al guardarla.

Sin embargo, cuando la marca GenerateDefaultFixedNodes está establecida en No, los valores de campo predeterminados establecidos en el esquema de destino no se conservan en la instancia generada por el mapa. Esto supone un problema cuando la instancia de destino necesita esos valores. Para evitarlo, hay que establecer los valores necesarios explícitamente en la asignación. Puede establecer la marca GenerateDefaultFixedNodes en RequiredDefaults, lo que significa que todos los nodos necesarios se tienen en cuenta. Esto abarca nodos vinculados, nodos que tienen valores predeterminados, nodos con la propiedad MinOccurs establecida en mayor o igual que uno, y nodos cuyos elementos primarios son necesarios.

Nota

Después de establecer GenerateDefaultFixedNodes en No o RequiredDefaults, debe probar el mapa y comprobar que la salida es la misma que cuando GenerateDefaultFixedNodes está establecido en su valor predeterminado de , en el que el compilador toma en cuenta todos los nodos.

Administrar el uso de for-each con los functoids de condicional, Bucle y Asignación de valores

Cuando se usa un functoid de bucle , un functoid condicional o un functoid de asignación de valores, se genera una xsl:for-each instrucción en el mapa compilado. Si el campo secundario del esquema de destino tiene repeticiones máximas sin enlazar, la xsl:for-each instrucción se coloca en el campo secundario. Si el campo secundario no tiene repeticiones máximas sin enlazar, la xsl:for-each instrucción se coloca en el campo primario del campo secundario.

Sin embargo, dado que la ubicación de la xsl:for-each instrucción afecta al resultado del mapa, es posible que desee que la xsl:for-each instrucción se coloque en el campo secundario del esquema de destino, independientemente de si la aparición máxima del campo secundario está establecida en 1.

Puede controlar la colocación de la xsl:for-each instrucción modificando el valor del atributo TreatElementsAsRecords en el archivo map (.btm), como se muestra:

<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">  

Cuando este atributo se establece en , la xsl:for-each instrucción se coloca en el campo secundario del esquema de destino, independientemente de si la aparición máxima del campo secundario se establece en 1.

Conservar el orden al asignar un grupo de secuencias repetidas

Los grupos de secuencias de los esquemas XSD no proporcionan un contexto de bucle porque no están representados en la instancia de mensaje. Al no poder realizar bucles en el grupo de secuencias, el compilador del Asignador no genera el XSLT apropiado para mantener el orden de segmentos. Como resultado se pierde el contexto relativo presente en la instancia de entrada, lo que hace a las instancias de salida inútiles para procesamientos posteriores que dependan de dicho contexto relativo.

Puede usar la marca PreserveSequenceOrder para mantener el orden de registro al asignar una secuencia de repetición a otra secuencia de repetición. De forma predeterminada, el valor de la marca se establece en No para conservar la funcionalidad de las asignaciones existentes creadas en versiones anteriores BizTalk Server en las que la marca no está presente. En los mapas recién creados, la marca estará presente con su valor establecido en No. Para mantener el orden de los segmentos, debe establecer explícitamente el valor en en los archivos .btm como se muestra:

<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">  

A continuación se da un ejemplo de instancia de entrada:

<Name>Person1</Name>  
<Gender>Male</Gender>  
<Address>Bellevue</Address>  
<Name>Person2</Name>  
<Gender>Female</Gender>  
<Address>Redmond</Address>  

Con la marca PreserveSequenceOrder establecida en No, la instancia de salida tendrá el siguiente aspecto:

<Name>Person1</Name>  
<Name>Person2</Name>  
<Gender>Male</Gender>  
<Gender>Female</Gender>  
<Address>Bellevue</Address>  
<Address>Redmond</Address>  

Con la marca PreserveSequenceOrder establecida en , la instancia de salida tendrá el siguiente aspecto:

<Name>Person1</Name>  
<Gender>Male</Gender>  
<Address>Bellevue</Address>  
<Name>Person2</Name>  
<Gender>Female</Gender>  
<Address>Redmond</Address>  

Consulte también

Crear asignaciones con el Asignador de BizTalk