Introducción a XSLT

XSLT o EXtensible Stylesheet Language for Transformations es un lenguage de estilos que permite transformar un documento XML en otro documento XML o en otro tipo de documentos como HTML o XHTML.

Cada día se utiliza más XML para almacenar e intercambiar información por lo que es importante manejarse bien con este formato.

XSLT pertenece a la trilogía de XSL: XSLT, XPath y XSL-FO.

Las principales características que nos ofrece son:

  • Seleccionar solo los elementos o atributos que nos interesan.
  • Ordenar elementos.
  • Realizar comparaciones.
  • Establecer condiciones.

Así, partiendo de un único documento XML podemos obtener infinidad de documentos resultantes diferentes símplemente cambiando la hoja de estilos. Viene a ser como aplicar una hoja de estilos CSS a una página HTML para manipular la visualización pero en este caso lo que se manipula es la información.

Comencemos con un documento XML de ejemplo para poder hacer nuestras pruebas. Tomemos por ejemplo una base de datos para una tienda de pinturas donde registramos el color y el número de litros en almacén que llamaremos ‘pinturas.xml’:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl"
href="pinturas.xsl"?>
<almacen>
  <pintura>
    <color>rojo</color>
    <litros>20</litros>
  </pintura>
  <pintura>
    <color>azul</color>
    <litros>30</litros>
  </pintura>
  <pintura>
    <color>amarillo</color>
    <litros>18</litros>
  </pintura>
  <pintura>
    <color>verde</color>
    <litros>04</litros>
  </pintura>
</almacen>

En la segunda línea se ha incluido la referencia a la hoja de estilos. Ahora pasemos a los ejemplos. Podemos crear una hoja de estilos que nos muestre el listado de pinturas y los litros que quedan en un documento HTML:

<?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>Pinturas en almacén:</h2>
    <table border="1">
      <tr bgcolor="#000000">
        <th style="color:white;">Color</th>
        <th style="color:white;">Litros</th>
      </tr>
      <xsl:for-each select="almacen/pintura">
      <tr>
        <td><xsl:value-of select="color"/></td>
        <td><xsl:value-of select="litros"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>

En la línea 3 vemos la instrucción <xsl:template match=”/”> que indica que la hoja de estilos se aplica a todo el documento. En este código hay que destacar el uso de la función <xsl:for-each> que nos permite seleccionar todos los elementos que coincidan con el valor que establecemos en select. De esta manera obtenemos todas las pinturas del almacén.

Puede que queramos un listado de pinturas ordenado por la cantidad de litros disponibles:

<?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>Pinturas en almacén:</h2>
    <table border="1">
      <tr bgcolor="#000000">
        <th style="color:white;">Color</th>
        <th style="color:white;">Litros</th>
      </tr>
      <xsl:for-each select="almacen/pintura">
	  <xsl:sort select="litros"/>
      <tr>
        <td><xsl:value-of select="color"/></td>
        <td><xsl:value-of select="litros"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>

La instrucción <xsl:sort select=”litros”/> nos permite ordenar los elementos ‘pintura’ por su elemento ‘litros’ de menos a más. La ordenación es alfabética. Además de esto, puede que queramos que nos muestre los colores a los que les quedan menos de 10 litros. Podemos establecer condiciones de la siguiente manera:

<?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>Pinturas en almacén:</h2>
    <table border="1">
      <tr bgcolor="#000000">
        <th style="color:white;">Color</th>
        <th style="color:white;">Litros</th>
      </tr>
      <xsl:for-each select="almacen/pintura">
      <tr>
	<xsl:if test="litros &lt; 10">
        <td><xsl:value-of select="color"/></td>
        <td><xsl:value-of select="litros"/></td>
	</xsl:if>
      </tr>
      </xsl:for-each>
    </table>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>

La instrucción <xsl:if test=”litros < 10″> permite filtrar aquellas pinturas que tienen menos de 10 litros. < equivale a < y > equivale a >. La igualdad se expresa con el signo =. Hay que cerrar siempre con un </xsl:if> La instrucción if no nos permite establecer un else u otras condiciones. Para ello debemos usar <xsl:choose>. Si queremos que nos muestre todo el catálogo pero destacando las pinturas con pocas existencias debemos usar la una instrucción condicional múltiple como <xsl:choose>

<?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>Pinturas en almacén:</h2>
    <table border="1">
      <tr bgcolor="#000000">
        <th style="color:white;">Color</th>
        <th style="color:white;">Litros</th>
      </tr>
      <xsl:for-each select="almacen/pintura">
      <tr>
	<xsl:choose>
	<xsl:when test="litros &lt; 10">
	<td style="background-color:red;">
          <xsl:value-of select="color"/>
        </td>
	<td style="background-color:red;">
          <xsl:value-of select="litros"/></td>
	</xsl:when>
	<xsl:otherwise>
	<td><xsl:value-of select="color"/></td>
	<td><xsl:value-of select="litros"/></td>
	</xsl:otherwise>
	</xsl:choose>
      </tr>
      </xsl:for-each>
    </table>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>

Resumen de funciones:

<xsl:template match="/"> : Parte del documento a la que se aplica la plantilla.
<xsl:value-of select=""> : Obtener el valor de un elemento.
<xsl:for-each select=""> : Leer todos los elementos que coincidan con select.
<xsl:sort select=""> : Ordenar alfabéticamente todos los elementos que coincidan con select.
<xsl:if test=""> : Tomar elemento que cumpla la condición test.
<xsl:choose> : Condicional que actúa según varias condiciones test.
Sin categoría

Deja una respuesta