Sei sulla pagina 1di 25

Marco Besteiro y Miguel Rodrguez XSLT.

NET

XSLT.NET
XSLT en .NET.
XSLT (XSL Transformations) es una especificacin del W3C (Worl Wide Web
Consortium). Actualmente se est trabajando en la versin 2.0, siendo las anteriores la
1.0, www.w3.org/tr/xslt y la 1.1, www.w3.org/tr/xslt11.

Cronolgicamente, lo primero que apareci fue la especificacin XSL (Extensible


Stylesheets Language), que defina un lenguaje de tipo XML para transformar
documentos XML en otros documentos y un vocabulario de tipo XML que especificaba
cmo aplicarles formato.

Posteriormente, la especificacin XSL se dividi en dos:


- XSL, que especifica cmo dar formato a los documentos XML.
- XSLT (XSL Transformations), un lenguaje de tipo XML mediante el cual puede
especificarse el proceso de transformacin de un documento XML en otro
documento XML.

XSLT est diseado para ser utilizado como parte de XSL. Se puede decir que XSL
especifica el estilo de un documento XML utilizando XSLT para describir cmo el
documento es transformado en otro documento XML que utilice el vocabulario XSL de
formato.

Figura 26.1. Modelo de proceso XSL.

El modelo de proceso XSL es conceptual. Cualquier implementacin que se haga de


este modelo tiene como nica exigencia producir el resultado esperado por el modelo,
pudiendo implementar los procesos de transformacin y formateo juntos o por separado.

La idea es muy sencilla. A partir del documento XML a transformar y formatear, se crea
su rbol de nodos -rbol fuente-. El parser XSLT, basndose en una pgina XSL -en su
parte XSLT-, transforma el rbol fuente, obteniendo el rbol resultado, en cuyos nodos

1/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

se guardan los elementos de formateo. Una vez se dispone del rbol resultado se le
aplica el parser XSL -que puede venir implementado con el parser XSLT-, el cual se
puede basar en la parte XSL de la misma pgina en la que se ha basado el parser XSLT,
obteniendo el documento resultado en el formato deseado.

Cabe mencionar que XSLT puede ser utilizado independientemente de XSL. No


obstante XSLT no se ha pensado como un lenguaje de transformacin XML de
propsito general.

XSLT utiliza el lenguaje de expresiones XPath para seleccionar y procesar nodos de un


documento XML. XPath es un lenguaje de consulta pensado para navegar por los nodos
de un rbol correspondiente a un documento.

Actualmente, el Framework .NET soporta la mayora de las caractersticas de la versin


1.0 de la recomendacin XSLT de W3C. La implementacin concreta de estas
caractersticas la hace la clase XslTransform -namespace System.Xml.Xsl- que es un
parser XSLT.

Por otro lado, se ha comentado que XSLT utiliza XPath para navegar por un documento
XML. En el Framework .NET la implementacin de XPath se hace mediante la clase
XPathNavigator y la interfaz IPathNavigable. La interfaz IPathNavigable es
implementada por las clases XmlDocument, XmlDataDocument y XPathDocument y
ofrece un mtodo CreateNavigator que devuelve un objeto XPathNavigator
mediante el cual se puede navegar por el documento asociado.

En la figura 26.2 Se puede observar la arquitectura de transformacin implementada por


.NET.

2/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

Figura 26.2. Implementacin que da el Framework .NET al modelo XSLT.

El siguiente es ejemplo sencillo de XSLT con .NET:

//Creacin de una instancia del parser XSLT


XslTransform xslt = new XslTransform();

//Carga de la pgina xsl en la que se basar la transformacin


xslt.Load("http://servidorpepe/trans1.xsl");

//Creacin de un objeto XPathDocument al que se asociar el documento


//xml a transformar
XPathDocument xmldocument = new
XmlDocument"http://servidorpepe/libros.xml");

//creacin de un flujo de salida asociado a la consola


XmlWriter writer = new XmlTextWriter(Console.Out);

//La salida sera formateada, con tabulaciones.


Writer.Formatting=Formatting.Indented;

//Invocacin al mtodo Transform del parser XSLT para realizar la


//tranformacin basada en trans1.xsl. El resultado de la
//transformacin se enviar al flujo writer, es decir, a la consola
xslt.Transform(xmldocument, null, writer);

Como puede verse, los pasos bsicos para aplicar una transformacin a un documento
XML son:

- Crear el parser XSLT.


- Asociarle la pgina .xsl deseada -contiene la informacin de transformacin-.
- Cargar el documento .xml a transformar.
- Crear el flujo de salida, al que se enviar el documento resultado de la
transformacin.
- Invocar al mtodo Transform de la clase XslTransform, con lo que se realizar
la transformacin.

