Operazioni di mapping di base e di mapping complesso
BizTalk Mapper fornisce soluzioni per un'ampia gamma di scenari di mapping, da operazioni semplici sui tipi di alberi padre-figlio a operazioni complesse e dettagliate che interessano record di ciclo e gerarchie. La complessità di uno scenario di mapping dipende dalle preferenze personali e dalle esigenze aziendali. Il linguaggio XSD (XML Schema Definition) garantisce notevole flessibilità nella definizione di formati strutturati. Quasi tutti gli scenari di mapping rientrano in una delle due categorie: mapping di base e mapping complesso.
Mapping di base
Il mapping di base è il tipo più comune di mapping che è possibile creare. In un mapping di base, tra gli elementi di input e output esiste una relazione uno-a-uno. Un elemento di input viene mappato esclusivamente a un solo elemento di output. Anche se molti tipi di trasformazioni e traduzioni sono possibili con il mapping di base, ad esempio l'uso di più functoid e functoid a catena per modificare il valore copiato, lo scenario sottostante rimane relativamente semplice. Le operazioni di mapping di base prevedono inoltre il mapping dei campi di due record padre differenti (che ricorrono una sola volta) ai campi di un singolo record padre all'interno dello schema di destinazione.
Mapping complesso
Il mapping complesso prevede record o campi che si verificano più volte per una singola istanza del nodo Record o Elemento campo nell'albero dello schema. Tali nodi hanno la proprietà Max Occurs impostata su un valore maggiore di uno (1), che indica che in un messaggio di istanza possono essere presenti più elementi corrispondenti. Quando una mappa BizTalk usa questo tipo di mapping di conteggio delle variabili (noto anche come ciclo), il compilatore del foglio di stile XSL (Extensible Stylesheet Language) deve essere in grado di determinare il percorso del ciclo appropriato su cui eseguire l'iterazione per produrre l'output richiesto.
In generale, è possibile collegare un campo di un record di ciclo all'interno dello schema di origine a un campo di un record di ciclo all'interno dello schema di destinazione. Il numero di elementi corrispondenti in un messaggio di istanza di input determina il numero di elementi creati nel messaggio di istanza di output. Si considerino ad esempio i frammenti XSD degli schemi di origine e di destinazione riportati di seguito.
Frammento dello schema di origine
<xs:element minOccurs="1" maxOccurs="5"
name="SrcLoopingRecord">
<xs:complexType>
<xs:sequence>
<xs:element name="" type="xs:string" />
<xs:element name="" type="xs:integer" />
</xs:sequence>
</xs:complexType>
</xs:element>
Frammento dello schema di destinazione
<xs:element minOccurs="0" maxOccurs="unbounded"
name="DstLoopingRecord">
<xs:complexType>
<xs:sequence>
<xs:element name="" type="xs:string" />
<xs:element name="" type="xs:integer" />
</xs:sequence>
</xs:complexType>
</xs:element>
In questi frammenti:
SrcLoopingRecord, un nodo Record nei messaggi di istanza di input, può verificarsi da uno a cinque volte. Contiene anche i nodi elemento campo figlio Field1 (una stringa) e Field2 (un numero intero) che si verificano una volta per ogni istanza del padre.
DstLoopingRecord, un nodo Record nei messaggi di istanza di output, può verificarsi zero (0) o più volte, senza vincoli. Contiene anche i nodi dell'elemento campo figlio FieldA (una stringa) e FieldB (un numero intero) che si verificano una volta per ogni istanza del padre.
Presumendo che Field1 sia mappato a FieldA e Field2 sia mappato a FieldB e che tali mapping siano stati elaborati dal frammento riportato di seguito di un messaggio di istanza di input, verrà prodotto il seguente frammento di un messaggio di istanza di output.
Frammento del messaggio di istanza di input
<SrcLoopingRecord>
<Field1>A string</Field1>
<Field2>10</Field2>
</SrcLoopingRecord>
<SrcLoopingRecord>
<Field1>Another string</Field1>
<Field2>11</Field2>
</SrcLoopingRecord>
<SrcLoopingRecord>
<Field1>A ball of string</Field1>
<Field2>12</Field2>
</SrcLoopingRecord>
Frammento del messaggio di istanza di output
<DstLoopingRecord>
<FieldA>A string</FieldA>
<FieldB>10</FieldB>
</DstLoopingRecord>
<DstLoopingRecord>
<FieldA>Another string</FieldA>
<FieldB>11</FieldB>
</DstLoopingRecord>
<DstLoopingRecord>
<FieldA>A ball of string</FieldA>
<FieldB>12</FieldB>
</DstLoopingRecord>
Il numero di occorrenze dell'elemento SrcLoopingRecord nel messaggio di istanza di input (3) determina il numero di occorrenze dell'elemento DstLoopingRecord nel messaggio dell'istanza di output.
In BizTalk Mapper non viene supportato un tipo di mapping che prevede più percorsi ciclo. In questo tipo di mapping i campi di due o più record di ciclo all'interno dello schema di origine vengono mappati ai campi di un singolo record di ciclo all'interno dello schema di destinazione. Questo tipo di mapping non offre tuttavia un metodo efficace per determinare il numero di elementi da produrre nel messaggio di istanza di output. La presenza di più percorsi ciclo causa la generazione di un messaggio di avviso in fase di compilazione delle mappe che indica che il nodo di destinazione dispone di più percorsi ciclo di origine. Si tratta tuttavia solo di un avviso e il numero di iterazioni nel primo percorso ciclo di origine viene utilizzato per determinare il numero di elementi prodotti nel messaggio di istanza di output. È possibile assumere il controllo esplicito del comportamento di ciclo usando il functoid Looping .
Microsoft BizTalk Server ha introdotto un nuovo tipo di ciclo denominato ciclo basato su tabelle. Il ciclo basato su tabelle è particolarmente utile quando il messaggio di istanza di output deve essere basato sui dati del messaggio di istanza di input combinato con una o più costanti, collegamenti dello schema di origine o functoid. In tali casi, il messaggio di istanza di output può contenere più record basati sui datit di un singolo record del messaggio di istanza diinput, che è combinato con costanti differenti, o basati sui dati provenienti da più record del messaggio di istanza di input. Per altre informazioni sul ciclo basato su tabelle usando i functoid Ciclo tabella ed Estrattore di tabelle , vedere Functoid Ciclo di tabelle e functoid dell'estrattore di tabelle.