Compartir a través de


Manejando el comportamiento predeterminado del asignador mediante <mapsource>

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

Optimización de la generación de código de asignación de valores para functoids

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 se genere solo cuando la instrucción if 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 del functoid Asignación de valores al cuerpo de la if instrucción, asegurándose de que la invocación solo se produce cuando es necesario. Configurar OptimizeValueMapping a produce el siguiente código:

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

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

Adaptar esquemas con gran impacto

Cuando el verificador utiliza un esquema que tiene una superficie de instancia muy grande, con estructuras complejas profundas, o nodos recursivos, probar el mapa, validar el mapa, o compilar el mapa podría tardar mucho tiempo, o, en el peor de los casos, provocar un error de "falta de memoria". Esto podría ocurrir con esquemas pequeños y complejos, así como con esquemas grandes.

El problema con los esquemas complejos se debe al hecho de que el asignador tiene que cargar recursivamente todo el árbol de esquema en busca de nodos que tengan vínculos conectados o cuya propiedad Value esté establecida. 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 Mapper no necesita crear nodos internos del compilador asociados a cada nodo de esquema del esquema de destino. El compilador solo tiene en cuenta los nodos vinculados. Esto reduce significativamente el consumo de memoria y acelera el proceso al realizar una operación de "mapa de prueba" o "validar mapa", compilar el mapa o guardar el mapa.

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. Se trata de un problema cuando estos valores son necesarios en la instancia de destino. Para evitar esto, los valores necesarios deben establecerse de nuevo explícitamente en el mapa. Puede establecer la marca GenerateDefaultFixedNodes en RequiredDefaults, lo que significa que se tienen en cuenta todos los nodos necesarios. Esto abarca nodos vinculados, nodos que tienen valores predeterminados, nodos con la propiedad MinOccurs establecida como mayor o igual que uno, y nodos cuyos padres 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.

Gestión del uso de 'for-each' con los functoids de bucle, condicional y asignación de valores

Cuando se usa un functoid Bucle, un functoid Condicional o un functoid 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 ocurrencias máximas ilimitadas, la xsl:for-each declaración se coloca en el campo secundario. Si el campo secundario no tiene un número máximo de repeticiones ilimitadas, la xsl:for-each instrucción se coloca en el campo principal 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 quiera 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 está establecida en 1.

Conservar el orden al asignar un grupo de secuencias repetidas

Los grupos de secuencias en esquemas XSD no proporcionan un contexto de bucle porque no se representan en la instancia del mensaje. Sin posibilidades de bucle en el grupo de secuencias, el compilador del asignador no genera el XSLT adecuado para mantener el orden del segmento. Como resultado, se pierde el contexto relativo presente en la instancia de entrada, lo que hace que las instancias de salida sean inútiles para su posterior procesamiento que depende del 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 los mapas existentes creados en versiones anteriores de 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 del segmento, 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 muestra una instancia de entrada de ejemplo:

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

Véase también

Crear mapas mediante BizTalk Mapper