XPath.
El cometido principal de XPath es acelerar las iteraciones y selecciones que se realicen
sobre un documento XML. Como se ha comentado, XPath es utilizado desde XSLT
para mejorar la eficiencia de la transformacin de un documento XML. No obstante
puede utilizarse independientemente.

Las clases XPath se encuentran en el namespace System.Xml.XPath, siendo las ms


representativas:

- XPathDocument: Esta clase implementa la interfaz IXPathNavigable y


representa un documento XML completo. Est optimizada para el procesamiento
XSLT y el modelo de datos XPath.

- XPathNavigator: Esta clase permite navegar sobre un documento XML en


modo read only -slo lectura- y est optimizada para el procesamiento XSLT y
el modelo de datos XPath.

3/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

- XPathNodeIterator: Representa un conjunto de nodos creado como resultado


de una consulta XPath. Permite navegar por los nodos utilizando un cursor de
tipo slo lectura hacia delante (read-only, forward-only).

- XPathExpression: representa una expresin XPath compilada, resultado de


invocar al mtodo Compile de XPathNavigator. Esta expresin puede ser luego
utilizada por los mtodos Select, Evaluate y Matches de la clase
XPathNavigator.

Adems de las clases comentadas cabe resear la interfaz IXPathNavigable, que es


implementada por las clases XmlNode -y sus derivadas- y XPathDocument. Esta interfaz
ofrece un mtodo llamado CreateNavigator que devuelve un objeto de la clase
XPathNavigator.

Por ejemplo:

XPathDocument doc = new XPathDocument("libros.xml");


XPathNavigator nav = doc.CreateNavigator();

A pesar de que XPath es generalmente utilizado desde XSLT, tambin puede utilizarse
independientemente. En tal caso ofrece la ventaja de poder seleccionar, recorrer y
realizar rpidamente operaciones sobre nodos.

A continuacin se muestra la aplicacin EjemploXPath en la que se recorren todos los


nodos del rbol correspondiente a la carga de libros.xml cuyo genero sea novela,
mostrando su informacin en una lista y la suma de los precios de los libros en una caja
de texto.

Al iniciar la aplicacin -mtodo Form_Load-, se copia el contenido del fichero


libros.xml a la caja de texto textBox1 situada a la izquierda del formulario. El
recorrido se har al pulsar el botn Leer XPath. El cdigo del mtodo manejador del
evento Click sobre el botn Leer XPath ser:

using System.Xml.XPath;

private void button1_Click(object sender, System.EventArgs e)


{
XPathNodeIterator iteratordatoslibro;

XPathDocument doclibros = new


XPathDocument("..\\..\\libros.xml");

//creacin del objeto navegador XPathNavigator. El mtodo


//CreateNavigator es heredado e implementado por XPathDocument a
//partir de IXPathNavigable.
XPathNavigator navigatorlibros = doclibros.CreateNavigator();

4/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

//ejecutar una consulta XPath para recuperar un conjunto de


//nodos XML tales nodos han de corresponder a libros de gnero
//'novela'.
XPathNodeIterator iteratorlibros =
navigatorlibros.Select("/biblioteca/libro[@genero='novela']");

//iteratorlibros permite recorrer todos los nodos del conjunto


//de nodos resultado de la consulta anterior.
//el mtodo MoveNext salta al siguiente nodo.
while (iteratorlibros.MoveNext())
{
//iteratorlibros.Current devuelve un puntero XPathIterator
//al nodo actual.
//El mtodo SelectDescendants (de XPathIterator) selecciona
//un conjunto con los nodos descendientes o hijos del
//actual (<libro>), que se puede recorrer con
//iteratordatoslibro (los nodos hijo son <titulo>, <autor>
//y <precio>).
iteratordatoslibro =
iteratorlibros.Current.SelectDescendants(
XPathNodeType.Element,false);

//recorrido de los nodos hijos del libro actual


while(iteratordatoslibro.MoveNext())
{
//se muestra el contenido de cada nodo en la lista,
//excepto el del nodo autor que se muestra al pasar
//por sus nodos hijo (<nombre> y <apellido>).
if (!iteratordatoslibro.Current.Name.Equals("autor"))
listBox1.Items.Add(iteratordatoslibro.Current.Value);
}
}

//Se muestra en la caja de texto la suma del precio


//de todos los libros devueltos al ejecutar la
//consulta XPath indicada (todos los libros cuyo
//gnero sea 'novela'.
textBox2.Text =
navigatorlibros.Evaluate("sum(/biblioteca/libro
[@genero='novela']/precio)").ToString();
}

