Compartir a través de


La clase XslTransform implementa el procesador XSLT

Actualización: November 2007

Nota:

La clase XslTransform es obsoleta en .NET Framework versión 2.0. Puede llevar a cabo Extensible Stylesheet Language for Transformations (XSLT) mediante la clase XslCompiledTransform. Para obtener más información, vea Uso de la clase XslCompiledTransform y Migración desde la clase XslTransform.

La clase XslTransform es un procesador XSLT que implementa la recomendación de las transformaciones XSL (XSLT) versión 1.0. El método Load localiza y lee hojas de estilos y el método Transform transforma el documento de origen determinado. Cualquier almacén que implemente la interfaz IXPathNavigable puede utilizarse como documento de origen para la transformación XslTransform. El .NET Framework implementa actualmente la interfaz IXPathNavigable en XmlDocument, XmlDataDocument, y XPathDocument, de manera que todos estos pueden utilizarse como documento de origen de entrada para una transformación.

El objeto XslTransform en .NET Framework solamente admite la especificación XSLT 1.0, definida con el siguiente espacio de nombres:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  

La hoja de estilos puede cargarse utilizando el método Load, desde cualquiera de las clases siguientes:

  • XPathNavigator

  • XmlReader

  • Una cadena que representa una dirección URL

Existe un método Load distinto para cada una de las clases de entrada citadas anteriormente. Algunos métodos toman una combinación de una de estas clases y la clase XmlResolver como argumentos. XmlResolver localiza los recursos a los que hace referencia <xsl:import> o <xsl:include> y que se encuentran en la hoja de estilos. Los métodos siguientes toman una cadena XmlReader o XPathNavigator como entrada.

Overloads Public Sub Load(String)
public void Load(string);
Overloads Public Sub Load(String, XmlResolver)
public void Load(string, XmlResolver);
Overloads Public Sub Load(XmlReader, XmlResolver, Evidence)
public void Load(XmlReader, XmlResolver, Evidence);
Overloads Public Sub Load(XPathNavigator, XmlResolver, Evidence)
public void Load(XPathNavigator, XmlResolver, Evidence);

La mayoría de los métodos Load que se han mostrado antes toman un XmlResolver como parámetro. XmlResolver se utiliza para cargar la hoja de estilos y cualquier hoja u hojas de estilos a las que se haga referencia en los elementos xsl:import y xsl:include.

La mayoría de los métodos Load toman también Evidence como parámetro. El parámetro evidence es el Evidence que está asociado con la hoja de estilos. El nivel de seguridad de la hoja de estilos afecta al nivel de seguridad de cualquier recurso posterior al que haga referencia la hoja de estilos como, por ejemplo, los scripts que contenga, cualquier función document() que utilice y cualquier objeto de extensión utilizado por XsltArgumentList.

Si la hoja de estilos se ha cargado utilizando un método Load que contiene un parámetro URL y no hay ninguna evidencia, la evidencia de la hoja de estilos se calcula combinando la dirección URL dada con su sitio y zona.

Si no se proporciona ningún identificador URI, la hoja de estilos se convierte en un parámetro de plena confianza. No cargue hojas de estilos desde orígenes que no sean de confianza ni agregue objetos de extensión que no sean de confianza en XsltArgumentList.

Para obtener más información sobre niveles de seguridad y evidencia y sobre cómo afectan a los scripts, vea Escribir scripts de hojas de estilos XSLT mediante <msxsl:script>. Para obtener más información sobre niveles de seguridad y evidencia y sobre cómo afectan a los objetos de extensión, vea XsltArgumentList para parámetros Stylesheet y objetos de extensión.

Para obtener más información sobre niveles de seguridad y evidencia y sobre cómo afectan a la función document(), vea Resolver hojas de estilos XSLT y documentos externos.

Una hoja de estilos se puede suministrar con varios parámetros de entrada. Asimismo puede llamar también a funciones en objetos de extensión. Tanto los parámetros como los objetos de extensión se suministran a la hoja de estilos mediante la clase XsltArgumentList. Para obtener más información acerca de XsltArgumentList, vea XsltArgumentList Members.

Uso seguro recomendado de la clase XslTransform

Los privilegios de seguridad de la hoja de estilos dependen de la evidencia proporcionada. En la siguiente tabla se resume la ubicación de la hoja de estilos y se ofrece una explicación del tipo de evidencia que hay que dar.

Situación

Tipo de evidencia que debe proporcionarse

La hoja de estilos XSLT no tiene referencias externas o proviene de un código base en el que confía.

