E' un po di tempo che nei newsgroup noto sempre di più, richieste inerenti la possibilità
di utilizzare schema dinamici,e trasformazioni a runtime.
Potevo esimermi dall' interessarmi a questa cosa?
Utilizzare uno shape di transform è la consuetudine, ma obbliga all' utilizzo di uno schema di riferimento.
Queste le alternative:
1) Soluzione classica
Le mappe Biztalk altro non sono che XSLT,perciò seguirei la stessa strada che segue Biztalk.
Mi creerei un XSLT per trasformare il mio XML, e per effettuare la trasformazione utilizzerei semplicemente la classe XSLTransform.
L'xml risultante è il mio messaggio.
2)La più complicata però secondo me la più elegante in assoluto
Con le mappe di Biztalk è possibile utilizzare una tecnica chiamata XSLT Inline, è una tecnica che viene usata esclusivamente in design time.
La mappa necessita di uno schema di entrata, ma in questo caso non è importante la sua struttura o come è fatto, ma solo il suo namespace.
Si utilizza un solo functoid di script e all'interno del funtoid si imposta l'utilizzo di xslt inline, al suo interno si inserisce l'xslt di trasformazione.
Non bisogna collegare i nodi sorgenti, ma solo quelli di destinazione, sarà la mappa a fare il resto.
Questa tecnica è molto valida se si ha la necessità di dover modificare mediante configurazioni esterne le politiche di transform, ma
nel nostro caso non vogliamo utilizzare nessuna tecnica di design time.
Di conseguenza utilizzerei una tecnica che ho battezzato con il nome di Dynamic Mapping.
Una mappa Biztalk è una classe sealed, ecco in essenziale cosa genera Biztalk quando compila una mappa.
namespace mynamespace {
public sealed class mymap : Microsoft.XLANGs.BaseTypes.TransformBase {
public () { }
public override string[] SourceSchemas { //SCHEMA SORGENTE
get { return new string[1] { "" }; }
}
public override string[] TargetSchemas { //SCHEMA DI DESTINAZIONE
get { return new string[1] { "" }; }
}
public override string XmlContent { //XSLT UTILIZZATO PER EFFETTUARE LA TRASFORMAZIONE
get { return ""; }
}
public override string[] XsltArgumentListContent { //ARGOMENTI DELL'XSLT
// XsltArgument content. If no argument, returns "\n"
get { return ""; }
}
// --------------------------------
// Private const properties not shown go here
// --------------------------------
}
}
La classe Microsoft.XLANGs.BaseTypes.TransformBase e di tipo abstract e contiene queste due proprieptà
public XslTransform Transform { get { /* Implementation omitted */ }; }
public XsltArgumentList TransformArgs { get { /* Implementation omitted */ }; }
che è quello che occorre alla mappa per eseguire la trasformazione.
Non resta che assegnare alle proprietà della nostra classe tutto l' occorrente.
Una strada molto veloce per ottenere velocemente tutto questo è quella di creare prima la mappa
con tutto quello che serve e compilare il progetto in modalita source.
Ho spiegato come attivare questa modalità in questo mio post
http://blogs.ugidotnet.org/biztalk/archive/2006/12/29/63919.aspx
A questo punto è possibile visualizzare il sorgente generato e modificarlo a piacimento.
Queste tecniche le ritengo validissime per tutti quei casi in cui non si può o non si vuole utilizzare uno shape di transform o uno schema predefinito.