[Apuntes] Lenguajes de marcas: XSLT

Miguel Menéndez

XSLT (eXtensible StyleSheet Language Transformations) es un lenguaje para hacer transformaciones de documentos XML.

XSLT es un lenguaje declarativo (funcional), se dice qué transformaciones se desean y no cómo se llevan a cabo.

El archivo XSLT debe estar situado en la misma ubicación (directorio o URI) que el archivo de datos XML.

Para enlazar hojas de estilo XSLT en el archivo XML:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="fichero-de-transformacion.xsl" ?>

<!-- o -->

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/css" href="mathstyles.css" ?>
<?xml-stylesheet type="text/css" href="textstyles.css" ?>

Estructura de una hoja de estilo XSLT

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
</xsl:stylesheet>

<!-- o -->

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
  </xsl:template>
</xsl:stylesheet>

La instrucción <xsl:template> es una plantilla. El atributo match indica los elementos afectados por la plantilla y contiene un patrón XPath, en este caso el patrón XPath indica que los elementos a los que se aplicará la plantilla (transformación) serán todos los nodos desde la raíz.

Hay transformaciones que tienen un comportamiento especial:

  1. Si una hoja de transformaciones no contiene plantillas (templates) el contenido textual del documento XML se envía directamente a la salida, omitiéndose los valores de los atributos, comentarios e instrucciones de procesamiento.

  2. Si una hoja de transformaciones sólo tiene una plantilla asociada al nodo raíz del documento XML pero sin contenido, no se envía nada a la salida (en el navegador, pantalla en blanco).

  3. Si la hoja de transformaciones no tiene una plantilla asociada al nodo raíz pero sí otras asociadas a otros elementos, se va recorriendo el árbol del documento XML y enviando el contenido textual a la salida y, cuando se encuentra un elemento con una plantilla asociada, se aplican las reglas definidas en la plantilla.

  4. En general, si la hoja de transformaciones tiene alguna plantilla, se va recorriendo el árbol del documento XML en el orden en el que está escrito y, en el momento en que aparece alguna plantilla cuya expresión (atributo match) coincide con el elemento en el que nos encontramos, se le aplica la transformación que indique la plantilla. Si hubiera una plantilla vacía (sin acciones en su interior), el elemento al que afectara la plantilla y sus descendientes no se visualizarían.

  5. El procesador XSLT sólo aplica una plantilla a cada nodo. Si tenemos dos plantillas para el mismo nodo, el procesador sólo aplica la última definida.

Elemento <xsl:value-of>

La instrucción <xsl:value-of> extrae el contenido del nodo seleccionado.

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="libro">
    <xsl:value-of select="autor" />
  </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="autor">
    <xsl:value-of select="." />
  </xsl:template>
</xsl:stylesheet>

También se pueden extraer los valores de los atributos utilizando @:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="fechaPublicacion">
    <xsl:value-of select="@año" />
  </xsl:template>
</xsl:stylesheet>

Se puede generar texto escribiéndolo en la plantilla, por ejemplo, código HTML:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="libro">
    <p><xsl:value-of select="autor" /></p>
  </xsl:template>
</xsl:stylesheet>

Dentro de la plantilla podemos hacer referencia a varios subnodos:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="libro">
    <p><xsl:value-of select="autor"/></p>
    <p><xsl:value-of select="titulo"/></p>
  </xsl:template>
</xsl:stylesheet>

Elemento <xsl:text>

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <p>Prueba</p>
    <xsl:text>&#10;</xsl:text>
    <p>Prueba</p>
  </xsl:template>
</xsl:stylesheet>

La instrucción <xsl:text> permite generar texto que no puede generarse simplemente añadiéndolo como en los ejemplos anteriores. Por ejemplo, para generar un salto de línea en el resultado añadiendo la entidad de carácter &#10;.

Elemento <xsl:attribute>

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="licencia">
    <img>
      <xsl:attribute name="src">
        <xsl:value-of select="imagen" />
      </xsl:attribute>
    </img>
  </xsl:template>
</xsl:stylesheet>

La instrucción <xsl:attribute> permite generar un atributo y su valor. Se utiliza cuando el valor del atributo se obtiene a su vez de algún nodo.

===== Ver los apuntes para el resto de elementos =====

Comentarios

¿Has encontrado un error? ¿Crees que algo podría mejorarse? No dudes en comentármelo y estaré encantado de echarle un vistazo.