Migrieren von der XslTransform-Klasse
Die Version Visual Studio 2005 wartet mit einer umgestalteten XSLT-Architektur auf. Die XslTransform-Klasse wurde durch die XslCompiledTransform-Klasse ersetzt.
In den folgenden Abschnitten werden einige der Hauptunterschiede zwischen der XslCompiledTransform-Klasse und der XslTransform-Klasse beschrieben.
Leistung
Die XslCompiledTransform-Klasse weist eine Reihe von Leistungsverbesserungen auf. Der neue XSLT-Prozessor kompiliert das XSLT-Stylesheet in ein allgemeines Zwischenformat, ähnlich wie dies von der CLR (Common Language Runtime) für andere Programmiersprachen erfolgt. Sobald das Stylesheet kompiliert ist, kann es zwischengespeichert und wiederverwendet werden.
Die XslCompiledTransform-Klasse enthält zudem weitere Optimierungen, wodurch sie viel schneller als die XslTransform-Klasse ist.
Hinweis
Obwohl die Gesamtleistung der XslCompiledTransform-Klasse besser ist als die der XslTransform-Klasse, ist die Leistung der Load-Methode der XslCompiledTransform-Klasse möglicherweise langsamer als die Load-Methode der XslTransform-Klasse, wenn sie zum ersten Mal für eine Transformation aufgerufen wird. Dies liegt daran, dass die XSLT-Datei zunächst kompiliert werden muss, bevor sie geladen wird. Weitere Informationen finden Sie im folgenden Blogbeitrag: XslCompiledTransform Slower than XslTransform? (Ist XslCompiledTransform langsamer als XslTransform?)
Sicherheit
Die XslCompiledTransform-Klasse deaktiviert standardmäßig die Unterstützung für die XSLT-Funktion document()
und die Erstellung eingebetteter Skripts. Diese Funktionen können durch Erstellen eines XsltSettings-Objekts aktiviert werden, in dem diese Funktionen aktiviert sind und das an die Load-Methode übergeben wird. Das folgende Beispiel zeigt, wie Sie Skripts aktivieren und eine XSLT-Transformation durchführen können.
Hinweis
Skriptblöcke werden nur im .NET Framework unterstützt. In .NET Core oder .NET 5 oder höher werden sie nicht unterstützt.
// 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")
Weitere Informationen finden Sie unter XSLT-Sicherheitsaspekte.
Neue Funktionen
Temporäre Dateien
Bei der XSLT-Verarbeitung werden mitunter temporäre Dateien angelegt. Diese temporären Dateien werden z. B. dann erstellt und im Ordner <legacyBold>%TEMP%</legacyBold> abgelegt, wenn ein Stylesheet Skriptblöcke enthält oder beim Kompilieren die Debugeinstellung auf <legacyBold>true</legacyBold> gesetzt ist. Es kann vorkommen, dass diese temporären Dateien aufgrund von Timingproblemen nicht wieder gelöscht werden. Dies ist z. B. der Fall, wenn die Dateien von der aktuellen AppDomain oder vom Debugger verwendet werden. Die <legacyBold>Finalize</legacyBold>-Methode des TempFileCollection-Objekts ist dann nicht in der Lage, die temporären Dateien zu entfernen.
Um sicherzustellen, dass alle temporären Dateien vom Client entfernt werden, können Sie die TemporaryFiles-Methode einsetzen, um den Ordner %TEMP% entsprechend aufzuräumen.
Unterstützung für das "xsl:output"-Element und "XmlWriter"
Die XslTransform-Klasse hat xsl:output
-Einstellungen ignoriert, wenn die Transformierenausgabe an ein XmlWriter-Objekt gesendet wurde. Die XslCompiledTransform-Klasse verfügt über die OutputSettings-Eigenschaft, die ein XmlWriterSettings-Objekt mit den Ausgabeinformationen enthält, die aus dem xsl:output
-Element des Stylesheets abgeleitet wurden. Das XmlWriterSettings-Objekt wird zur Erstellung eines XmlWriter-Objekts verwendet, das mit den korrekten Einstellungen versehen ist und an die Transform-Methode übergeben werden kann. Der folgende C#-Code veranschaulicht dieses Verhalten:
// 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();
Debugoption
Die XslCompiledTransform-Klasse kann Debuginformationen generieren, mit denen Sie unter Verwendung des Microsoft Visual Studio-Debuggers Fehler im Stylesheet beheben können. Weitere Informationen finden Sie unter XslCompiledTransform(Boolean).
Verhaltensunterschiede
Transformation in einen „XmlReader“
Die XslTransform-Klasse verfügt über mehrere Transformierenüberladungen, die Transformationsergebnisse in Form eines XmlReader-Objekts zurückgeben. Diese Überladungen können verwendet werden, um die Transformationsergebnisse in eine Darstellung im Arbeitsspeicher zu laden (z. B. XmlDocument oder XPathDocument), ohne dass dabei unnötig viele Ressourcen für die Serialisierung und Deserialisierung der resultierenden XML-Struktur verbraucht werden. Im folgenden C#-Code wird gezeigt, wie die Transformationsergebnisse in ein XmlDocument-Objekt geladen werden:
// 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));
Die XslCompiledTransform-Klasse bietet keine Unterstützung für das Transformieren in ein XmlReader-Objekt. Einen ähnlichen Effekt erreichen Sie aber, indem Sie die CreateNavigator-Methode verwenden, um die resultierende XML-Struktur direkt aus einem XmlWriter zu laden. Im folgenden C#-Code wird gezeigt, wie Sie die gleiche Aufgabe mit XslCompiledTransform erledigen können:
// Transform input document to XmlDocument for additional processing
XmlDocument doc = new XmlDocument();
using (XmlWriter writer = doc.CreateNavigator().AppendChild()) {
xslt.Transform(input, (XsltArgumentList)null, writer);
}
Freigegebene Verhaltensweisen
Im W3C-Dokument „XSL Transformations (XSLT) Version 1.0“ gibt es bestimmte Bereiche, bei denen es dem Anbieter der Implementierung freigestellt ist, wie er mit der jeweiligen Situation umgeht. Diese Bereiche werden als "freigegebene Verhaltensweisen" bezeichnet. Es gibt mehrere Bereiche, in denen sich die XslCompiledTransform-Klasse anders verhält als die XslTransform-Klasse. Weitere Informationen finden Sie unter Behebbare XSLT-Fehler.
Erweiterungsobjekte und Skriptfunktionen
XslCompiledTransform führt zwei neue Beschränkungen für die Verwendung von Skriptfunktionen ein:
Von XPath-Ausdrücken aus dürfen nur öffentliche Methoden aufgerufen werden.
Überladungen können anhand der Anzahl der Argumente voneinander unterschieden werden. Wenn mehrere Überladungen über die gleiche Anzahl von Argumenten verfügen, wird eine Ausnahme ausgelöst.
In XslCompiledTransform erfolgt beim Kompilieren eine Bindung (Methodennamensuche) an Skriptfunktionen, und Stylesheets, die zusammen mit <legacyBold>XslTranform</legacyBold> funktioniert haben, können eine Ausnahme auslösen, wenn sie zusammen mit XslCompiledTransform geladen werden.
XslCompiledTransform unterstützt die Verwendung von untergeordneten msxsl:using
- und msxsl:assembly
-Elementen innerhalb des msxsl:script
-Elements. Die Elemente msxsl:using
und msxsl:assembly
werden verwendet, um zusätzliche Namespaces und Assemblys für die Verwendung im Skriptblock zu deklarieren. Weitere Informationen finden Sie unter Skriptblöcke, die „msxsl:script“ verwenden.
XslCompiledTransform verhindert Erweiterungsobjekte, die über mehrere Überladungen mit derselben Anzahl von Argumenten verfügen.
MSXML-Funktionen
Die XslCompiledTransform-Klasse wurde um die Unterstützung für zusätzliche MSXML-Funktionen erweitert. In der folgenden Liste werden die neuen oder verbesserten Funktionen aufgeführt:
msxsl:node-set: Bei XslTransform musste das Argument der node-set-Funktion ein Ergebnisstrukturfragment sein. Bei XslCompiledTransform ist dies nicht erforderlich.
msxsl:version: Diese Funktion wird in XslCompiledTransform unterstützt.
XPath-Erweiterungsfunktionen: Die ms:string-compare-Funktion, ms:utc-Funktion, ms:namespace-uri-Funktion, ms:local-name-Funktion, ms:number-Funktion, ms:format-date-Funktion und ms:format-time Funktion werden jetzt unterstützt.
Schemabezogene XPath-Erweiterungsfunktionen: Diese Funktionen werden nicht systemintern von XslCompiledTransform unterstützt. Sie können aber als Erweiterungsfunktionen implementiert werden.