Migrazione dalla classe XslTransform
L'architettura XSLT è stata riprogettata in 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 riusato.
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 altre informazioni, vedere il post di blog seguente: XslCompiledTransform Slower than XslTransform? (XslCompiledTransform è più lento di 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.
Nota
I blocchi di script sono supportati solo in .NET Framework. Non sono supportati in .NET Core o .NET 5 o versioni successive.
// 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");
' 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")
Per altre 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 usati 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 usare 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 usato 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 il debugger di Microsoft Visual Studio. Per altre 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 usare 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 dell'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 usando il metodo CreateNavigator per caricare l'albero XML risultante direttamente da un oggetto XmlWriter. Nel codice C# seguente viene illustrato come eseguire la stessa attività usando 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 altre 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 usati con XslTransform possono causare 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 usati per dichiarare spazi dei nomi e assembly aggiuntivi da usare nel blocco di script. Per altre informazioni, vedere Blocchi di script con 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 node-set Function sia un frammento dell'albero dei risultati. Questo requisito non è invece previsto con la classe XslCompiledTransform.
msxsl:version: questa funzione è supportata in XslCompiledTransform.
Funzioni dell'estensione XPath: le funzioni ms:string-compare, ms:utc, ms:namespace-uri, ms:local-name, ms:number, ms:format-date e ms:format-time ora sono supportate.
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.