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 versione successiva.

// 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 funzioni e caratteristiche

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.

Vedi anche