El resultado de ejecutar la aplicacin y pulsar el botn Leer XPath ser:

5/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

Figura 26.3. Recorrido XPath del documento libros.xml. Se realiza una consulta
XPath y una operacin.

XSLT.
En el Framework .NET, el namespace System.Xml.Xsl es el que contiene las clases e
interfaces que dan soporte a las transformaciones XSL (XSL Transforms).

Sin duda, la clase fundamental de este namespace es XslTransform, que permite


transformar datos XML ayudndose de una hoja de estilos XSL -realmente se puede
decir una hoja XSLT-.

XslTransform soporta la versin 1.0 de la declaracin XSLT y por este motivo es


necesario que en toda hoja XSLT que vaya a ser utilizada por XslTransform se incluya
la declaracin de namespace

xmlns:xsl= http://www.w3.org/1999/XSL/Transform

Nota: es importante no confundir namespace XML con namespace .NET.

Los mtodos ms significativos de la clase XslTransform son:

- Load : carga una hoja de estilos XSLT, incluyendo cualquier referencia de tipo
xsl:import y xsl:include que contenga. Este mtodo est sobrecargado, en
su versin ms sencilla basta con pasarle un string con la URL de la hoja de
estilos. No obstante, admite cargar la hoja de estilos a partir de un XmlReader,
XPathNavigator o IXPathNavigable.

Por ejemplo:

XslTransform transxslt = new XslTransform();

6/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

