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 ...