XSLT ( Extensible Stylesheet Language Transformations ) es un lenguaje diseñado originalmente para transformar documentos XML en otros documentos XML, [1] u otros formatos como HTML para páginas web , texto plano u objetos de formato XSL , que posteriormente pueden convertirse a otros formatos. como PDF , PostScript y PNG . [2] En actualizaciones posteriores de la especificación XSLT 1.0 se agregó compatibilidad con JSON y transformación de texto sin formato.
En agosto de 2022 [actualizar], la versión estable más reciente del lenguaje es XSLT 3.0, que alcanzó el estado de Recomendación en junio de 2017.
Las implementaciones XSLT 3.0 son compatibles con Java, .NET, C/C++, Python, PHP y NodeJS. También se puede alojar una biblioteca JavaScript XSLT 3.0 en el navegador web. Los navegadores web modernos también incluyen soporte nativo para XSLT 1.0. [3]
Para una transformación de documento XSLT, el documento original no se modifica; más bien, se crea un nuevo documento basado en el contenido de uno existente. [4] Normalmente, los documentos de entrada son archivos XML, pero se puede utilizar cualquier cosa a partir de la cual el procesador pueda construir un modelo de datos XQuery y XPath , como tablas de bases de datos relacionales o sistemas de información geográfica . [1]
Si bien XSLT se diseñó originalmente como un lenguaje de propósito especial para la transformación XML, el lenguaje es completo en Turing , lo que lo hace teóricamente capaz de realizar cálculos arbitrarios. [5]
XSLT está influenciado por lenguajes funcionales , [6] y por lenguajes de coincidencia de patrones basados en texto como SNOBOL y AWK . Su predecesor más directo es DSSSL , que hizo para SGML lo que XSLT hace para XML. [7]
El procesador XSLT toma uno o más documentos fuente XML, además de una o más hojas de estilo XSLT, y los procesa para producir uno o varios documentos de salida. [16] [17] A diferencia de los lenguajes de programación imperativos ampliamente implementados como C , XSLT es declarativo . [18] El paradigma de procesamiento básico es la coincidencia de patrones. [19] En lugar de enumerar una secuencia imperativa de acciones a realizar en un entorno con estado, las reglas de plantilla solo definen cómo manejar un nodo que coincida con un patrón similar a XPath particular, si el procesador encuentra uno, y el contenido de las plantillas. comprenden efectivamente expresiones funcionales que representan directamente su forma evaluada: el árbol de resultados, que es la base de la salida del procesador.
Un procesador típico se comporta de la siguiente manera. Primero, suponiendo que ya se haya leído y preparado una hoja de estilo, el procesador crea un árbol de fuentes a partir del documento XML de entrada. Luego procesa el nodo raíz del árbol de origen, encuentra la plantilla que mejor coincide para ese nodo en la hoja de estilo y evalúa el contenido de la plantilla. Las instrucciones de cada plantilla generalmente indican al procesador que cree nodos en el árbol de resultados o que procese más nodos en el árbol de origen de la misma manera que el nodo raíz. Finalmente, el árbol de resultados se serializa como texto XML o HTML.
XSLT utiliza XPath para identificar subconjuntos del árbol del documento fuente y realizar cálculos. XPath también proporciona una variedad de funciones , que el propio XSLT amplía aún más.
XSLT 1.0 usa XPath 1.0, mientras que XSLT 2.0 usa XPath 2.0. XSLT 3.0 funcionará con XPath 3.0 o 3.1. En el caso de 1.0 y 2.0, las especificaciones XSLT y XPath se publicaron en la misma fecha. Sin embargo, con la versión 3.0 ya no estaban sincronizados; XPath 3.0 se convirtió en Recomendación en abril de 2014, seguido de XPath 3.1 en febrero de 2017; XSLT 3.0 siguió en junio de 2017.
Las funcionalidades de XSLT se superponen con las de XQuery , que inicialmente fue concebido como un lenguaje de consulta para grandes colecciones de documentos XML.
Los estándares XSLT 2.0 y XQuery 1.0 fueron desarrollados por grupos de trabajo separados dentro del W3C , trabajando juntos para garantizar un enfoque común cuando corresponda. Comparten el mismo modelo de datos, sistema de tipos y biblioteca de funciones, y ambos incluyen XPath 2.0 como sublenguaje.
Los dos idiomas, sin embargo, tienen sus raíces en tradiciones diferentes y satisfacen las necesidades de comunidades diferentes. XSLT se concibió principalmente como un lenguaje de hojas de estilo cuyo objetivo principal era representar XML para el lector humano en pantalla, en la web (como lenguaje de plantilla web ) o en papel. XQuery fue concebido principalmente como un lenguaje de consulta de bases de datos en la tradición de SQL .
Debido a que los dos lenguajes se originan en comunidades diferentes, XSLT es más fuerte en el manejo de documentos narrativos con una estructura más flexible, mientras que XQuery es más fuerte en el manejo de datos, por ejemplo al realizar uniones relacionales. [20]
Opcionalmente, el <output>
elemento puede tomar el atributo media-type
, que permite establecer el tipo de medio (o tipo MIME) para la salida resultante, por ejemplo <xsl:output output="xml" media-type="application/xml"/>
:. La recomendación XSLT 1.0 recomienda los tipos de atributos más generales text/xml
y application/xml
ya que durante mucho tiempo no hubo ningún tipo de medio registrado para XSLT. Durante este tiempo text/xsl
se convirtió en el estándar de facto. En XSLT 1.0 no se especificaba cómo media-type
se debían utilizar los valores.
Con el lanzamiento de XSLT 2.0, el W3C recomendó en 2007 el registro del tipo de medio MIME application/xslt+xml
[21] y posteriormente fue registrado ante la Internet Assigned Numbers Authority . [22]
Se utilizaron borradores de trabajo anteriores a 1.0 de XSLT text/xsl
en sus ejemplos de incrustación, y Microsoft implementó y continuó promoviendo este tipo en Internet Explorer [23] y MSXML alrededor de 2012. También es ampliamente reconocido en las xml-stylesheet
instrucciones de procesamiento de otros navegadores. Por lo tanto, en la práctica, los usuarios que querían controlar la transformación en el navegador mediante esta instrucción de procesamiento estaban obligados a utilizar este tipo de medio no registrado. [24]
Estos ejemplos utilizan el siguiente documento XML entrante
<?xml versión="1.0" ?> <personas> <persona nombre de usuario= "JS1" > <nombre> John </nombre> <nombre de familia> Smith </nombre de familia> </persona> <persona nombre de usuario= " MI1" > <nombre> Morka </nombre> <nombre-familia> Ismincio </nombre-familia> </persona> </personas>
Esta hoja de estilo XSLT proporciona plantillas para transformar el documento XML:
<?xml versión="1.0" codificación="UTF-8"?> <xsl:stylesheet xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" versión= "1.0" > <xsl : método de salida= sangría "xml" = "sí" /> <xsl:template match= "/personas" > <root> <xsl:apply-templates select= "persona" /> </root> </xsl:template> <xsl:template match= "persona" > <nombre nombre de usuario= "{@nombredeusuario}" > <xsl:valor-of select= "nombre" /> </nombre> </xsl:template> </xsl:hoja de estilo>
Su evaluación da como resultado un nuevo documento XML, que tiene otra estructura:
<?xml versión="1.0" codificación="UTF-8"?> <root> <nombre nombre de usuario= "JS1" > John </nombre> <nombre nombre de usuario= "MI1" > Morka </nombre> </root>
Procesando el siguiente archivo XSLT de ejemplo
<?xml versión="1.0" codificación="UTF-8"?> <xsl:stylesheet versión= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" xmlns= " http://www.w3.org/1999/xhtml" > <xsl: método de salida= "xml" sangría= "sí" codificación= "UTF-8" /> <xsl:template match= "/persons" > <html> <head> <title> Ejemplo de prueba XML </title> </head> <body> <h1> Personas </h1> <ul> <xsl:apply- plantillas select= "persona" > <xsl:sort select= "nombre-familia" /> </xsl:apply-templates> </ul> </body> </html> </xsl:template> <xsl:template match= "persona" > <li> <xsl:value-of select= "nombre de familia" /><xsl:text> , </xsl:text><xsl:value-of select= "nombre " /> </li> </xsl:plantilla> </xsl:hoja de estilo>
con el archivo de entrada XML que se muestra arriba se obtiene el siguiente XHTML ( los espacios en blanco se han ajustado aquí para mayor claridad):
<?xml version="1.0" encoding="UTF-8"?> <html xmlns= "http://www.w3.org/1999/xhtml" > <head> <title> Ejemplo de prueba de XML </title> </head> <body> <h1> Personas </h1> <ul> <li> Ismincius, Morka </li> <li> Smith, John </li> </ul> </body> </html>
Este XHTML genera el siguiente resultado cuando se representa en un navegador web.
Para que un navegador web pueda aplicar una transformación XSL a un documento XML en pantalla, se puede insertar una instrucción de procesamiento de hoja de estilo XML en XML. Entonces, por ejemplo, si la hoja de estilo del Ejemplo 2 anterior estuviera disponible como "ejemplo2.xsl", se podría agregar la siguiente instrucción al XML entrante original: [25]
<?xml-stylesheet href="ejemplo2.xsl" tipo="texto/xsl" ?>
En este ejemplo, text/xsl
es técnicamente incorrecto según las especificaciones del W3C [25] (que dicen que el tipo debe ser application/xslt+xml
), pero es el único tipo de medio ampliamente admitido en todos los navegadores a partir de 2009, y la situación no ha cambiado en 2021.
msxsl.exe
. [38] El tiempo de ejecución .NET incluye un procesador XSLT integrado independiente en su System.Xml.Xsl
biblioteca.La mayoría de los primeros procesadores XSLT eran intérpretes. Más recientemente, la generación de código es cada vez más común y utiliza lenguajes intermedios portátiles (como el código de bytes de Java o el lenguaje intermedio común .NET ) como destino. Sin embargo, incluso los productos interpretativos generalmente ofrecen fases de análisis y ejecución separadas, lo que permite crear un árbol de expresión optimizado en la memoria y reutilizarlo para realizar múltiples transformaciones. Esto proporciona importantes beneficios de rendimiento en aplicaciones de publicación en línea, donde la misma transformación se aplica muchas veces por segundo a diferentes documentos fuente. [41] Esta separación se refleja en el diseño de las API de procesamiento XSLT (como JAXP ).
Los primeros procesadores XSLT tenían muy pocas optimizaciones. Los documentos de hojas de estilo se leían en modelos de objetos de documentos y el procesador actuaba sobre ellos directamente. Los motores XPath tampoco fueron optimizados. Sin embargo, los procesadores XSLT utilizan cada vez más técnicas de optimización que se encuentran en lenguajes de programación funcionales y lenguajes de consulta de bases de datos, como la reescritura estática de un árbol de expresión (por ejemplo, para sacar los cálculos de los bucles) y la evaluación diferida en canalización para reducir la huella de memoria de los resultados intermedios. (y permitir la "salida anticipada" cuando el procesador puede evaluar una expresión, por ejemplo, following-sibling::*[1]
sin una evaluación completa de todas las subexpresiones). Muchos procesadores también utilizan representaciones de árbol que son significativamente más eficientes (tanto en espacio como en tiempo) [42] que las implementaciones DOM de propósito general.
En junio de 2014, Debbie Lockett y Michael Kay introdujeron un marco de evaluación comparativa de código abierto para procesadores XSLT llamado XT-Speedo. [43]
Ejemplo: múltiples documentos de resultados
XSLT es un lenguaje muy especializado con un sabor declarativo distintivo.
{{cite journal}}
: Mantenimiento CS1: DOI inactivo a partir de febrero de 2024 ( enlace ){{cite journal}}
: Mantenimiento CS1: DOI inactivo a partir de febrero de 2024 ( enlace )