Transformaciones XSL

Convertir un documento XML en HTML utilizando XSLT

Fecha: 03/Nov/2004 (2/11/2004)
Autor: Victor Hugo Cordon ([email protected])

 


En este articulo explicaremos la forma de crear transformaciones sobre documentos XML. Para ello es necesario hablar de los lenguajes XSL que se han desarrollado debido a la necesidad de implementar un lenguaje de hojas de estilo basado en XML.

Existen 3 lenguajes XSL

Como primer punto vamos a crear un documento XML basado en la tabla productos de la base da datos Northwind. Para no entrar en temas de segurida ejecute este codigo en un formulario de windows forms.

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim StringConnection As String
  StringConnection = "Data Source=LOCALHOST;Initial " & _
     "Catalog=Northwind;Integrated Security=SSPI"
  Dim cnNorthwind As New SqlConnection(StringConnection)
  Dim sSQL As String = "select * from products"
  Dim daProducts As New SqlDataAdapter(sSQL, cnNorthwind)
  Dim dsNorthwind As New DataSet()
  daProducts.Fill(dsNorthwind)
  'Creamos el archivo XM
  dsNorthwind.WriteXml("c:\MisProductos.xml")
End Sub
 
A continuaci�n vamos a crear un nuevo proyecto webforms y vamos a agregar al proyecto el documento MisProductos.xml que acabamos de crear.

Utilizando el editor Notepad vamos a crear un documento de nombre MiEstilo.xslt con el siguiente encabezado. Todos los documentos de esctilo XSLT deben iniciar con el mismo encabezado. 

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

      ......................

</xsl:stylesheet>

Seguidamente vamos a ingresar el documento MiEstilo.xslt a nuestro proyecto

Como siguiente paso vamos a crear una nueva forma web y agregar un control XML y fijar las siguientes propiedades

DocumentSource="MisProductos.xml"
TransformSource="MiEstilo.xslt"

Completemos el documento MiEstilo.xslt con el siguiente codigo.  Mas adelante te explicare detalladamente los comandos del lenguaje XSLT asi que no te preocupes. Simplemente completa el siguiente codigo y ejecuta la pagina web donde colocasta el control XML y listo. Veras un HTML mostrando una lista de precios de la tabla productos.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Mis Productos</h2>
<table border="1">
<tr bgcolorYelow">
<th align="left">Producto</th>
<th align="left">Precio Unitario</th>
</tr>
 <xsl:for-each select="NewDataSet/Table">
 <tr>
<td><xsl:value-of select="ProductName"/></td>
<td><xsl:value-of select="UnitPrice"/></td>
 </tr>
</xsl:for-each>
</table>
 </body>
</html>
</xsl:template>
</xsl:stylesheet>

Comandos Basicos de XSLT.

<xsl:template>

Tomando en cuenta que la estructura de un archivo XML es de tipo Arbol con nodos y subnodos similar a un sistema de ficheros podemos decir que la etiqueta template permite asociar una plantilla con cierta rama del documento XML mediante el atributo match. En el ejemplo <xsl:template match="/"> se refiere al nodo ra�z, es decir a todo el documento.

<xsl:value-of>

Podemos hacer referencia a una etiqueta XML y agregarla al archivo de salida de la transformaci�n mediante esta etiqueta xsl. Es necesario auxiliarse de un instrucci�n xpath para recuperar el valor especifico (select="ProductName").Para accesar a otras etiquetas que est�n en otras ramas se navega como en un sistema de ficheros donde una diagonal vertical delantera (/) selecciona subdirectorios. En el ejemplo anterior <xsl:value-of select="ProductName">

<xsl:for-each>

Se utiliza, junto a una instruccion select de xpath, para recorrer todos los elementos (registros) del nodo XML especificado. As� en el ejemplo <xsl:for-each select="NewDataSet/Table">

Si estas trabajando con Internte Explorer 6 puedes utilizar los siguientes comandos
 
<xsl:sort>

Te permite ordenar el archivo de salida por medio de una instrucci�n select de xpath. Asi en nuestro ejemplo para ordenar el archivo por el nombre del producto deber�as de incluir una instrucci�n como se muestra a continuaci�n

     <?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Mis Productos</h2>
<table border="1">
<tr bgcolorYelow">
<th align="left">Producto</th>
<th align="left">Precio Unitario</th>
</tr>
 <xsl:for-each select="NewDataSet/Table">
 <xsl:sort select="ProductName"/>
 <tr>
<td><xsl:value-of select="ProductName"/></td>
<td><xsl:value-of select="UnitPrice"/></td>
 </tr>
</xsl:for-each>
</table>
 </body>
</html>
</xsl:template>
</xsl:stylesheet>

Como no podia faltar, tambien es polible usar sentecias condicionales

</xsl:if>

Podemos condicionar para mostrar solo aquellos registros que satisfagan con una condici�n dada. Como este es un lenguaje de etiquetas los operadores menor y mayor ( < > ) deben utilizar otra simbolog�a. As� para el operador mayor que usamos &gt; (greater to) y para el operador menor usamos &lt; (lower than). Tambi�n usamos una instrucci�n xpath test. Veamos nuestro c�digo. A diferencia de otros lenguajes no existe una instrucci�n else para el if.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Mis Productos</h2>
<table border="1">
<tr bgcolorYelow">
<th align="left">Producto</th>
<th align="left">Precio Unitario</th>
</tr>
 <xsl:for-each select="NewDataSet/Table">
 <xsl:if test="UnitPrice &gt;50">
 <tr>
<td><xsl:value-of select="ProductName"/></td>
<td><xsl:value-of select="UnitPrice"/></td>
 </tr>
</xsl:if>
</xsl:for-each>
</table>
 </body>
</html>
</xsl:template>
</xsl:stylesheet>
 

Si lo que necesitas es una sentencia condicional m�ltiple deber�as intentar

<xsl:choose>

Indica el inicio de una instrucci�n condicional. Puedes utilizar varias etiquetas when acompa�adas de la instrucci�n xpath test para especificar una condici�n. Adem�s puedes elegir al final una instrucci�n <xsl:otherwise> para referirte al resto de registros que no cumplen ninguna condici�n.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Mis Productos</h2>
<table border="1">
<tr bgcolorYelow">
<th align="left">Producto</th>
<th align="left">Precio Unitario</th>
</tr>
<xsl:for-each select="NewDataSet/Table">
   <xsl:choose>
 <xsl:when test="UnitPrice &gt;50">
 <tr>
<td><xsl:value-of select="ProductName"/></td>
<td><xsl:value-of select="UnitPrice"/></td>
 </tr>
</xsl:when>
     <xsl:otherwise>
     <tr>
     <td><xsl:value-of select="ProductName"/></td>
     <td><xsl:value-of select="UnitPrice"/></td>
     </tr>
     </xsl:otherwise>
   </xsl:choose>
</xsl:for-each>
</table>

</body>

</html>
</xsl:template>
</xsl:stylesheet>

Hasta la vista ...


ir al ndice