Partager via


Gestion du comportement du mappeur par défaut à l’aide de <mapsource>

Vous pouvez modifier certains comportements par défaut du mappeur BizTalk en modifiant les attributs de l’élément mapsource directement dans un fichier de source de carte (.btm).

Optimisation de la génération de code du fonctoid Mappage des valeurs

Lorsque le mappeur génère du code XSLT pour appeler le fonctoid Mappage de valeurs, une variable est utilisée pour stocker le résultat. Vous pouvez utiliser l’indicateur OptimizeValueMapping pour optimiser le fonctoid Mappage de valeurs afin qu’une variable soit générée uniquement lorsque l’instruction prend la if valeur True. Par exemple, avec OptimizeValueMapping défini sur Non :

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

Ce code peut être optimisé en déplaçant l’appel du fonctoid Mappage de valeurs dans le corps de l’instruction if , en veillant à ce que l’appel se produise uniquement lorsqu’il est nécessaire. La définition d’OptimizeValueMapping sur Oui génère le code suivant :

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

Le mappeur effectue cette optimisation automatiquement si vous définissez l’attribut OptimizeValueMapping de l’élément mapsource dans le fichier source de la carte (.btm) sur Oui , comme indiqué :

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

Prise en compte des schémas de grande taille

Lorsque le Mappeur utilise un schéma dont la taille d'instance est très importante et qui comporte des nœuds récursifs et/ou des structures complexes profondes, le test, la validation ou la compilation du mappage peuvent durer longtemps, voire même générer une erreur de mémoire insuffisante. Ceci peut se produire dans les petits schémas complexes, ainsi que dans les schémas de grande taille.

Le problème avec les schémas complexes est dû au fait que le mappeur doit charger de manière récursive toute l’arborescence de schéma à la recherche de nœuds auxquels des liens sont connectés ou dont la propriété Value est définie. Vous pouvez résoudre ce problème en définissant l’indicateur GenerateDefaultFixedNodes de l’élément mapsource dans les fichiers .btm sur Non , comme indiqué :

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

Ainsi, le Mappeur n'a pas besoin de créer, dans le compilateur interne, des nœuds associés à chaque nœud de schéma d'un schéma cible. Seuls les nœuds liés sont pris en compte par le compilateur. Vous réduisez ainsi considérablement la consommation de mémoire et accélérez les opérations de test, de validation, de compilation ou d'enregistrement de mappage.

Toutefois, lorsque l’indicateur GenerateDefaultFixedNodes est défini sur Non, les valeurs de champ par défaut définies dans le schéma cible ne sont pas conservées dans la instance produite par le mappage. Ceci pose problème lorsque ces valeurs sont requises dans l'instance cible. Pour contourner ce problème, les valeurs requises doivent être à nouveau définies de façon explicite dans le mappage. Vous pouvez définir l’indicateur GenerateDefaultFixedNodes sur RequiredDefaults, ce qui signifie que tous les nœuds requis sont pris en compte. Cela couvre les nœuds liés, les nœuds qui ont des valeurs par défaut, les nœuds dont la propriété MinOccurs a la valeur supérieure ou égale à un, et les nœuds dont les parents sont requis.

Notes

Après avoir défini GenerateDefaultFixedNodes sur Non ou RequiredDefaults, vous devez tester la carte et vérifier que la sortie est la même que lorsque GenerateDefaultFixedNodes est défini sur sa valeur par défaut Oui, dans laquelle tous les nœuds sont pris en compte par le compilateur.

Gestion de l'utilisation for-each avec les fonctoids Bouclage, Conditionnel et Mappage des valeurs

Lorsque vous utilisez un fonctoid Bouclage , un fonctoid conditionnel ou un fonctoid Mappage de valeur, une xsl:for-each instruction est générée dans la carte compilée. Si le champ enfant du schéma de destination a un nombre maximal d’occurrences illimitées, l’instruction xsl:for-each est placée au champ enfant. Si le champ enfant n’a pas d’occurrences maximales illimitées, l’instruction xsl:for-each est placée au champ parent du champ enfant.

Toutefois, étant donné que l’emplacement de l’instruction xsl:for-each affecte le résultat de la carte, vous pouvez placer l’instruction xsl:for-each au champ enfant du schéma de destination, que l’occurrence maximale du champ enfant soit définie ou non sur 1.

Vous pouvez contrôler l’emplacement de l’instruction xsl:for-each en modifiant la valeur de l’attribut TreatElementsAsRecords dans le fichier map (.btm) comme indiqué :

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

Lorsque cet attribut a la valeur Oui, l’instruction xsl:for-each est placée au niveau du champ enfant du schéma de destination, que l’occurrence maximale du champ enfant ait la valeur 1 ou non.

Préservation de l'ordre lors du mappage d'un groupe Séquence répété

Les groupes Séquence des schémas XSD ne fournissent pas de contexte de bouclage car ils ne sont pas représentés dans l'instance de message. Sans possibilité de bouclage du groupe Séquence, le compilateur du Mappeur ne génère pas le fichier XSLT approprié pour conserver l'ordre des segments. Par conséquent, le contexte relatif présent dans l'instance d'entrée est perdu, ce qui rend les instances de sortie inutiles pour tout traitement ultérieur dépendant du contexte relatif.

Vous pouvez utiliser l’indicateur PreserveSequenceOrder pour maintenir l’ordre des enregistrements lors du mappage d’une séquence répétée à une autre séquence répétée. Par défaut, la valeur de l’indicateur est définie sur Non pour conserver les fonctionnalités des mappages existants créés dans les versions antérieures BizTalk Server où l’indicateur n’est pas présent. Dans les cartes nouvellement créées, l’indicateur est présent et sa valeur est définie sur Non. Pour maintenir l’ordre des segments, vous devez définir explicitement la valeur sur Oui dans les fichiers .btm, comme indiqué :

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

Le code suivant présente un exemple d'instance d'entrée :

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

Avec l’indicateur PreserveSequenceOrder défini sur Non, la instance de sortie se présente comme suit :

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

Avec l’indicateur PreserveSequenceOrder défini sur Oui, la instance de sortie se présente comme suit :

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

Voir aussi

Création de mappages à l'aide du Mappeur BizTalk