Migración desde la clase XslTransform

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

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

Rendimiento

La clase XslCompiledTransform incluye muchas mejoras del rendimiento. El nuevo procesador XSLT compila la hoja de estilos XSLT en un formato intermedio común, que es similar a lo 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 volver a utilizar.

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

Nota

Aunque el rendimiento total de la clase XslCompiledTransform es mejor que la clase XslTransform, el método Load de la clase XslCompiledTransform podría ser más lento que el método Load de la clase XslTransform cuando se le llama por primera vez para una transformación. Esto se debe a que el archivo XSLT debe compilarse antes de cargarse. Para más información, vea la entrada de blog siguiente: XslCompiledTransform Slower than XslTransform? (¿Es más lento XslCompiledTransform que XslTransform?)

Seguridad

De forma predeterminada, la clase XslCompiledTransform deshabilita la compatibilidad para la función XSLT document() y los scripts incrustados. Para habilitar estas características, se puede crear un objeto XsltSettings con las características habilitadas y pasarlo al método Load. El siguiente ejemplo muestra cómo habilitar los scripts y cómo realizar una transformación XSLT.

Nota

Los bloques de scripts solo se admiten en .NET Framework. No se admiten en .NET Core ni .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, vea Consideraciones de seguridad de XSLT.

Características nuevas

Archivos temporales

En ocasiones, durante el procesamiento XSLT se generan archivos temporales. Si una hoja de estilos contiene bloques de scripts, o si se ha compilado con la opción de depuración, se crearán archivos temporales en la carpeta %TEMP%. Es posible que en algunos casos no se eliminen algunos archivos temporales por cuestión de tiempo. Por ejemplo, si los archivos están siendo utilizados actualmente por AppDomain o por el depurador, el finalizador del objeto TempFileCollection no será capaz de eliminarlos.

La propiedad TemporaryFiles se puede utilizar para realizar una limpieza adicional, con el fin de asegurarse de que se eliminan todos los archivos temporales del cliente.

Compatibilidad con el elemento xsl:output y con XmlWriter

La clase XslTransform ignora la configuración de xsl:output cuando la salida de una transformación se envía a un objeto XmlWriter. La clase XslCompiledTransform tiene una propiedad OutputSettings que devuelve un objeto XmlWriterSettings que contiene la información de salida resultado del elemento xsl:output perteneciente a la hoja de estilos. El objeto XmlWriterSettings se utiliza para crear un objeto XmlWriter con la configuración correcta, el cual se puede pasar al método Transform. El siguiente código escrito en C# ilustra este tipo de funcionamiento:

// 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 clase XslCompiledTransform puede generar información de depuración, lo que le permite depurar la hoja de estilos con el depurador de Microsoft Visual Studio. Vea XslCompiledTransform(Boolean) para obtener más información.

Diferencias de funcionamiento

Transformar en un XmlReader

La clase XslTransform dispone de numerosas sobrecargas de Transform, las cuales devuelven los resultados de la transformación como un objeto XmlReader. Se pueden utilizar dichas sobrecargas para cargar los resultados de la transformación en una representación en memoria (como un XmlDocument o un XPathDocument) sin incurrir en una sobrecarga del proceso de serialización o deserialización del árbol XML resultante. El siguiente código escrito en C# nuestra cómo cargar los resultados de la transformación en un objeto 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 clase XslCompiledTransform no admite la posibilidad de realizar una transformación en un objeto XmlReader. Sin embargo, puede hacer algo muy parecido si utiliza el método CreateNavigator para cargar el árbol XML resultante directamente desde un XmlWriter. El siguiente código escrito en C# muestra cómo llevar a cabo la misma tarea utilizando 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 de la versión 1.0 de las transformaciones XLT (XSLT) del W3C incluye áreas en las que el proveedor de las implementaciones puede decidir cómo controlar una situación. Estas áreas se consideran comportamientos discrecionales. Existen numerosas áreas en las que XslCompiledTransform se comporta de manera distinta a la clase XslTransform. Para más información, vea Errores XSLT recuperables.

Objetos de extensión y funciones de scripts

XslCompiledTransform introduce dos nuevas restricciones relativas al uso de funciones de script:

  • Desde las expresiones XPath solo es posible llamar a métodos públicos.

  • Las sobrecargas se pueden distinguir unas de otras 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 admiten la posibilidad de contener elementos secundarios msxsl:using y msxsl:assembly dentro del elemento msxsl:script. Los elementos msxsl:using y msxsl:assembly permiten declarar espacios de nombres y ensamblados adicionales que se utilizarán en el bloque del script. Vea Bloques de scripts con msxsl:script para obtener más información.

XslCompiledTransform no permite el uso de objetos de extensión que tengan múltiples sobrecargas con el mismo número de argumentos.

Funciones MSXML

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

Vea también