Migreren vanuit de XslTransform-klasse
De XSLT-architectuur is opnieuw ontworpen in de Visual Studio 2005-release. De XslTransform klasse is vervangen door de XslCompiledTransform klasse.
In de volgende secties worden enkele van de belangrijkste verschillen tussen de XslCompiledTransform en de XslTransform klassen beschreven.
Prestaties
De XslCompiledTransform klasse bevat veel prestatieverbeteringen. De nieuwe XSLT-processor compileert het XSLT-opmaakmodel naar een gemeenschappelijke tussenliggende indeling, vergelijkbaar met wat de Common Language Runtime (CLR) doet voor andere programmeertalen. Zodra het opmaakmodel is gecompileerd, kan het in de cache worden opgeslagen en opnieuw worden gebruikt.
De XslCompiledTransform klasse bevat ook andere optimalisaties die het veel sneller maken dan de XslTransform klasse.
Notitie
Hoewel de algehele prestaties van de XslCompiledTransform klasse beter zijn dan de XslTransform klasse, kan de Load methode van de XslCompiledTransform klasse langzamer presteren dan de Load methode van de XslTransform klasse wanneer deze voor het eerst wordt aangeroepen voor een transformatie. Dit komt doordat het XSLT-bestand moet worden gecompileerd voordat het wordt geladen. Zie de volgende blogpost voor meer informatie: XslCompiledTransform Slower dan XslTransform?
Beveiliging
XslCompiledTransform De klasse schakelt standaard ondersteuning voor de XSLT-functie document()
en ingesloten scripts uit. Deze functies kunnen worden ingeschakeld door een XsltSettings object te maken waarvoor de functies zijn ingeschakeld en door te geven aan de Load methode. In het volgende voorbeeld ziet u hoe u scripting inschakelt en een XSLT-transformatie uitvoert.
Notitie
Scriptblokken worden alleen ondersteund in .NET Framework. Ze worden niet ondersteund op .NET Core of .NET 5 of hoger.
// 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")
Zie XSLT-beveiligingsoverwegingen voor meer informatie.
Nieuwe functies
Tijdelijke bestanden
Tijdelijke bestanden worden soms gegenereerd tijdens XSLT-verwerking. Als een opmaakmodel scriptblokken bevat of als het is gecompileerd met de instelling voor foutopsporing ingesteld op waar, kunnen tijdelijke bestanden worden gemaakt in de map %TEMP%. Er kunnen exemplaren zijn wanneer sommige tijdelijke bestanden niet worden verwijderd vanwege timingproblemen. Als de bestanden bijvoorbeeld worden gebruikt door het huidige AppDomain of door het foutopsporingsprogramma, kunnen ze niet worden verwijderd door de finalizer van het TempFileCollection object.
De TemporaryFiles eigenschap kan worden gebruikt voor extra opschoning om ervoor te zorgen dat alle tijdelijke bestanden van de client worden verwijderd.
Ondersteuning voor het element xsl:output en XmlWriter
De XslTransform klasse negeerde xsl:output
instellingen toen de transformatie-uitvoer naar een XmlWriter object werd verzonden. De XslCompiledTransform klasse heeft een OutputSettings eigenschap die een XmlWriterSettings object retourneert dat de uitvoerinformatie bevat die is afgeleid van het xsl:output
element van het opmaakmodel. Het XmlWriterSettings object wordt gebruikt om een XmlWriter object te maken met de juiste instellingen die aan de Transform methode kunnen worden doorgegeven. De volgende C#-code illustreert dit gedrag:
// 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();
Optie voor foutopsporing
De XslCompiledTransform klasse kan foutopsporingsgegevens genereren, waarmee u fouten in het opmaakmodel kunt opsporen met het Foutopsporingsprogramma van Microsoft Visual Studio. Zie XslCompiledTransform(Boolean) voor meer informatie.
Gedragsverschillen
Transformeren naar een XmlReader
De XslTransform klasse heeft verschillende transformatieoverbelastingen die transformatieresultaten retourneren als een XmlReader object. Deze overbelastingen kunnen worden gebruikt om de transformatieresultaten te laden in een in-memory weergave (zoals XmlDocument of XPathDocument) zonder dat de overhead van serialisatie en deserialisatie van de resulterende XML-structuur wordt veroorzaakt. De volgende C#-code laat zien hoe u de transformatieresultaten in een XmlDocument object laadt.
// 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));
De XslCompiledTransform klasse biedt geen ondersteuning voor transformatie naar een XmlReader object. U kunt echter iets soortgelijks doen met behulp van de CreateNavigator methode om de resulterende XML-structuur rechtstreeks vanuit een XmlWriter. De volgende C#-code laat zien hoe u dezelfde taak kunt uitvoeren met behulp van 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);
}
Discretionair gedrag
De aanbeveling W3C XSL Transformations (XSLT) versie 1.0 bevat gebieden waarin de implementatieprovider kan bepalen hoe een situatie moet worden afgehandeld. Deze gebieden worden beschouwd als discretionair gedrag. Er zijn verschillende gebieden waar het XslCompiledTransform gedrag anders werkt dan de XslTransform klasse. Zie Herstelbare XSLT-fouten voor meer informatie.
Extensieobjecten en scriptfuncties
XslCompiledTransform introduceert twee nieuwe beperkingen voor het gebruik van scriptfuncties:
Alleen openbare methoden kunnen worden aangeroepen vanuit XPath-expressies.
Overbelastingen kunnen van elkaar worden onderscheiden op basis van het aantal argumenten. Als meer dan één overbelasting hetzelfde aantal argumenten heeft, wordt er een uitzondering gegenereerd.
In XslCompiledTransform, een binding (methode naam opzoeken) voor scriptfuncties vindt plaats tijdens het compileren en opmaakmodellen die met XslTransform werkten, kan een uitzondering veroorzaken wanneer ze worden geladen met XslCompiledTransform.
XslCompiledTransform ondersteunt het hebben msxsl:using
van onderliggende elementen msxsl:assembly
binnen het msxsl:script
element. De msxsl:using
en msxsl:assembly
elementen worden gebruikt om extra naamruimten en assembly's te declareren voor gebruik in het scriptblok. Zie Scriptblokken met msxsl:script voor meer informatie.
XslCompiledTransform verbiedt uitbreidingsobjecten met meerdere overbelastingen met hetzelfde aantal argumenten.
MSXML-functies
Ondersteuning voor extra MSXML-functies is toegevoegd aan de XslCompiledTransform klasse. In de volgende lijst wordt de nieuwe of verbeterde functionaliteit beschreven:
msxsl:node-set: XslTransform vereist het argument van de functie knooppuntset om een resultaatstructuurfragment te zijn. Deze vereiste is niet vereist voor de XslCompiledTransform klasse.
msxsl:version: Deze functie wordt ondersteund in XslCompiledTransform.
XPath-extensiefuncties: de functies ms:string-compare, ms:utc Function, ms:namespace-uri, ms:local-name Function, ms:number Function, ms:format-date Function en ms:format-time Function functions worden nu ondersteund.
Schemagerelateerde XPath-extensiefuncties: deze functies worden niet systeemeigen ondersteund door XslCompiledTransform. Ze kunnen echter worden geïmplementeerd als extensiefuncties.