Migrazione dalla classe XslTransform
L'architettura XSLT è stata ridisegnata nella versione di Visual Studio 2005. La classe XslTransform è stata sostituita dalla classe XslCompiledTransform.
Nelle sezioni seguenti vengono descritte alcune delle principali differenze tra XslCompiledTransform e le classi di XslTransform.
Prestazioni
La classe XslCompiledTransform presenta numerosi miglioramenti a livello di prestazioni. Il nuovo processore XSLT consente di compilare il foglio di stile XSLT in un formato comune intermedio analogamente a ciò che esegue CLR (Common Language Runtime) per altri linguaggi di programmazione. Una volta compilato, il foglio di stile può essere memorizzato nella cache e riutilizzato.
Inoltre, la classe XslCompiledTransform include altre ottimizzazioni che rendono molto più veloce la classe XslTransform.
Nota |
---|
Sebbene le prestazioni complessive della classe XslCompiledTransform siano migliori rispetto alla classe XslTransform, l'esecuzione del metodo Load della classe XslCompiledTransform potrebbe risultare più lenta di quella del metodo Load della classe XslTransform la prima volta che tale metodo viene chiamato su una trasformazione.Questa situazione si verifica perché il file XSLT deve essere compilato prima del caricamento.Per ulteriori informazioni, vedere il post di blog seguente: XslCompiledTransform Slower che XslTransform? |
Sicurezza
Per impostazione predefinita, la classe XslCompiledTransform disabilita il supporto per la funzione document() di XSLT e per lo script incorporato. Queste funzionalità possono essere abilitate creando un oggetto XsltSettings in cui le funzionalità sono abilitate e passandolo al metodo Load. Nell'esempio seguente viene illustrato come abilitare lo scripting ed eseguire una trasformazione XSLT.
' Create the XsltSettings object with script enabled.
Dim settings As New XsltSettings(False, True)
' Execute the transform.
Dim xslt As New XslCompiledTransform()
xslt.Load("calc.xsl", settings, New XmlUrlResolver())
xslt.Transform("books.xml", "books.html")
// Create the XsltSettings object with script enabled.
XsltSettings settings = new XsltSettings(false,true);
// Execute the transform.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("calc.xsl", settings, new XmlUrlResolver());
xslt.Transform("books.xml", "books.html");
Per ulteriori informazioni, vedere Considerazioni sulla sicurezza XSLT.
Nuove funzionalità
File temporanei
I file temporanei vengono talvolta generati durante l'elaborazione XSLT. Se un foglio di stile contiene blocchi di script o se viene compilato con l'impostazione di debug impostata su true, è possibile creare i file temporanei nella cartella %TEMP%. In alcuni casi è possibile che alcuni file temporanei non vengano eliminati a causa di problemi di temporizzazione. Ad esempio, se i file vengono utilizzati nell'AppDomain corrente o dal debugger, il finalizzatore dell'oggetto TempFileCollection non sarà in grado di rimuoverli.
Per assicurarsi che tutti i file temporanei vengano rimossi dal client, è possibile utilizzare la proprietà TemporaryFiles per eseguire una pulizia aggiuntiva.
Supporto per l'elemento xsl:output e XmlWriter
La classe XslTransform ignora le impostazioni xsl:output quando l'output della trasformazione viene inviato a un oggetto XmlWriter. Per la classe XslCompiledTransform è disponibile una proprietà OutputSettings che restituisce un oggetto XmlWriterSettings contenente le informazioni di output derivate dall'elemento xsl:output del foglio di stile. L'oggetto XmlWriterSettings viene utilizzato per creare un oggetto XmlWriter con le impostazioni corrette che è possibile passare al metodo Transform. Nel codice C# seguente viene illustrato questo comportamento:
// Create the XslTransform object and load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(stylesheet);
// Load the file to transform.
XPathDocument doc = new XPathDocument(filename);
// Create the writer.
XmlWriter writer = XmlWriter.Create(Console.Out, xslt.OutputSettings);
// Transform the file and send the output to the console.
xslt.Transform(doc, writer);
writer.Close();
Opzione di debug
La classe XslCompiledTransform è in grado di generare informazioni di debug che consentono di eseguire il debug del foglio di stile con Microsoft Visual Studio Debugger. Per ulteriori informazioni, vedere XslCompiledTransform(Boolean).
Differenze di comportamento
Trasformazione in XmlReader
La classe XslTransform contiene diversi overload Transform che restituiscono informazioni sulle trasformazioni sotto forma di oggetto XmlReader. È possibile utilizzare questi overload per caricare i risultati delle trasformazioni in una rappresentazione in memoria (ad esempio XmlDocument o XPathDocument) senza rischiare di sovraccaricare la serializzazione e la deserializzazione della struttura ad albero XML risultante. Nel codice C# seguente viene illustrato come caricare i risultati delle trasformazioni in un oggetto XmlDocument.
// Load the style sheet
XslTransform xslt = new XslTransform();
xslt.Load("MyStylesheet.xsl");
// Transform input document to XmlDocument for additional processing
XmlDocument doc = new XmlDocument();
doc.Load(xslt.Transform(input, (XsltArgumentList)null));
La classe XslCompiledTransform non supporta la trasformazione in un oggetto XmlReader. È tuttavia possibile eseguire la stessa operazione utilizzando il metodo CreateNavigator per caricare la struttura ad albero XML risultante direttamente da un oggetto XmlWriter. Nel codice C# seguente viene illustrato come eseguire la stessa attività utilizzando XslCompiledTransform.
// Transform input document to XmlDocument for additional processing
XmlDocument doc = new XmlDocument();
using (XmlWriter writer = doc.CreateNavigator().AppendChild()) {
xslt.Transform(input, (XsltArgumentList)null, writer);
}
Comportamento discretionary
Nella raccomandazione W3C, XSL Transformations (XSLT) Version 1.0, sono incluse aree in cui il provider dell'implementazione può decidere come gestire una determinata situazione. Queste aree si considerano come aree di comportamento discretionary. Sono numerose le aree in cui XslCompiledTransform si comporta in modo diverso rispetto alla classe XslTransform. Per ulteriori informazioni, vedere Errori XSLT risolvibili.
Oggetti di estensione e funzioni di script
Con XslCompiledTransform vengono introdotte due nuove restrizioni relative all'utilizzo di funzioni script:
Da espressioni XPath è possibile chiamare solo metodi pubblici.
Gli overload si distinguono tra loro in base al numero di argomenti. Se più di un overload presenta lo stesso numero di argomenti, verrà generata un'eccezione.
In XslCompiledTransform si verifica un'associazione (ricerca del nome del metodo) alle funzioni di script in fase di compilazione e i fogli di stile utilizzati con XslTranform possono generare un'eccezione quando vengono caricati con XslCompiledTransform.
Con XslCompiledTransform sono supportati gli elementi figlio msxsl:using e msxsl:assembly all'interno dell'elemento msxsl:script. Gli elementi msxsl:using e msxsl:assembly sono utilizzati per dichiarare spazi dei nomi e assembly aggiuntivi da utilizzare nel blocco di script. Per ulteriori informazioni, vedere Blocchi di script utilizzando msxsl:script.
In XslCompiledTransform sono proibiti gli oggetti di estensione che presentano più overload con lo stesso numero di argomenti.
Funzioni MSXML
Alla classe XslCompiledTransform è stato aggiunto il supporto per altre funzioni MSXML. Nell'elenco seguente vengono descritte le funzionalità nuove o migliorate.
msxsl:node-set: con XslTransform è necessario che l'argomento della funzione msxsl:node-set sia un frammento della struttura ad albero dei risultati. Questo requisito non è invece previsto con la classe XslCompiledTransform.
msxsl:version: questa funzione è supportata in XslCompiledTransform.
Funzioni di estensione XPath: sono ora supportate le funzioni ms:string-compare, ms:utc, ms:namespace-uri, ms:local-name, ms:number, ms:format-date e ms:format-time.
Funzioni di estensione XPath correlate allo schema: queste funzioni non sono supportate in modalità nativa da XslCompiledTransform. Tuttavia, possono essere implementate come funzioni di estensione.