Transformaciones XSL Convertir un documento XML en HTML utilizando XSLT Fecha: 03/Nov/2004 (2/11/2004)
|
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
- XSLT: Es un lenguaje para transformar documentos XML
- XPATH: Es un lenguaje para definir partes de un documento XML
- XSL-FO: Es un lenguaje para formatear documentos XML
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.
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: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">
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 > (greater to) y para el operador menor usamos < (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.
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 >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 ...