Gestione del comportamento predefinito del mapper tramite <mapsource>

È possibile modificare determinati comportamenti predefiniti di BizTalk Mapper modificando gli attributi dell'elemento mapsource direttamente in un file di origine mappa (con estensione btm).

Ottimizzazione della generazione di codice del functoid Mapping di valori.

Quando Mapper genera codice XSLT per chiamare il functoid Mapping valori , viene usata una variabile per archiviare il risultato. È possibile usare il flag OptimizeValueMapping per ottimizzare il functoid Mapping valori in modo che venga generata una variabile solo quando l'istruzione if restituisce True. Ad esempio, con OptimizeValueMapping impostato su 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>  

Questo codice può essere ottimizzato spostando la chiamata functoid Mapping valore nel corpo dell'istruzione, assicurandosi che la if chiamata venga eseguita solo quando è necessaria. L'impostazione di OptimizeValueMapping su restituisce il codice seguente:

<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 esegue questa ottimizzazione automaticamente se si imposta l'attributo OptimizeValueMapping dell'elemento mapsource nel file di origine mappa (con estensione btm) su , come illustrato di seguito:

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

Adattamento degli schemi con footprint di grandi dimensioni.

Quando BizTalk Mapper utilizza uno schema contenente un footprint di istanze di grandi dimensioni con strutture particolarmente complesse e/o nodi ricorsivi, le procedure di testing, convalida e compilazione della mappa potrebbero richiedere del tempo o persino generare un errore di "memoria insufficiente". Questo problema può presentarsi con schemi complessi sia di dimensioni ridotte che di grandi dimensioni.

Il problema relativo agli schemi complessi è dovuto al fatto che mapper deve caricare in modo ricorsivo l'intero albero dello schema alla ricerca di nodi che dispongono di collegamenti connessi o impostare la proprietà Value su di esse. È possibile risolvere questo problema impostando il flag GenerateDefaultFixedNodes dell'elemento mapsource nei file con estensione btm su No , come illustrato di seguito:

<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 questa impostazione non è necessario che il mapper crei nodi interni del compilatore associati a ogni nodo di uno schema di destinazione. Il compilatore prende in considerazione soltanto i nodi collegati. Ciò riduce significativamente il consumo di memoria e accelera il processo di testing, convalida, compilazione o salvataggio di una mappa.

Tuttavia, quando il flag GenerateDefaultFixedNodes è impostato su No, i valori dei campi predefiniti impostati nello schema di destinazione non vengono mantenuti nell'istanza prodotta dalla mappa. Ciò costituisce un problema quando questi valori sono necessari nell'istanza di destinazione. Per evitare il problema è necessario impostare nuovamente i valori necessari nella mappa in modo esplicito. È possibile impostare il flag GenerateDefaultFixedNodes su RequiredDefaults, ovvero tutti i nodi necessari vengono presi in considerazione. Vengono illustrati nodi collegati, nodi con valori predefiniti, nodi con la proprietà MinOccurs impostata su maggiore o uguale a uno e nodi i cui elementi padre sono necessari.

Nota

Dopo aver impostato GenerateDefaultFixedNodes su No o RequiredDefaults, è necessario testare la mappa e verificare che l'output sia uguale a quando GenerateDefaultFixedNodes è impostato sul valore predefinito , in cui tutti i nodi vengono presi in considerazione dal compilatore.

Gestione dell'utilizzo di for-each con i functoid Ciclo, Condizionale e Mapping di valori.

Quando si usa un functoid Looping , un functoid condizionale o un functoid Mapping dei valori , viene generata un'istruzione xsl:for-each nella mappa compilata. Se il campo figlio dello schema di destinazione ha occorrenze massime non associate, l'istruzione xsl:for-each viene inserita nel campo figlio. Se il campo figlio non dispone di occorrenze massime non associate, l'istruzione xsl:for-each viene inserita nel campo padre del campo figlio.

Tuttavia, poiché la posizione dell'istruzione xsl:for-each influisce sul risultato della mappa, è possibile che l'istruzione xsl:for-each venga inserita nel campo figlio dello schema di destinazione, indipendentemente dal fatto che l'occorrenza massima del campo figlio sia impostata su 1.

È possibile controllare la posizione dell'istruzione xsl:for-each modificando il valore dell'attributo TreatElementsAsRecords nel file map (con estensione btm), come illustrato di seguito:

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

Quando questo attributo è impostato su , l'istruzione xsl:for-each viene inserita nel campo figlio dello schema di destinazione, indipendentemente dal fatto che l'occorrenza massima del campo figlio sia impostata su 1.

Mantenimento dell'ordine durante il mapping di un gruppo di sequenze ripetute

I gruppi di sequenze in schemi XSD non forniscono un contesto di ciclo in quanto non sono rappresentati nell'istanza del messaggio. Senza possibilità di ciclo nel gruppo di sequenze, il compilatore del mapper non genera l'output XSLT appropriato per mantenere l'ordine dei segmenti. Il contesto relativo presente nell'istanza di input va quindi perso, rendendo così inutili le istanze di output per successive elaborazioni che dipendono dal contesto relativo.

È possibile usare il flag PreserveSequenceOrder per mantenere l'ordine dei record durante il mapping di una sequenza ripetuta a un'altra sequenza ripetuta. Per impostazione predefinita, il valore del flag è impostato su No per mantenere la funzionalità delle mappe esistenti create nelle versioni precedenti BizTalk Server in cui il flag non è presente. Nelle mappe appena create, il flag sarà presente con il relativo valore impostato su No. Per mantenere l'ordine dei segmenti, è necessario impostare in modo esplicito il valore su Sì nei file con estensione btm, come illustrato di seguito:

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

Di seguito è riportato un esempio di istanza di input:

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

Con il flag PreserveSequenceOrder impostato su No, l'istanza di output sarà simile alla seguente:

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

Con il flag PreserveSequenceOrder impostato su , l'istanza di output sarà simile alla seguente:

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

Vedere anche

Creazione di mappe mediante BizTalk Mapper