Proporcione la evidencia desde el ensamblado:

Dim xslt = New XslTransform()
xslt.Load(stylesheet, resolver, Me.GetType().Assembly.Evidence)
XsltTransform xslt = new XslTransform();
xslt.Load(stylesheet, resolver,
this.GetType().Assembly.Evidence);

La hoja de estilos XSLT proviene de un código fuente exterior. Se conoce el origen del código fuente y existe un identificador URI que se puede comprobar.

Cree la evidencia utilizando el identificador URI.

Dim xslt As New XslTransform()
Dim ev As Evidence = XmlSecureResolver.CreateEvidenceForUrl(stylesheetUri)
xslt.Load(stylesheet, resolver, evidence)
XslTransform xslt = new XslTransform();
Evidence ev = XmlSecureResolver.CreateEvidenceForUrl(stylesheetUri);
xslt.Load(stylesheet, resolver, evidence);

La hoja de estilos XSLT proviene de un código fuente exterior. Se desconoce el origen del código fuente.

Establezca la evidencia en null. No se procesan los bloques de scripts, no se admite la función document() de XSLT y no están permitidos los objetos de extensión privilegiada.

Además, también puede establecer el parámetro resolver en una referencia null, lo que garantiza que los elementos xsl:import y xsl:include no se procesan.

La hoja de estilos XSLT proviene de un código fuente exterior. Se desconoce el origen del código fuente, pero es necesaria la compatibilidad con los scripts.

Solicite la evidencia al llamador.

Transformación de datos XML

Una vez cargada la hoja de estilos, la transformación comienza con la llamada a uno de los métodos Transform y con el suministro de un documento de origen de entrada. El método Transform se sobrecarga para proporcionar diferentes salidas de transformación. La transformación puede producir los siguientes formatos de salida:

Este último formato, la dirección URL de cadena, proporciona una situación utilizada comúnmente en la transformación de un documento de entrada que se encuentra en una dirección URL y escribe el documento en la dirección URL de salida. Este método Transform es útil para cargar un documento XML desde un archivo, realizar la transformación XSLT y escribir la salida en un archivo. De esta forma se evita tener que crear y cargar el documento de origen de entrada y después escribirlo en una secuencia de archivo. En el ejemplo de código siguiente se muestra este uso del método Transform con la dirección URL de cadena como entrada y como salida:

Dim xsltransform As XslTransform = New XslTransform()
xsltransform.Load("favorite.xsl")
xsltransform.Transform("MyDocument.Xml", "TransformResult.xml", Nothing)
XslTransform xsltransform = new XslTransform();
xsltransform.Load("favorite.xsl");
xsltransform.Transform("MyDocument.xml", "TransformResult.xml", null);

Transformar una sección de un documento XML

Las transformaciones se aplican al documento en su totalidad. En otras palabras, si se pasa un nodo distinto del nodo raíz del documento, esto no evita que el proceso de transformación pueda obtener acceso a todos los nodos del documento cargado. Para transformar un fragmento del árbol de resultados, habrá que crear un XmlDocument que contenga el fragmento de árbol de resultados y pasar ese XmlDocument al método Transform. En el ejemplo siguiente se realiza una transformación en un fragmento de árbol de resultados.

Dim xslt As New XslTransform()
xslt.Load("print_root.xsl")
Dim doc As New XmlDocument()
doc.Load("library.xml")
' Create a new document containing just the result tree fragment.
Dim testNode As XmlNode = doc.DocumentElement.FirstChild
Dim tmpDoc As New XmlDocument()
tmpDoc.LoadXml(testNode.OuterXml)
' Pass the document containing the result tree fragment 
' to the Transform method.
Console.WriteLine(("Passing " + tmpDoc.OuterXml + " to print_root.xsl"))
xslt.Transform(tmpDoc, Nothing, Console.Out, Nothing)
XslTransform xslt = new XslTransform();     
xslt.Load("print_root.xsl");
XmlDocument doc = new XmlDocument();
doc.Load("library.xml");
// Create a new document containing just the result tree fragment.
XmlNode testNode = doc.DocumentElement.FirstChild; 
XmlDocument tmpDoc = new XmlDocument(); 
tmpDoc.LoadXml(testNode.OuterXml);
// Pass the document containing the result tree fragment 
// to the Transform method.
Console.WriteLine("Passing " + tmpDoc.OuterXml + " to print_root.xsl");
xslt.Transform(tmpDoc, null, Console.Out, null);

