XSLT (siglas de Extensible Stylesheet Language Transformations, «Transformaciones del Lenguaje Extensible de Hojas de Estilo») es un lenguaje de programación declarativo desarrollado por el World Wide Web Consortium (W3C) para transformar documentos XML. Mediante una hoja de estilo XSLT es posible convertir un documento XML en otro documento XML, HTML, XHTML, texto plano u otros formatos.
XSLT forma parte de la familia de tecnologías XSL y está estrechamente relacionado con XPath, lenguaje utilizado para seleccionar y procesar nodos y valores dentro de documentos XML. Las versiones modernas de XSLT utilizan el modelo de datos XDM (XQuery and XPath Data Model) y comparten numerosas funciones y tipos de datos con XPath y XQuery.
Una de las características principales de XSLT es su modelo de procesamiento basado en plantillas. Una hoja de estilo contiene reglas que determinan cómo deben procesarse determinados nodos del documento de entrada. Esto permite describir las transformaciones principalmente en función de la estructura y el contenido de los documentos, en lugar de especificar únicamente una secuencia de instrucciones.
XSLT se utiliza, entre otros ámbitos, en sistemas de publicación, documentación técnica, procesamiento y conversión de documentos, generación de páginas web, transformación entre diferentes vocabularios XML y procesamiento de metadatos.
Historia
XSLT surgió durante el desarrollo de XSL, un lenguaje concebido por el W3C para el procesamiento y la presentación de documentos XML. Durante su desarrollo se separaron dos funciones diferentes: la transformación de la estructura de los documentos y la descripción de su presentación.
La transformación dio lugar a XSLT, mientras que para la composición de documentos paginados se desarrolló XSL Formatting Objects (XSL-FO).
XSLT 1.0 fue publicado como recomendación del W3C el 16 de noviembre de 1999. Esta versión utiliza XPath 1.0 y estableció elementos fundamentales del lenguaje como las plantillas, los patrones de correspondencia, las variables y parámetros y la aplicación recursiva de reglas.
XSLT 2.0 se convirtió en recomendación del W3C el 23 de enero de 2007. Introdujo, entre otras características, secuencias, un sistema de tipos más amplio, expresiones regulares, agrupación, funciones definidas por el usuario y la posibilidad de generar varios documentos de salida.
En marzo de 2021 el W3C publicó una segunda edición de la especificación de XSLT 2.0.
XSLT 3.0 fue publicado como recomendación del W3C el 8 de junio de 2017. Esta versión incorporó mecanismos para el procesamiento mediante streaming, paquetes, acumuladores, tratamiento avanzado de errores y nuevas características relacionadas con la programación funcional.
Modelo de procesamiento
Una transformación XSLT utiliza normalmente un documento XML como entrada y una hoja de estilo XSLT que contiene las reglas de transformación. Ambos son procesados por un procesador XSLT, que genera uno o varios resultados.
De forma simplificada:
Documento XML + hoja de estilo XSLT ↓ Procesador XSLT ↓ XML, HTML, texto, etc.
Por ejemplo, el siguiente documento XML contiene información sobre libros:
<biblioteca> <libro> <titulo>Don Quijote de la Mancha</titulo> <autor>Miguel de Cervantes</autor> <precio>24.90</precio> </libro> <libro> <titulo>La sombra del viento</titulo> <autor>Carlos Ruiz Zafón</autor> <precio>19.50</precio> </libro> </biblioteca>
Una hoja de estilo XSLT puede transformar estos datos en HTML:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/"> <html> <head> <title>Catálogo de libros</title> </head> <body> <h1>Catálogo de libros</h1> <xsl:apply-templates select="biblioteca/libro"/> </body> </html> </xsl:template>
<xsl:template match="libro"> <article> <h2> <xsl:value-of select="titulo"/> </h2> <p> Autor: <xsl:value-of select="autor"/> </p> </article> </xsl:template>
</xsl:stylesheet>
El resultado contiene una representación HTML de los datos originales.
Hojas de estilo
Las hojas de estilo XSLT se expresan normalmente mediante XML. Los elementos pertenecientes al lenguaje XSLT utilizan el espacio de nombres:
http://www.w3.org/1999/XSL/Transform
Una hoja de estilo suele comenzar, por ejemplo, con:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> ... </xsl:stylesheet>
El atributo version indica la versión de XSLT para la que se ha escrito la hoja de estilo.
Plantillas
El mecanismo central de XSLT está constituido por las plantillas (templates). Una plantilla puede indicar cómo debe procesarse un determinado tipo de nodo.
Por ejemplo:
<xsl:template match="titulo"> <h1> <xsl:apply-templates/> </h1> </xsl:template>
La plantilla establece que cada elemento titulo seleccionado debe generar un elemento HTML h1.
El atributo match contiene un patrón que determina los nodos a los que se aplica la plantilla.
Las plantillas pueden invocar el procesamiento de otros nodos mediante xsl:apply-templates:
<xsl:apply-templates select="capitulo/seccion"/>
El procesador busca entonces las plantillas adecuadas para los elementos seccion seleccionados.
Este mecanismo facilita el procesamiento recursivo de estructuras jerárquicas, una característica habitual de los documentos XML.
XPath
XSLT utiliza XPath para seleccionar nodos, calcular valores, realizar comparaciones y expresar condiciones.
Por ejemplo:
<xsl:value-of select="libro/titulo"/>
selecciona el elemento titulo contenido en libro.
Una expresión más compleja puede seleccionar solamente los libros cuyo precio sea superior a 20:
libro[precio > 20]/titulo
XPath también permite utilizar funciones y realizar cálculos. Por ejemplo:
count(biblioteca/libro)
devuelve el número de elementos libro.
Las capacidades de XPath aumentaron considerablemente a partir de XPath 2.0. XPath 3.1 incorporó, entre otras características, mapas y arrays.
Variables y parámetros
XSLT permite declarar variables mediante xsl:variable:
<xsl:variable name="iva" select="0.21"/>
La variable puede utilizarse posteriormente en una expresión:
<xsl:value-of select="precio * (1 + $iva)"/>
Los parámetros se declaran mediante xsl:param. Pueden utilizarse para proporcionar valores desde el exterior de la transformación o para transmitir información entre plantillas y funciones.
<xsl:param name="idioma" select="'es'"/>
Condiciones
XSLT permite realizar procesamiento condicional mediante xsl:if:
<xsl:if test="precio > 20"> <p>Libro de precio superior a 20 euros</p> </xsl:if>
Para seleccionar entre varias alternativas puede utilizarse xsl:choose:
<xsl:choose> <xsl:when test="precio >= 30"> <categoria>precio alto</categoria> </xsl:when> <xsl:when test="precio >= 15"> <categoria>precio medio</categoria> </xsl:when> <xsl:otherwise> <categoria>precio bajo</categoria> </xsl:otherwise> </xsl:choose>
Iteración
Además del procesamiento basado en plantillas, XSLT permite recorrer explícitamente una secuencia mediante xsl:for-each.
<xsl:for-each select="biblioteca/libro"> <p> <xsl:value-of select="titulo"/> </p> </xsl:for-each>
En numerosos casos puede obtenerse un resultado equivalente mediante xsl:apply-templates. El procesamiento mediante plantillas permite separar las reglas correspondientes a los diferentes elementos del documento.
Ordenación
La instrucción xsl:sort permite controlar el orden en que se procesan los elementos.
Por ejemplo, los libros pueden ordenarse alfabéticamente por título:
<xsl:apply-templates select="biblioteca/libro"> <xsl:sort select="titulo"/> </xsl:apply-templates>
También pueden ordenarse numéricamente:
<xsl:apply-templates select="biblioteca/libro"> <xsl:sort select="precio" data-type="number"/> </xsl:apply-templates>
Agrupación
XSLT 2.0 introdujo xsl:for-each-group, que proporciona mecanismos específicos para agrupar elementos.
Por ejemplo, una colección de libros puede agruparse por año de publicación:
<xsl:for-each-group select="libro" group-by="anio"> <h2> <xsl:value-of select="current-grouping-key()"/> </h2>
<xsl:for-each select="current-group()"> <p> <xsl:value-of select="titulo"/> </p> </xsl:for-each> </xsl:for-each-group>
Modos
Los modos permiten procesar un mismo nodo de distintas maneras.
Un documento que contiene capítulos puede utilizar los mismos elementos una vez para generar el contenido principal y otra para generar un índice.
Por ejemplo:
<xsl:apply-templates select="capitulo" mode="indice"/>
La plantilla correspondiente puede definirse como:
<xsl:template match="capitulo" mode="indice"> <li> <xsl:value-of select="titulo"/> </li> </xsl:template>
Otra plantilla puede procesar el mismo elemento capitulo para producir su contenido completo.
Funciones
XSLT utiliza la biblioteca de funciones de XPath y permite además definir funciones propias.
Desde XSLT 2.0 pueden declararse mediante xsl:function:
<xsl:function name="local:precio-con-iva" xmlns:local="urn:funciones"> <xsl:param name="precio"/> <xsl:sequence select="$precio * 1.21"/> </xsl:function>
La función puede utilizarse posteriormente en una expresión:
<xsl:value-of select="local:precio-con-iva(precio)"/>
XSLT 3.0 amplió las posibilidades de programación funcional e incorporó funciones de orden superior.
Tipos de datos
XSLT 1.0 utiliza el sistema de tipos de XPath 1.0. A partir de XSLT 2.0 se utiliza un modelo de datos considerablemente más amplio basado en XDM y relacionado con los tipos definidos por XML Schema.
Por ejemplo, puede declararse explícitamente una fecha:
<xsl:variable name="fecha-publicacion" as="xs:date" select="xs:date('2026-09-23')" xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
También pueden especificarse tipos para parámetros, variables, funciones y valores devueltos.
Generación de varios documentos
XSLT 2.0 introdujo xsl:result-document, que permite generar varios documentos durante una misma transformación.
Por ejemplo:
<xsl:for-each select="biblioteca/libro"> <xsl:result-document href="{position()}.html"> <html> <body> <h1> <xsl:value-of select="titulo"/> </h1> <p> <xsl:value-of select="autor"/> </p> </body> </html> </xsl:result-document> </xsl:for-each>
De esta forma una única fuente XML puede utilizarse para producir numerosos documentos de salida.
XSLT 1.0
XSLT 1.0 estableció gran parte del modelo básico del lenguaje. Entre sus características se encuentran:
procesamiento mediante plantillas; patrones de correspondencia; XPath 1.0; variables y parámetros; procesamiento condicional; iteración; ordenación; generación de XML, HTML y texto; acceso a documentos XML adicionales.
Debido a su amplia implementación, XSLT 1.0 continúa utilizándose en diferentes bibliotecas y sistemas.
XSLT 2.0
XSLT 2.0 amplió considerablemente las posibilidades del lenguaje. Entre sus características se encuentran:
XPath 2.0; secuencias; un sistema de tipos ampliado; expresiones regulares; agrupación mediante xsl:for-each-group; funciones definidas por el usuario; generación de varios documentos mediante xsl:result-document; mejoras en el procesamiento de cadenas, números, fechas y horas.
XPath 2.0 introdujo asimismo un modelo basado en secuencias y un sistema de tipos considerablemente más amplio que XPath 1.0.
XSLT 3.0
XSLT 3.0 amplía XSLT 2.0 e incorpora diferentes mecanismos destinados a transformaciones de mayor tamaño y complejidad.
Entre sus características se encuentran:
paquetes; streaming; acumuladores; funciones de orden superior; mapas; mecanismos avanzados para el tratamiento de errores; nuevas posibilidades para modularizar hojas de estilo.
Los paquetes permiten dividir aplicaciones XSLT de gran tamaño en componentes independientes y controlar qué componentes son visibles desde otros paquetes.