Migration depuis la classe XslTransform
L’architecture XSLT a été repensée dans la version 2005 de Visual Studio. La classe XslTransform a été remplacée par la classe XslCompiledTransform.
Les sections suivantes décrivent quelques-unes des principales différences entre les classes XslCompiledTransform et XslTransform.
Performances
La classe XslCompiledTransform comporte de nombreuses améliorations des performances. Le nouveau processeur XSLT compile la feuille de style XSLT en un format intermédiaire commun, à la façon dont le CLR (common language runtime) le fait pour d'autres langages de programmation. Une fois compilée, la feuille de style peut être mise en cache et réutilisée.
La classe XslCompiledTransform inclut aussi d'autres optimisations qui la rendent beaucoup plus rapide que la classe XslTransform.
Notes
Bien que les performances globales de la classe XslCompiledTransform soient meilleures que celles de la classe XslTransform, la méthode Load de la classe XslCompiledTransform peut s'exécuter plus lentement que la méthode Load de la classe XslTransform la première fois qu'elle est appelée pour une transformation. C'est parce que le fichier XSLT doit être compilé avant d'être chargé. Pour plus d'informations, consultez le billet de blog suivant : XslCompiledTransform plus lent que XslTransform ?.
Sécurité
Par défaut, la classe XslCompiledTransform désactive la prise en charge de la fonction XSLT document()
et les scripts intégrés par défaut. Ces fonctionnalités peuvent être activées en créant un objet XsltSettings où les fonctionnalités sont activées et en le passant à la méthode Load. L'exemple suivant montre comment activer les scripts et effectuer une transformation XSLT.
Notes
Les blocs de script sont pris en charge uniquement dans .NET Framework. Ils ne sont pas pris en charge sur .NET Core ou .NET 5 ou des versions ultérieures.
// 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")
Pour plus d’informations, consultez la page Considérations relatives à la sécurité de XSLT.
Nouvelles fonctionnalités
Fichiers temporaires
Des fichiers temporaires sont parfois générés au cours du traitement XSLT. Si une feuille de style contient des blocs de script, ou si elle est compilée avec le paramètre de débogage défini sur true, des fichiers temporaires peuvent être créés dans le dossier %TEMP%. Certains fichiers temporaires ne sont pas supprimés à cause de problèmes de synchronisation. Par exemple, si les fichiers sont utilisés par le AppDomain en cours ou par le débogueur, le finaliseur de l'objet TempFileCollection ne pourra pas les supprimer.
La propriété TemporaryFiles peut être utilisée pour un nettoyage supplémentaire afin de s'assurer que tous les fichiers temporaires sont supprimés du client.
Prise en charge de l'élément xsl:output et de XmlWriter
La classe XslTransform a ignoré les paramètres xsl:output
lorsque la sortie de transformation a été envoyée à un objet XmlWriter. La classe XslCompiledTransform a une propriété OutputSettings qui retourne un objet XmlWriterSettings contenant les informations de sortie dérivées de l'élément xsl:output
de la feuille de style. L'objet XmlWriterSettings est utilisé pour créer un objet XmlWriter avec les paramètres corrects qui peut être passé à la méthode Transform. Le code C# suivant illustre ce comportement :
// 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();
Option de débogage
La classe XslCompiledTransform peut générer des informations de débogage, ce qui vous permet de déboguer la feuille de style à l’aide du Débogueur Microsoft Visual Studio. Consultez la rubrique XslCompiledTransform(Boolean) (éventuellement en anglais) pour plus d'informations.
Différences comportementales
Transformation vers un XmlReader
La classe XslTransform possède plusieurs surcharges Transform qui retournent des résultats de transformation sous forme d'objet XmlReader. Ces surcharges peuvent être utilisées pour charger les résultats de transformation dans une représentation en mémoire (telle que XmlDocument ou XPathDocument) sans subir la charge de sérialisation et de désérialisation de l'arborescence XML résultante. Le code C# suivant montre comment charger les résultats de transformation dans un objet 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 ne prend pas en charge la transformation vers un objet XmlReader. Vous pouvez cependant effectuer une opération similaire en utilisant la méthode CreateNavigator pour charger directement l’arborescence XML résultante à partir d’un XmlWriter. Le code C# suivant montre comment exécuter la même tâche à l’aide de 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);
}
Comportement discrétionnaire
La recommandation du W3C sur XSLT (XSL Transformations) Version 1.0 comprend des zones dans lesquelles le fournisseur d'implémentation peut décider de la manière de gérer une situation. Ces zones sont considérées comme discrétionnaires en termes de comportement. Il existe plusieurs domaines où le XslCompiledTransform se comporte différemment de la classe XslTransform. Pour plus d’informations, consultez la page Erreurs XSLT récupérables.
Objets d’extension et fonctions de script
XslCompiledTransform introduit deux nouvelles restrictions sur l'utilisation des fonctions de script :
Seules les méthodes publiques peuvent être appelées à partir des expressions XPath.
Il est possible de différencier les surcharges en fonction du nombre d’arguments. Si plusieurs surcharges ont le même nombre d'arguments, une exception est levée.
Dans XslCompiledTransform, une liaison (recherche de nom de méthode) vers des fonctions de script se produit au moment de la compilation, et les feuilles de style qui fonctionnaient avec XslTransform risquent de déclencher une exception lorsqu’elles sont chargées avec XslCompiledTransform.
XslCompiledTransform accepte la présence d'éléments enfants msxsl:using
et msxsl:assembly
dans l'élément msxsl:script
. Les éléments msxsl:using
et msxsl:assembly
sont utilisés pour déclarer des espaces de noms et des assemblys supplémentaires pour une utilisation dans le bloc de script. Consultez la page Blocs de script utilisant msxsl:script pour plus d’informations.
XslCompiledTransform interdit les objets d'extension qui ont plusieurs surcharges avec le même nombre d'arguments.
Fonctions MSXML
La prise en charge de fonctions MSXML supplémentaires a été ajoutée à la classe XslCompiledTransform. La liste suivante décrit les fonctionnalités nouvelles ou améliorées :
msxsl:node-set: XslTransform avait besoin que l'argument de la fonction node-set Function soit un fragment de l'arborescence de résultats. La classe XslCompiledTransform n’impose pas cette exigence.
msxsl:version : cette fonction est prise en charge dans XslCompiledTransform.
Fonctions d’extension XPath : les fonctions ms:string-compare Function, ms:utc Function, ms:namespace-uri Function, ms:local-name Function, ms:number Function, ms:format-date Function et ms:format-time Function sont maintenant prises en charge.
Fonctions d’extension Xpath liées au schéma : ces fonctions ne sont pas prises en charge en natif par XslCompiledTransform. Toutefois, elles peuvent être implémentées en tant que fonctions d’extension.