Condividi tramite


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 del codice del functoid di mapping dei valori

Quando il Mapper genera codice XSLT per chiamare il functoid Value Mapping, viene usata una variabile per archiviare il risultato. È possibile usare il flag OptimizeValueMapping per ottimizzare il functoid Mapping dei 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 if , assicurandosi che la 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 della 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 il mapper utilizza uno schema con un'impronta di istanza molto elevata con strutture profonde e complesse e/o nodi ricorsivi, testare la mappa, validare la mappa o compilare la mappa potrebbe richiedere molto tempo o, nel peggiore dei casi, generare un errore di esaurimento della memoria. Questo problema può verificarsi con schemi piccoli e complessi e con schemi di grandi dimensioni.

Il problema con gli 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, mapper non deve creare nodi del compilatore interni associati a ogni nodo dello schema di uno schema di destinazione. Solo i nodi collegati vengono presi in considerazione dal compilatore. Ciò riduce significativamente il consumo di memoria e accelera il processo durante l'esecuzione di un'operazione di "mappa di test" o "convalida mappa", la compilazione della mappa o il salvataggio della mappa.

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

Annotazioni

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 functoid di Looping, Condizionale e Mappatura dei valori

Quando si usa un functoid Looping, un functoid Condizionale o un functoid Mapping Valori, viene generata un'istruzione xsl:for-each nella mappa compilata. Se il campo figlio dello schema di destinazione ha un numero massimo di occorrenze illimitato, l'istruzione xsl:for-each viene inserita nel campo figlio. Se il campo figlio non ha un numero massimo di occorrenze illimitato, l'istruzione xsl:for-each viene inserita nel campo padre del campo figlio.

Tuttavia, poiché la posizione dell'istruzione influisce sul risultato della xsl:for-each mappa, è possibile che l'istruzione xsl:for-each venga inserita nel campo figlio dello schema di destinazione, indipendentemente dal fatto che la 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 ripetuto

I gruppi di sequenze negli schemi XSD non forniscono un contesto di ciclo perché non sono rappresentati nell'istanza del messaggio. Senza possibilità di ciclo nel gruppo di sequenze, il compilatore Mapper non genera l'XSLT appropriato per mantenere l'ordine dei segmenti. Di conseguenza, il contesto relativo presente nell'istanza di input viene perso, che rende inutili le istanze di output per un'ulteriore elaborazione che dipende 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 di 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 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 è riportata un'istanza di input di esempio:

<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 con BizTalk Mapper