Escolar Documentos
Profissional Documentos
Cultura Documentos
Este documento muestra como usar XSLT para transformar documentos XML a otros formatos (como transformar XML en HTML).
Ejemplo XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Inténtalo tú mismo »
HTML
XML
Lenguajes XSL(T)
XSLT es un lenguaje para transformar documentos XML.
XSL
XSL viene de EXtensible Stylesheet Language.
El World Wide Web Consortium (W3C) empezó a desarrollar XSL debido a la necesidad de un lenguaje de estilos basado en XML.
Por ejemplo, un elemento <table>, podría indicar una tabla HTML, representar un mueble, o cualquier significado que se le quiera otorgar en XML,
sin que los navegadores conozcan a priori como mostrarlo. XSL describe como los elementos XML deben mostrarse.
Qué es XSLT?
XSLT se utiliza para transformar un documento XML en otro documento XML, u otro tipo de documento reconocido por un navegador, como XHTML o
HTML. Normalmente XSLT realiza transformaciones de cada elemento XML en un elemento (X)HTML.
Con XSLT, se pueden añadir o borrar elementos y atributos dando como resultado un nuevo fichero de salida. También pueden reorganizarse y
ordenarse elementos, evaluar condiciones y tomar decisiones de procesamiento acerca de que elementos ocultar y mostrar.
Una manera habitual de describir una transformación XSLT es decir que una transformación XSLT transforma un árbol fuente XML en un árbol
resultado XML.
Cómo funciona?
Durante el proceso de transformación, XSLT utiliza XPath para definir partes del documento fuente que deben coincidir con una o más de las plantillas
que se hayan predefinido. Cuando se encuentra una coincidencia, XSL transforma la parte coincidente del documento fuente en su resultado en el
documento resultante de la transformación.
Nota: <xsl:stylesheet> y <xsl:transform> son sinónimos y puede utilizarse cualquiera de los dos.
La manera correcta de declarar una hoja de estilos de acuerdo a la recomendación XSLT del W3C es la siguiente:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
o bien:
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Para acceder a los elementos XSLT, atributos y funcionalidades se debe declarar el namespace de XSLT al principio del documento.
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" apunta al namespace oficial XSLT del W3C. Si se utiliza este namespace, también debe
incluirse el atributo version="1.0".
Ver "cdcatalog.xml"
A continuación, se crea una hoja de estilo XSL (XSL Style Sheet) llamada "cdcatalog.xsl" con una plantilla de transformación:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Ver "cdcatalog.xsl"
Un navegador compatible con XSLT transformará el contenido del documento XML en XHTML.
Ver el resultado
Una plantilla contiene reglas a aplicar cuando se encuentra un nodo en particular durante la transformación.
El atributo match se utiliza para asociar una plantilla con un elemento XML. El atributo match también puede ser utilizado para definir una plantilla
para el documento XML completo. El valor del atributo match es una expresión XPath.(así, match="/" define el documento XML completo)
Ejemplo
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<tr>
<td>.</td>
<td>.</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Inténtalo tú mismo»
El siguiente elemnto, <xsl:stylesheet>, define que el cocumento es una XSLT style sheet (junto al número de versión y el atributo de namespace
XSLT)
El elemento <xsl:template> define una plantilla. El atributo match="/" asocia la plantilla con la raíz del documento XML fuente.
El contenido dentro del elemento <xsl:template> define HTML a escribir en la salida.
Las dos últimas líneas definen el final de la plantilla y el final de la hoja de estilo.
El resultado de este ejemplo es que no se copian datos desde el documento XML fuente a la salida. A continuación se expone cómo utilizar el
Example
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<tr>
<td><xsl:value-of select="catalog/cd/title"/></td>
<td><xsl:value-of select="catalog/cd/artist"/></td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Try it Yourself »
El resultado del ejemplo anterior es que una única línea de datos es copiada desde el documento XML a la salida.
A cotinuación se explica cómo utilizar el elemento <xsl:for-each> para iterar a través de los elementos XML, y mostrar todos los registros.
El elemento <xsl:for-each> puede ser utilizado para seleccionar todo elemento XML de un conjunto de nodos especificado.
Ejemplo
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Inténtalo tú mismo»
Filtrando la salida
Podemos también filtrar la salida de una transformación añadiendo un criterio(predicado XPath) al atributo select del elemento <xsl:for-each>
= (igual)
!= (distinto)
Ejemplo
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd[artist='Bob Dylan']">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Inténtalo tú mismo »
Para ordenar la salida, simplemente se añade un elemento vacío <xsl:sort> dentro del elemento <xsl:for-each> en el archivo XSL.
Ejemplo
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<xsl:sort select="artist"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Inténtalo tú mismo»
Nota: El atributo select indica sobre que elemento XML se realizará la ordenación.
Sintaxis
<xsl:if test="expression">
...Alguna expresión si la condición es verdadera...
</xsl:if>
Ejemplo
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
<th>Price</th>
</tr>
<xsl:for-each select="catalog/cd">
<xsl:if test="price > 10">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
<td><xsl:value-of select="price"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Inténtalo tú mismo »
Nota: El valor del atributo obligatorio test contiene la expresión(condición) a ser evaluada.
El código anterior sólo mostrará en la salida los elementos título y artista de los CDs con un precio mayor que 10.
Ejemplo
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<xsl:choose>
<xsl:when test="price > 10">
<td bgcolor="#ff00ff">
<xsl:value-of select="artist"/></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="artist"/></td>
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Intentálo tú mismo »
El código anterior añadirá un color de fondo rosa a la columna artista CUANDO(WHEN) el precio del CD sea mayor que 10.
Otro Ejemplo:
Ejemplo
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<xsl:choose>
<xsl:when test="price > 10">
<td bgcolor="#ff00ff">
<xsl:value-of select="artist"/></td>
</xsl:when>
<xsl:when test="price > 9">
<td bgcolor="#cccccc">
<xsl:value-of select="artist"/></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="artist"/></td>
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Intentálo tu mismo»
El código anterior añadirá un color de fondo a la columna "Artist" CUANDO(WHEN) el precio del CD es mayor de 10, y un color de fondo gris cuando el
precio del CD es mayor a 9 y menor o igual a 10.
Si añadimos un atributo select al elemento <xsl:apply-templates> procesará sólo los elementos hijo que coincidan con el valor del atributo. Podemos
usar el atributo select para especificar el orden en que los hijos serán procesados.
Example
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="cd">
<p>
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="artist"/>
</p>
</xsl:template>
<xsl:template match="title">
Title: <span style="color:#ff0000">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
<xsl:template match="artist">
Artist: <span style="color:#00ff00">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
</xsl:stylesheet>
Inténtalo tú mismo »