En el ejemplo se han utilizado los archivos library.xml y print_root.xsl como entrada y el resultado que se muestra en la consola es el siguiente.

Passing <book genre="novel" ISBN="1-861001-57-5"><title>Pride And Prejudice</title></book> to print_root.xsl 
Root node is book.

library.xml

<library>
  <book genre='novel' ISBN='1-861001-57-5'>
     <title>Pride And Prejudice</title>
  </book>
  <book genre='novel' ISBN='1-81920-21-2'>
     <title>Hook</title>
  </book>
</library>

print_root.xsl

<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform" >
  <output method="text" /> 
  <template match="/">
     Root node is  <value-of select="local-name(//*[position() = 1])" /> 
  </template>
</stylesheet>

Migración de XSLT de la versión 1.0 a la versión 1.1 de .NET Framework

La tabla siguiente muestra los métodos versión 1.0 .NET Framework obsoletos y los nuevos métodos versión 1.1 .NET Framework para el método Load. Los nuevos métodos permiten limitar los permisos de la hoja de estilos especificando la evidencia.

Métodos Load obsoletos de la versión 1.0 de .NET Framework

Métodos Load de reemplazo de la versión 1.1 de .NET Framework

Load(entrada XPathNavigator);

Load(entrada XPathNavigator, resolución XmlResolver);

Load(hoja de estilos XPathNavigator, resolución XmlResolver, evidencia Evidence);

Load(hoja de estilos IXPathNavigable);

Load(hoja de estilos IXPathNavigable, resolución XmlResolver);

Load(hoja de estilos IXPathNavigable, resolución XmlResolver, evidencia Evidence);

Load(hoja de estilos XmlReader);

Load(hoja de estilos XmlReader, resolución XmlResolver);

Load(hoja de estilos XmlReader, resolución XmlResolver, evidencia Evidence);

La tabla siguiente muestra los métodos obsoletos y nuevos Transform. Los nuevos métodos toman un objeto XmlResolver.

Métodos Transform obsoletos de la versión 1.0 de .NET Framework

Métodos Transform de reemplazo de la versión 1.1 de .NET Framework

XmlReader Transform(entrada XPathNavigator, argumentos XsltArgumentList)

XmlReader Transform(entrada XPathNavigator, argumentos XsltArgumentList, resolución XmlResolver)

XmlReader Transform(entrada IXPathNavigable, argumentos XsltArgumentList)

XmlReader Transform(entrada IXPathNavigable, argumentos XsltArgumentList, resolución XmlResolver)

Void Transform(entrada XPathNavigator, argumentos XsltArgumentList, salida XmlWriter)

Void Transform(entrada XPathNavigator, argumentos XsltArgumentList, salida XmlWriter, resolución XmlResolver)

Void Transform(entrada IXPathNavigable, argumentos XsltArgumentList, salida XmlWriter)

Void Transform(entrada IXpathNavigable, argumentos XsltArgumentList, salida XmlWriter, resolución XmlResolver)

Void Transform(entrada XPathNavigator, argumentos XsltArgumentList, salida TextWriter)

Void Transform(entrada XPathNavigator, argumentos XsltArgumentList, salida TextWriter, resolución XmlResolver)

Void Transform(entrada IXPathNavigable, argumentos XsltArgumentList, salida TextWriter)

Void Transform(entrada IXPathNavigable, argumentos XsltArgumentList, salida TextWriter, resolución XmlResolver)

Void Transform(entrada XPathNavigator, argumentos XsltArgumentList, salida Stream)

Void Transform(entrada XPathNavigator, argumentos XsltArgumentList, salida Stream, resolución XmlResolver)

Void Transform(entrada IXPathNavigable, argumentos XsltArgumentList, salida Stream)

Void Transform(entrada IXPathNavigable, argumentos XsltArgumentList, salida Stream, resolución XmlResolver)

Void Transform(entrada String, salida String);

Void Transform(entrada String, salida String, resolución XmlResolver);

La propiedad XslTransform.XmlResolver es obsoleta en .NET Framework versión 1.1. En lugar de esta propiedad, utilice las nuevas sobrecargas Transform que toman un objeto XmlResolver.

Vea también

Conceptos

Transformaciones XSLT con la clase XslTransform

XPathNavigator en transformaciones

XPathNodeIterator en transformaciones

Entrada XPathDocument Input para XslTransform

Entrada de XmlDataDocument en XslTransform

Entrada de XmlDocument en XslTransform

Referencia

XslTransform

XslTransform