transxslt.Load(..//..//libros.xsl);

- Transform : transforma los datos XML que se le especifiquen -primer


parmetro-, utilizando la hoja de estilos XSLT que se le indique devolviendo el
resultado de la transformacin. Este mtodo est sobrecargado, siendo el
prototipo de la sobrecarga ms comn:

public void Transform(IXPathNavigable,


XsltArgumentList, Stream);

o El tipo del primer parmetro es IXPathNavigable y representa un


conjunto de datos XML, que es el que va a ser transformado.
o El tipo del segundo parmetro es XsltArgumentList (pertenece al
namespace System.Xml.Xsl) y representa argumentos que pueden ser
utilizados en la transformacin.
o El tipo del tercer parmetro es Stream y representa un flujo al que
enviar la salida de la transformacin el mtodo Transform.

Varias de las sobrecargas del mtodo Transform difieren nicamente en el tipo


del tercer parmetro, que puede ser TextWriter o XmlWriter. Otras difieren en
el tipo del primer parmetro, que puede ser XPathNavigator.

Existe otra variante que slo recibe dos parmetros, pudiendo ser el primero de
tipo IPathNavigator o XPathNavigator y siendo el segundo de tipo
XsltArgumentList. Esta variante devuelve como resultado un objeto de tipo
XmlReader, que permite leer la salida de la transformacin.

Por ltimo, existe un mtodo que recibe dos argumentos de tipo string, el
primero representa el fichero XML de entrada y el segundo el fichero de salida.

El procedimiento a seguir con la clase XslTransform para transformar un documento


XML es:
1. Obtener un documento XML.
2. Crear un objeto de la clase XslTransform.
3. Utilizar el mtodo Load para cargar la hoja de estilos (XSLT) a utilizar para la
transformacin.
4. Utilizar el mtodo Transform para transformar los datos XML.

A continuacin se muestra un ejemplo similar a EjemploXPath (en este caso se llama


EjemploXSLT y utiliza dos cajas de texto, en lugar de una caja y una lista) en el que al
pulsar el botn XSLT se realiza una transformacin XSLT a HTML basada en la hoja de
estilos libros.xsl, mostrando su resultado en la caja de texto de la derecha y
guardndolo tambin en un fichero librosxsltresul.html.

En este ejemplo se incluye algn comentario de ayuda pero se presupone un


conocimiento bsico de XSL:

El contenido de la hoja de estilos libros.xsl es

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

7/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

<!-- Esta primera parte define la estructura del documento


transformado -->
<!-- La lnea siguiente busca el nodo raz del documento -->
<xsl:template match="/">
<!--Lo que sigue, hasta el siguiente comentario, aparecer
literalmente-->
<html>
<head>
<title>Prueba xsl</title>
</head>
<body>
<!-- La lnea siguiente pide que se apliquen las
plantillas -->
<!-- Las plantillas que se indican mas abajo son las
que se aplican -->
<!-- Se comienza por el elemento mas cercano a la raz,
que es-->
<!--biblioteca-->
<xsl:apply-templates />
</body>
</html>
</xsl:template>

<!--A partir de aqu se indican las plantillas que se aplicarn-


->
<xsl:template match="biblioteca">
<!-- La plantilla biblioteca slo pide aplicar la plantilla
libro -->
<xsl:apply-templates select="libro" />
</xsl:template>
<!-- La plantilla libro muestra el valor de ciertos elementos-->
<!-- (ISBN, titulo, precio) de cada libro-->
<!-- Adems inserta texto y algn otro elemento vlido en HTML--
>
<xsl:template match="libro">
ISBN:
<xsl:value-of select="@ISBN" />
<br></br>
Titulo:
<xsl:value-of select="titulo" />
<br></br>
Precio:
<xsl:value-of select="precio" />
<br></br>
<br></br>
<text></text>
</xsl:template>
</xsl:stylesheet>

Obsrve que no se acentan las palabras. El motivo es que es muy posible que, si se
utilizan tildes, se produzcan errores en el proceso de transformacin.

El cdigo del mtodo de respuesta al evento Click sobre el botn XSLT


(button1_Click) es:

private void button1_Click(object sender, System.EventArgs e)


{
//Creacin de una instancia del parser XSLT
XslTransform xslt = new XslTransform();

8/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

//Carga de la pgina xsl en la que se basar la transformacin


xslt.Load("..\\..\\libros.xsl");

//Creacin de un objeto XPathDocument al que se asociar el


//documento xml a transformar
XPathDocument docxml = new XPathDocument("..\\..\\libros.xml");

//creacin de un flujo de salida asociado al fichero


//librosxsltresul.html
XmlTextWriter escritor = new
XmlTextWriter("..\\..\\librosxsltresul.html",
System.Text.Encoding.UTF8);

//La salida ser formateada, con tabulaciones.


escritor.Formatting=Formatting.Indented;

//Invocacin al mtodo Transform del parser XSLT para realizar


//la transformacin basada en libros.xsl. El resultado de la
//transformacin se enviar al flujo escritor, es decir, al
//fichero librosxsltresul.html
xslt.Transform(docxml, null, escritor);

//Invocacin al mtodo Transform. Es igual que la anterior,


//con la salvedad de que el resultado se enva a un flujo
//de tipo XmlReader para poder ser ledo y asignado a textBox2
XmlReader lector = xslt.Transform(docxml, null);
lector.Read();
textBox2.Text = lector.ReadInnerXml();
escritor.Close();
}

Como puede observarse, se realizan dos transformaciones:

xslt.Transform(docxml, null, escritor);

Esta primera transformacin enva el resultado al flujo (stream) escritor, que est
asociado al fichero librosxslresul.html.

XmlReader lector = xslt.Transform(docxml, null);

Esta segunda transformacin devuelve un objeto de tipo XmlReader, que contiene el


resultado de la transformacin y que despus es utilizado para mostrar dicho resultado
en la caja de texto textBox2. Es importante notar que el resultado es de tipo HTML, no
XML. No es del todo ortodoxo utilizar un objeto XmlReader para acceder a la
informacin HTML.

En ambas invocaciones al mtodo Transform, el segundo parmetro es null. El motivo


es que, en este ejemplo, no se pasa una lista de argumentos XsltArgumentList- al
mtodo Transform.

El resultado de ejecutar la aplicacin es:

9/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

Figura 26.4. Transformacin de libros.xml a formato HTML mediante una


transformacin XSLT. Obsrvese el contenido del fichero en la caja de texto de la
derecha.

Adems, se habr generado el fichero librosxslresul.html.

10/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

Figura 26.5. librosxslresul.html. La transformacin ha convertido el fichero de tipo


XML libros.xml en un fichero de tipo HTML con un formato particular.

Scripts XSLT.
La clase XslTransform soporta que las hojas de estilos XSLT incluyan scripts. Los
scripts deben incluirse mediante el elemento <msxsl:script>. El lenguaje del script
puede ser JavaScript, JScript, C# o VB y ha de indicarse en el elemento
<msxsl:script> a travs del atributo language.

Adems se ha de indicar otro atributo implements-prefix, al que se debe asociar un


prefijo que represente el namespace asociado al script.

Es posible declarar variables y funciones en el script y pueden utilizarse clases, con la


condicin de que se cualifiquen completamente, como por ejemplo,

System.Xml.XPath.XPathNavigator,

y que pertenezcan a uno de los siguientes namespace:

11/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

- System
- System.Collection
- System.Text
- System.Xml
- System.Xml.Xsl
- System.Xml.XPath

El tipo de los argumentos y valores de retorno de las funciones del script debe ser uno
de los definidos por el W3C para XPath. A continuacin se indican tales tipos y su
correspondiente en el soporte que ofrece .NET a XPath.

Tipo W3C XPath Tipo equivalente en .NET XPath


String System.String
Boolean System.Boolean
Number System.Double
Node Fragment System.Xml.XPath.XpathNavigator
Node Set System.Xml.XPath.XpathNodeIterator

Si una funcin del script utiliza uno de los siguientes tipos:


- Int16
- Uint16
- Int32
- Uint32
- Int64
- UInt64
- Single
- Decimal
Cualquiera de ellos es convertido implcitamente coercin- a System.Double, que
corresponde al tipo W3C XPath Number. En caso de que una funcin del script utilice
un tipo que no pertenezca a los mencionados, se lanzar una excepcin.

El elemento <msxsl:script> pertenece al namespace urn:schemas-microsoft-


com:xslt. Por este motivo, una hoja de estilos que incluya scripts debe incluir tambin
una declaracin de namespace xmlns:msxsl= urn:schemas-microsoft-com:xslt.

Cuando se carga una hoja de estilos con scripts, se crea una clase envoltorio
(wrapper) que contiene las funciones del script (su nombre se obtiene del atributo
implements-prefix).

Aprovechando el ejemplo anterior, se va a aadir un botn XSLT scripts (button2) tal


que al pulsarlo se realice una transformacin XSLT del documento libros.xml,
utilizando como hoja de estilos librosscripts.xsl y generando como resultado
librosxsltscriptresul.html.

En la hoja librosscripts.xsl habr un script con dos funciones:

- MostrarCabeceraLibro
- MostrarPieLibro

12/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

Ambas devuelven un texto y se invocarn para cada libro, al principio y final


respectivamente.

El contenido de la hoja de estilos librosscripts.xsl es:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:ejemploxslt="http://pandasoftware.es/xslt">

<msxsl:script language="C#" implements-prefix="ejemploxslt">

string MostrarCabeceraLibro()
{
return "***Datos del libro***";
}

string MostrarPieLibro()
{
return "---Fin de datos del libro---";
}

</msxsl:script>

<!-- Esta primera parte define la estructura del documento


transformado -->
<!-- La lnea siguiente busca el nodo raz del documento -->
<xsl:template match="/">
<!--Lo que sigue, hasta el siguiente comentario, aparecer
literalmente-->
<html>
<head>
<title>Prueba xsl</title>
</head>
<body>
<!-- La lnea siguiente pide que se apliquen las
plantillas -->
<!-- Las plantillas que se indican mas abajo son las
que se aplican -->
<!-- Se comienza por el elemento mas cercano a la raz,
que es-->
<!--biblioteca-->
<xsl:apply-templates />
</body>
</html>
</xsl:template>

<!--A partir de aqu se indican las plantillas que se aplicaran-


->
<xsl:template match="biblioteca">
<!-- La plantilla biblioteca solo pide aplicar la plantilla
libro -->
<xsl:apply-templates select="libro" />
</xsl:template>
<!-- La plantilla libro muestra el valor de ciertos elementos-->
<!-- (ISBN, titulo, precio) de cada libro-->
<!-- Adems inserta texto y algn otro elemento valido en HTML--
>
<xsl:template match="libro">
<xsl:value-of select="ejemploxslt:MostrarCabeceraLibro()"/>

13/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

<br></br>
ISBN:
<xsl:value-of select="@ISBN" />
<br></br>
Titulo:
<xsl:value-of select="titulo" />
<br></br>
Precio:
<xsl:value-of select="precio" />
<br></br>
<xsl:value-of select="ejemploxslt:MostrarPieLibro()"/>
<br></br>
<text></text>
</xsl:template>
</xsl:stylesheet>

El cdigo del mtodo de respuesta al evento Click sobre el botn XSLT Scripts es
prcticamente igual al del ejemplo anterior para el botn XSLT.

private void button2_Click(object sender, System.EventArgs e)


{
//Creacin de una instancia del parser XSLT
XslTransform xslt = new XslTransform();

//Carga de la pgina xsl en la que se basar la transformacin


xslt.Load("..\\..\\librosscripts.xsl");

//Creacin de un objeto XPathDocument al que se asociar el


//documento xml a transformar
XPathDocument docxml = new
XPathDocument("..\\..\\libros.xml");

//creacin de un flujo de salida asociado al fichero


//librosxsltresul.html
XmlTextWriter escritor = new
XmlTextWriter("..\\..\\librosxsltscriptresul.html",
System.Text.Encoding.UTF8);

//La salida ser formateada, con tabulaciones.


escritor.Formatting=Formatting.Indented;

//Invocacin al mtodo Transform del parser XSLT para realizar


//la transformacin basada en libros.xsl. El resultado de la
//transformacin se enviar al flujo escritor, es decir, al
//fichero librosxsltresul.html
xslt.Transform(docxml, null, escritor);

//Invocacin al mtodo Transform. Es igual que la anterior,


//con la salvedad de que el resultado se enva a un flujo
//de tipo XmlReader para poder ser ledo y asignado a textBox2
XmlReader lector = xslt.Transform(docxml, null);
lector.Read();
textBox2.Text = lector.ReadInnerXml();
escritor.Close();
}

Tras pulsar el botn XSLT scripts, el resultado de ejecutar la aplicacin es:

14/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

Figura 26.6. Transformacin de libros.xml a formato HTML mediante una


transformacin XSLT en la que interviene una hoja de estilos con scripts. Obsrvese,
en la caja de texto de la derecha, el texto previo y posterior a cada libro.

Se habr generado tambin el fichero librosxsltscriptresul.html.

15/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

Figura 26.7. librosxsltscriptresul.html

XsltArgumentList.
Los objetos de esta clase pueden contener parmetros XSLT o bien objetos de extensin
XSLT. Cuando son pasados al mtodo Transform, estos parmetros y objetos de
extensin pueden ser utilizados desde las hojas de estilo.

16/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

Es mejor pasar objetos a las hojas de estilo utilizando XsltArgumentList que utilizar
scripts incrustados en las hojas de estilo. Las ventajas ms importantes son:

- Mejor encapsulacin y reutilizacin de las clases.


- Permite que las pginas de estilo sean menores y ms fciles de mantener.
- Permite invocar mtodos de clases que pertenezcan a otros namespace que no
sean los derivados de System.
- Permite pasar a la pgina de estilos fragmentos de nodo, mediante
XPathNavigator.

Parmetros XSLT.
Los parmetros XSLT son objetos que se pueden aadir a la lista de argumentos
XsltArgumentList utilizando el mtodo AddParam. Los parmetros han de tener un
nombre y una URI de namespace asociados, adems su tipo ha de corresponder con un
tipo definido en el estndar XPath del W3C.

Los pasos a seguir para utilizar un parmetro XSLT son:

1. Crear un objeto de la clase XsltArgumentList.


2. Aadirle el o los parmetros deseados utilizando el mtodo AddParam de la clase
XsltArgument.
3. Modificar la hoja de estilos para que utilice los parmetros.
4. Pasar el objeto XsltArgumentList al mtodo Transform.

Como ejemplo se va a aadir a la aplicacin EjemploXSLT un botn de comando de


ttulo XSLTArgument de tal modo que al pulsarlo se realice la transformacin XSLT de
la pgina libros.xml utilizando la hoja de estilos librosxsltarg.xsl y generando
librosxsltarg.html.

La hoja de estilos librosxsltarg.xsl es:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Parmetro que se recibir de la invocacin al mtodo Transform -
->
<xsl:param name="CabeceraLibro"/>
<!-- Esta primera parte define la estructura del documento
transformado -->
<!-- La lnea siguiente busca el nodo raz del documento -->
<xsl:template match="/">
<!--Lo que sigue, hasta el siguiente comentario, aparecer
literalmente-->
<html>
<head>
<title>Prueba xsl</title>
</head>
<body>
<!-- La lnea siguiente pide que se apliquen las
plantillas -->
<!-- Las plantillas que se indican mas abajo son las
que se aplican -->
<!-- Se comienza por el elemento mas cercano a la
raz, que es-->

17/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

<!--biblioteca-->
<xsl:apply-templates />
</body>
</html>
</xsl:template>

<!--A partir de aqu se indican las plantillas que se aplicaran-


->
<xsl:template match="biblioteca">
<!-- La plantilla biblioteca solo pide aplicar la plantilla
libro -->
<xsl:apply-templates select="libro" />
</xsl:template>
<!-- La plantilla libro muestra el valor de ciertos elementos-->
<!-- (ISBN, titulo, precio) de cada libro-->
<!-- Adems inserta texto y algn otro elemento valido en HTML--
>
<xsl:template match="libro">
<xsl:value-of select="$CabeceraLibro"/>
<br></br>
ISBN:
<xsl:value-of select="@ISBN" />
<br></br>
Titulo:
<xsl:value-of select="titulo" />
<br></br>
Precio:
<xsl:value-of select="precio" />
<br></br>
<text></text>
</xsl:template>
</xsl:stylesheet>

Las lneas ms importantes estn resaltadas en negrita:

<xsl:param name="CabeceraLibro"/>
Esta lnea indica que la hoja de estilos recibir un parmetro al ser utilizada y que se
llama CabeceraLibro.

<xsl:value-of select="$CabeceraLibro"/>
Al procesar la hoja de estilos, esta lnea ser sustituida por el valor del parmetro
CabeceraLibro.

El cdigo del mtodo manejador del evento Click sobre el botn XSLTArgument
(button3_Click) es:

private void button3_Click(object sender, System.EventArgs e)


{
//Creacin de una instancia del parser XSLT
XslTransform xslt = new XslTransform();

//Carga de la pgina xsl en la que se basar la transformacin


xslt.Load("..\\..\\librosxsltarg.xsl");

//Creacin de un objeto XPathDocument al que se asociar el


//documento xml a transformar
XPathDocument docxml = new
XPathDocument("..\\..\\libros.xml");

18/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

//creacin de un flujo de salida asociado al fichero


//librosxsltresul.html
XmlTextWriter escritor = new
XmlTextWriter("..\\..\\librosxsltarg.html",
System.Text.Encoding.UTF8);

//La salida ser formateada, con tabulaciones.


escritor.Formatting=Formatting.Indented;

//Creacin de un objeto XsltArgumentList.


XsltArgumentList argsxslt = new XsltArgumentList();

//Creacin del string que se pasar como parmetro


//y adicin a argsxslt.
string textoCabecera = "***Datos del Libro***";
argsxslt.AddParam("CabeceraLibro","EjemploXSLTArgs",textoCabecer
a);

//Invocacin al mtodo Transform del parser XSLT para realizar


//la transformacin basada en libros.xsl. El resultado de la
//transformacin se enviar al flujo escritor, es decir, al
//fichero librosxsltresul.html
xslt.Transform(docxml, argsxslt, escritor);

//Invocacin al mtodo Transform. Es igual que la anterior,


//con la salvedad de que el resultado se enva a un flujo
//de tipo XmlReader para poder ser ledo y asignado a textBox2
XmlReader lector = xslt.Transform(docxml, argsxslt);
lector.Read();
textBox2.Text = lector.ReadInnerXml();
escritor.Close();
}

En este cdigo, similar al de los otros dos botones del ejemplo, cabe destacar las lneas
en negrita:

//Creacin de un objeto XsltArgumentList.


XsltArgumentList argsxslt = new XsltArgumentList();

//Creacin del string que se pasar como parmetro


//y adicin a argsxslt.
string textoCabecera = "***Datos del Libro***";
argsxslt.AddParam("CabeceraLibro","",textoCabecera);

//Invocacin al mtodo Transform del parser XSLT para realizar


//la transformacin basada en libros.xsl. El resultado de la
//transformacin se enviar al flujo escritor, es decir, al
//fichero librosxsltresul.html
xslt.Transform(docxml, argsxslt, escritor);

//Invocacin al mtodo Transform. Es igual que la anterior,


//con la salvedad de que el resultado se enva a un flujo
//de tipo XmlReader para poder ser ledo y asignado a textBox2
XmlReader lector = xslt.Transform(docxml, argsxslt);

La primera crea un objeto para contener los argumentos a pasar a la transformacin


cuando se invoque al mtodo Transform, lo cual se hace en las dos ltimas lneas (ver
segundo argumento, argsxslt).

19/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

La tercera lnea:

argsxslt.AddParam("CabeceraLibro","EjemploXSLTArgs",textoCabecera);

configura y aade un argumento a la lista de argumentos argxslt-. Para ello utiliza la


funcin AddParam de XsltArgumentList. El primer argumento es el nombre que
recibir el parmetro en la hoja XSL. El segundo argumento es una URI que identifica
unvocamente al parmetro. Como se ve, puede no utilizarse. El tercer argumento es el
valor del parmetro que se pasa a la hoja de estilos XSL.

El resultado de pulsar el botn XSLTArgumentList es:

Figura 26.8. Resultado de pulsar XSLTArgumentList.

Si se observa el fichero librosxsltarg.html se podr apreciar el resultado de la


transformacin.

20/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

Figura 26.9. librosxsltarg.html.

Objetos de Extensin XSLT.


Un objeto de extensin es similar a un parmetro normal. La diferencia radica en que un
objeto de extensin representa un objeto de una clase que contiene mtodos que se van a
invocar desde la pgina XSL. En cambio, un parmetro representa un valor.

Para aadir un objeto de extensin a un objeto de la clase XsltArgumentList ha de


utilizarse el mtodo AddExtensionObject (en lugar del mtodo AddParam que se
utiliza para aadir un parmetro).

El mtodo AddExtensionObject admite dos parmetros:

- El primero es de tipo string y ha de ser una URI correspondiente a un


namespace XML. Es el namespace que se utilizar en la hoja de estilos para

21/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

referenciar al objeto de extensin. Es obligatorio utilizar un namespace XML


para identificar al objeto de extensin porque si no se producir un error durante
la transformacin.
- El segundo es una referencia al objeto de extensin.

A continuacin, como ejemplo, se va a modificar la aplicacin EjemploXSLT haciendo


que al pulsar el botn XSLTArgumentList se aada tambin a la lista de argumentos a
pasar a Transform un objeto de extensin. Este objeto es de la clase
FormateadorLibro,que tendr un mtodo MostrarPieLibro, que devolver el string
Fin de datos del Libro.

La clase FormateadorLibro es:

public class FormateadorLibro


{
public string MostrarPieLibro()
{
return "Fin de datos del Libro";
}
}

El mtodo de respuesta al evento Click sobre button3 es:

private void button3_Click(object sender, System.EventArgs e)


{


//Creacin de un objeto XsltArgumentList.
XsltArgumentList argsxslt = new XsltArgumentList();

//Creacin de un objeto de extensin


FormateadorLibro objfor = new FormateadorLibro();

//Adicin del objeto objfor a argsxslt


argsxslt.AddExtensionObject("urn:FormateoLibros", objfor);

Nota: Se indican en negrita las lneas aadidas.

Puesto que desde la hoja de estilos librosxsltarg.xsl se ha de invocar el mtodo del


objeto de extensin aadido, est quedar como sigue -se indican en negrita las lneas
aadidas-:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:MiObjFormateo="urn:FormateoLibros">
<!-- Parmetro que se recibir de la invocacin al mtodo Transform -
->
<xsl:param name="CabeceraLibro"/>
<!-- Esta primera parte define la estructura del documento
transformado -->
<!-- La lnea siguiente busca el nodo raz del documento -->
<xsl:template match="/">

22/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

<!--Lo que sigue, hasta el siguiente comentario, aparecer


literalmente-->
<html>
<head>
<title>Prueba xsl</title>
</head>
<body>
<!-- La lnea siguiente pide que se apliquen las
plantillas -->
<!-- Las plantillas que se indican mas abajo son las
que se aplican -->
<!-- Se comienza por el elemento mas cercano a la
raz, que es-->
<!--biblioteca-->
<xsl:apply-templates />
</body>
</html>
</xsl:template>

<!--A partir de aqu se indican las plantillas que se aplicaran-


->
<xsl:template match="biblioteca">
<!-- La plantilla biblioteca solo pide aplicar la plantilla
libro -->
<xsl:apply-templates select="libro" />
</xsl:template>
<!-- La plantilla libro muestra el valor de ciertos elementos-->
<!-- (ISBN, titulo, precio) de cada libro-->
<!-- Adems inserta texto y algn otro elemento valido en HTML--
>
<xsl:template match="libro">
<xsl:value-of select="$CabeceraLibro"/>
<br></br>
ISBN:
<xsl:value-of select="@ISBN" />
<br></br>
Titulo:
<xsl:value-of select="titulo" />
<br></br>
Precio:
<xsl:value-of select="precio" />
<br></br>
<xsl:value-of select="MiObjFormateo:MostrarPieLibro()"/>
<br></br>
<text></text>
</xsl:template>
</xsl:stylesheet>

La primera lnea aadida:

xmlns:MiObjFormateo="urn:FormateoLibros">

declara el namespace XML asociado al objeto de extensin y el nombre con el que se


utilizar en la hoja de estilos MiObjFormateo.

La ltima lnea aadida:

<xsl:value-of select="MiObjFormateo:MostrarPieLibro()"/>

23/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

invoca al mtodo MostrarPieLibro y aade su resultado a la transformacin, que ha de


pertenecer al objeto de extensin representado por MiObjFormateo. En este caso es
objfor, de la clase FormateadorLibro.

"MiObjFormateo:MostrarPieLibro()"

equivale a

objfor.MostrarPieLibro()

Al ejecutar la aplicacin y pulsar el botn XSLTArgumentList se obtiene la siguiente


pantalla:

Figura 26.10. Resultado de pulsar XSLTArgumentList.

Y, si se observa el fichero librosxsltarg.html se ver que los pies de los libros han
sido incluidos.

24/25
Marco Besteiro y Miguel Rodrguez XSLT.NET

Figura 26.11. librosxsltarg.html. La ejecucin del mtodo MostrarPieLibro, de la


clase FormateadorLibro, ha aadido los pies de los libros.

25/25

Potrebbero piacerti anche