Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
Vous pouvez modifier certains comportements par défaut de BizTalk Mapper 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 pour les fonctions de 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 if est évaluée à 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 , ce qui garantit que l’appel se produit 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">
Ajustement des schémas aux grandes envergures
Lorsque le mappeur utilise un schéma qui a une empreinte d’instance très importante avec des structures complexes profondes et/ou des nœuds récursifs, testez la carte, validez la carte ou compilez la carte peut prendre beaucoup de temps ou, dans le pire des cas, entraîner une erreur « hors mémoire ». Cela peut se produire avec des schémas petits, complexes ainsi qu’avec des schémas volumineux.
Le problème avec les schémas complexes est dû au fait que le mappeur doit charger de manière récursive l’arborescence de schémas entière à la recherche de nœuds qui ont des liens connectés à eux ou que la propriété Value est définie sur eux. 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">
Avec ce paramètre, le mappeur n’a pas besoin de créer des nœuds de compilateur internes 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. Cela réduit considérablement la consommation de mémoire et accélère le processus lors de l’exécution d’une opération de « carte de test » ou de « validation de carte », de compilation de la carte ou d’enregistrement de la carte.
Toutefois, lorsque l’indicateur GenerateDefaultFixedNodes a la valeur Non, les valeurs de champ par défaut définies dans le schéma cible ne sont pas conservées dans l’instance produite par la carte. Il s’agit d’un problème lorsque ces valeurs sont requises dans l’instance cible. Pour contourner ce problème, les valeurs requises doivent être définies de nouveau explicitement dans la carte. 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 avec la propriété MinOccurs définie sur une valeur supérieure ou égale à un, et les nœuds dont les parents sont requis.
Remarque
Après avoir défini GenerateDefaultFixedNodes sur No 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 de for-each avec des fonctoids de boucles, de conditions et de mappage de valeurs
Lorsque vous utilisez un fonctoid Bouclage, un fonctoid Conditionnel ou un fonctoid Mappage de valeurs, 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 des occurrences maximales sans limite, l’instruction xsl:for-each est placée sur le champ enfant. Si le champ enfant n’a pas d’occurrences maximales non lié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 souhaiterez peut-être placer l’instruction xsl:for-each sur le champ enfant du schéma de destination, que la occurrence maximale du champ enfant soit définie 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 est défini sur Oui, l’instruction xsl:for-each est placée sur le champ enfant du schéma de destination, que la occurrence maximale du champ enfant soit définie sur 1.
Conservation de l’ordre lors du mappage d’un groupe de séquences répétitif
Les groupes de séquences dans les 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 sur le groupe de la séquence, le compilateur Mapper ne génère pas le XSLT approprié pour maintenir 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 un traitement supplémentaire qui dépend du contexte relatif.
Vous pouvez utiliser l’indicateur PreserveSequenceOrder pour conserver l’ordre d’enregistrement 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 cartes existantes créées dans les versions antérieures de BizTalk Server où l’indicateur n’est pas présent. Dans les nouvelles cartes créées, le drapeau sera présent avec sa valeur réglée sur Non. Pour conserver 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">
Voici 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, l’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, l’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>