Compartir a través de


Migración desde la clase XslTransform

La arquitectura XSLT se rediseñó en la versión de Visual Studio 2005. La XslTransform clase se reemplazó por la XslCompiledTransform clase .

En las siguientes secciones se describen algunas de las principales diferencias entre las clases XslCompiledTransform y XslTransform.

Rendimiento

La XslCompiledTransform clase incluye muchas mejoras de rendimiento. El nuevo procesador XSLT compila la hoja de estilos XSLT a un formato intermedio común, similar al que hace Common Language Runtime (CLR) para otros lenguajes de programación. Una vez compilada la hoja de estilos, se puede almacenar en caché y reutilizarla.

La XslCompiledTransform clase también incluye otras optimizaciones que lo hacen mucho más rápido que la XslTransform clase .

Nota:

Aunque el rendimiento general de la XslCompiledTransform clase es mejor que la XslTransform clase , el Load método de la XslCompiledTransform clase puede funcionar más lentamente que el Load método de la XslTransform clase la primera vez que se llama en una transformación. Esto se debe a que el archivo XSLT debe compilarse antes de cargarlo. Para obtener más información, consulte la siguiente entrada de blog: XslCompiledTransform Más lento que XslTransform?

Seguridad

De forma predeterminada, la clase XslCompiledTransform deshabilita la función XSLT document() y el scripting incrustado. Estas características se pueden habilitar mediante la creación de un XsltSettings objeto que tenga habilitadas las características y su paso al Load método . En el ejemplo siguiente se muestra cómo habilitar el scripting y realizar una transformación XSLT.

Nota:

Los bloques de script solo se admiten en .NET Framework. No se admiten en .NET Core o .NET 5 o versiones posteriores.

// 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")

Para obtener más información, consulte Consideraciones de seguridad de XSLT.

Nuevas características

Archivos temporales

A veces, los archivos temporales se generan durante el procesamiento XSLT. Si una hoja de estilos contiene bloques de script o si se compila con la configuración de depuración establecida en true, se pueden crear archivos temporales en la carpeta %TEMP%. Puede haber instancias en las que algunos archivos temporales no se eliminen debido a problemas de tiempo. Por ejemplo, si los archivos están en uso por la AppDomain actual o por el depurador, el finalizador del objeto TempFileCollection no podrá eliminarlos.

La TemporaryFiles propiedad se puede usar para una limpieza adicional para asegurarse de que todos los archivos temporales se quitan del cliente.

Compatibilidad con el elemento xsl:output y XmlWriter

La clase XslTransform ignoró las configuraciones xsl:output cuando se envió el resultado de la transformación a un objeto XmlWriter. La XslCompiledTransform clase tiene una OutputSettings propiedad que devuelve un XmlWriterSettings objeto que contiene la información de salida derivada del xsl:output elemento de la hoja de estilos. El XmlWriterSettings objeto se usa para crear un XmlWriter objeto con la configuración correcta que se puede pasar al Transform método . El código de C# siguiente muestra este comportamiento:

// 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();

Opción de depuración

La XslCompiledTransform clase puede generar información de depuración, que permite depurar la hoja de estilos con el depurador de Microsoft Visual Studio. Consulte XslCompiledTransform(Boolean) para obtener más información.

Diferencias de comportamiento

Transformar en un XmlReader

La XslTransform clase tiene varias sobrecargas de transformación que devuelven resultados de transformación como un XmlReader objeto . Estas sobrecargas se pueden usar para cargar los resultados de transformación en una representación en memoria (como XmlDocument o XPathDocument) sin incurrir en la sobrecarga de serialización y deserialización del árbol XML resultante. El código de C# siguiente muestra cómo cargar los resultados de transformación en un XmlDocument objeto .

// 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 XslCompiledTransform clase no admite la transformación en un XmlReader objeto . Sin embargo, puede hacer algo similar mediante el CreateNavigator método para cargar el árbol XML resultante directamente desde un XmlWriter. En el código de C# siguiente se muestra cómo realizar la misma tarea mediante 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);
}

Comportamiento discrecional

La recomendación W3C XSL Transformations (XSLT) versión 1.0 incluye áreas en las que el proveedor de implementación puede decidir cómo controlar una situación. Estas áreas se consideran asociadas con un comportamiento discrecional. Hay varios aspectos en los que XslCompiledTransform se comporta diferentemente que la clase XslTransform. Para obtener más información, consulte Errores XSLT recuperables.

Objetos de extensión y funciones de script

XslCompiledTransform presenta dos nuevas restricciones sobre el uso de funciones de script:

  • Solo se puede llamar a métodos públicos desde expresiones XPath.

  • Las sobrecargas se distinguen entre sí en función del número de argumentos. Si existe más de una sobrecarga con el mismo número de argumentos, se producirá una excepción.

En XslCompiledTransform se produce un enlace (búsqueda de nombre de método) con las funciones del script en el tiempo de compilación y es posible que las hojas de estilos que habían funcionado con XslTransform generen una excepción si se cargan con XslCompiledTransform.

XslCompiledTransform admite tener msxsl:using y msxsl:assembly elementos secundarios dentro del msxsl:script elemento . Los elementos msxsl:using y msxsl:assembly se usan para declarar espacios de nombres y ensamblados adicionales para su uso en el bloque de script. Consulte Script Blocks Using msxsl:script (Bloques de script con msxsl:script ) para obtener más información.

XslCompiledTransform prohíbe los objetos de extensión que tienen varias sobrecargas con el mismo número de argumentos.

Funciones DE MSXML

Se ha agregado compatibilidad con funciones MSXML adicionales a la XslCompiledTransform clase . En la lista siguiente se describe la funcionalidad nueva o mejorada:

Consulte también