Transformaciones XSL

Convertir un documento XML en HTML utilizando XSLT

Fecha: 03/Nov/2004 (2/11/2004)
Autor: Victor Hugo Cordon (victor.cordon@integra.com.sv)

 


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