XSLT (eXtensible Stylesheet Language for Transformations)
XSL (eXtensible Stylesheet Language) Familia de lenguajes basados en XML Consta de: ●
XSLT: Lenguaje que realiza transformaciones de documentos XML a otros formatos (incluido XML)
●
XPath: Lenguaje usado por XSLT para acceder a secciones de documentos XML
●
XSL_FO: Lenguaje de maquetado combinado con transformaciones. Vocabulario XML para especificar semánticas de formateo. Permite generar documentos en formatos de salida como pdf, PostScript, RTF, … a partir de datos contenidos en un documento XML
XSLT (eXtensible Stylesheet Language for Transformations) ●
Basado en XML. Cada hoja de transformación es un documento XML bien formado.
●
Lenguaje de programación declarativo, permite generar documentos en diferentes formatos de salida (XML, HTML, texto, PDF, RTF,….) a partir de un documentos XML.
●
Declarativo ya que consiste en la declaración de una serie de reglas o plantillas que hay que aplicar a un documento XML para transformarlo en la salida deseada.
●
Una regla asocia un patrón o expresión con elementos del documento XML de partida y les aplica una serie de acciones. Estas reglas se almacenarán en un documento de texto (extensión xsl) que junto con el documentos XML de partida serán pasados como parámetros a un procesador XSLT que generará como salida el nuevo documento transformado.
Hojas de estilo: CSS vs. XSLT Dos familias de normas para hojas de estilos: ●
CSS ○ ○ ○
Más antigua y simple Permite definir propiedades de elementos de marcado Limitaciones: ■ No se puede cambiar el orden en el que los elementos de un documento HTML se visualizan, tampoco se pueden ordenar o filtrar por algún criterio. ■ No se pueden realizar operaciones (sumar valores de elementos de un documento, …) ■ No se pueden combinar múltiples elementos (nóminas anuales de un empleado con el fin de obtener un total de ingresos y retenciones)
●
Estas limitaciones se superan con XSLT que, en muchas ocasiones, se utilizará junto con CSS.
●
Con XSLT se determinará qué contenido de un documento XML se quiere mostrar y en qué orden, realizándose si es necesario algún cálculo sencillo.
●
Con CSS se dará un formato visual agradable a la información mostrada.
Procesador XSLT Objetivo ●
Procesar documentos XML mediante hojas de transformación XSLT
Una transformación XSL se puede llevar a cabo en tres ubicaciones distintas: 1.
En un servidor web: mediante algún lenguaje de servidor (PHP, asp.NET, JSP,…) que aplique la XSLT al XML y envíe de vuelta el HTML producido al cliente (Proyecto Cocoon de Apache utiliza clases Java)
2.
En un cliente web: El cliente web (Chrome, Mozilla Firefox, Intenet Explorer,…) realiza las transformaciones (lo suelen hacer con JavaScript. También existen librerías como Sarissa para hacer esta tarea)
3.
Mediante programas de funcionamiento independiente . Procesadores en lĂnea: http://xslt.online-toolz.com/tools/xslt-transformation.php http://www.shell-tools.net/index.php?op=xslt http://markbucayan.appspot.com/xslt/index.html Procesadores instalables Xalan (http://xml.apache.org/xalan-j/ AltovaStyleVision <oXigen/> XML Copy Editor
Pasos para la transformación 1.
Se analiza la hoja de transformaciones y se convierte en una estructura de árbol
2.
El documento XML es procesado y convertido en una estructura de árbol
3.
El procesador XSLT se posiciona en la raíz del documento XML. Este es el contexto original.
4.
Los elementos (como las etiquetas HTML) que no formen parte del espacio de nombres de prefijo xsl, son pasados a la cadena de salida sin modificarse. Son los elementos de resultado literal.
5.
El procesador XSLT sólo aplica una regla a cada nodo. Si tenemos dos reglas para el mismo nodo, el procesador aplica la última en aparecer. Por lo demás, el orden en el que aparecen las plantillas en la hoja de transformaciones no es representativo. Lo que marca el orden es el recorrido del procesador del árbol del documento XML.
Estructura básica de una hoja XSLT Está compuesta por: 1.
Una declaración de documento XML, ya que lo es <?xml versión=”1.0” …….?>
2.
Un elemento raíz <xsl:stylesheet> o <xsl:transform>, indicamos la versión xslt, el espacio de nombres (http://www.w3.org/1999/XSL/Transform) y el prefijo (xsl) <xsl:stylesheet versión=”1.0” xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”> ….. </xsl:stylesheet>
3.
Otros elementos, llamados de nivel superior, hijos de <xsl:stylesheet> o <xsl:transform>: <xsl: import> (si aparece debe ser el primer hijo de del elemento raíz), <xsl:include>, <xsl: namespace-alias>, <xsl:output>, <xsl:strip-space>, <xsl:preserve-space>, <xsl: attribute-set>, <xsl:key>, <xsl:param>, <xsl:variable>, <xsl:template>
Transformaciones Si la hoja de transformaciones no contiene plantillas (<xsl:template>) el contenido textual del documento XML se envía directamente a la salida, omitiéndose los valores de los atributos. Tampoco se envían comentarios ni instrucciones de procesamiento.
<?xml versión=”1.0” encoding=”ISO-8859-1”?> <xsl:stylesheet versión=”1.0” xmlns: xsl=”http://www.w3.org/1999/XSL/Transform” > </xsl:stylesheet>
Si la hoja de estilos sólo tiene una plantilla sin ningún contenido, asociada al nodo raíz del documento XML, no se envía nada a la salida.
<?xml versión=”1.0” encoding=”ISO-8859-1”?> <xsl:stylesheet versión=”1.0” xmlns: xsl=”http://www.w3.org/1999/XSL/Transform” > <xsl:template match=”/”> </xsl:template> </xsl:stylesheet>
Si la hoja de transformación no tiene ninguna 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.
De manera general, cuando la hoja de transformación contiene una plantilla, se va recorriendo el árbol del documento XML y cuando aparece alguna expresión que coincide con el elemento en que nos encontramos (atributo match) se le aplica la plantilla. Si la plantilla estuviera vacía (sin acciones en su interior) el elemento al que afecta la plantilla y sus descendientes no se visualizarían.
Cada regla (plantilla o template) en la hoja de transformaciรณn contiene un patrรณn XPath asociado, que coincide con los nodos del documento XML original a los cuales se aplicarรก la regla. Si hay varias plantillas que se ajustan a la misma expresiรณn se aplican una serie de reglas de resoluciรณn de plantillas.
Ejemplo: ¿Qué salida generará la siguiente plantilla? <?xml versión=”1.0” encoding=”ISO-8859-1”?> <xsl:stylesheet versión=”1.0” xmlns: xsl=”http://www.w3.org/1999/XSL/Transform” > <xsl:template match=”/”> </xsl:template> <xsl:template match=”/contratoAlquiler/arrendador”> ….. </xsl:template> </xsl:stylesheet>
Solución: La salida que se genera es vacía, ya que la plantilla que se ajusta al elemento raíz es vacía y no se continúa procesando la hoja de transformaciones aunque tenga más plantillas.
Enlace de XML con hojas de estilo Se puede asociar una hoja de estilos, CSS o XSLT a un documento XML <?xmlversión=”1.0” encoding=”ISO-8859-1”?> <?xml-stylesheet type=”text/css” href=”hoja_estilos.css”?> <?xmlversión=”1.0” encoding=”ISO-8859-1”?> <?xml-stylesheet type=”text/xsl” href=”hoja_estilos.xsl”?>
Cuando se visualiza en un navegador web un documento XML enlazado con una hoja de estilos XSLT, el navegador muestra el resultado de la transformación. Si se utiliza la opción Ver, código fuente, se muestra el documento XML original.
Elementos básicos <xsl:output> Define el formato del documento de salida. Es un elemento de nivel superior. Debe aparecer como hijo de <xsl:stylesheet> o <xsl:transform> Atributos method Define el formato de salida. Por defecto es XML (pero si el primer hijo del nodo raíz es <html> y no hay nodos de texto previos, el formato de salida es HTML). Posibles valores: xml, html, text versión Define la versión del formato de salida (sólo para formatos de salida XML y HTML)
encoding Indica el juego de caracteres de salida. Por defecto es UTF-8 indent Indica si la salida debe ser indentada de acuerdo a su estructura jerárquica omit-xml-declaration Indica si la instrucción de procesamiento que declara el documento como XML se omitirá en la salida. Posibles valores: yes, no (defecto, sí se enviará a la salida <?xml version=”1.0”?> )
standalone Indica si a la instrucción de procesamiento de declaración de tipo de documento XML <?xml version=”1.0”?> se le añade el atributo standalone. Posibles valores: yes, no (por defecto)
Ejemplo: La salida de la hoja de transformación estará en formato HTML, la codificación será “iso-8859-1” y se omitirá el envío a la salida de la declaración de documento XML
<?xml versión=”1.0” encoding=”ISO-8859-1”?> <xsl:stylesheet versión=”1.0” xmlns: xsl=”http://www.w3.org/1999/XSL/Transform” > <xsl:output method=”html” encoding=”iso-8859-1” omit-xml-declaration=”yes” /> </xsl:stylesheet>
<xsl:template> Es junto con <xsl:apply-templates> la instrucción principal de las hojas de transformación. Representa una plantilla con una serie de acciones que se realizarán si el patrón de la plantilla (atributo match) encaja con algún elemento o elementos del árbol XML. Atributos name Indica un nombre para la plantilla. Si se omite, el atributo match es obligatorio. No puede haber en una hoja de transformación dos plantillas con el mismo nombre, se produciría un error.
match Patrón XPath que indica qué elementos del árbol XML se verán afectados por la plantilla. Si se omite, el atributo name es obligatorio. priority Valor real desde -9 a 9 (de menor a mayor prioridad). Se utiliza para aplicar reglas de resolución de conflictos entre plantillas. Con un valor superior a 0.5 una plantilla tendrá mayor prioridad que otra sin prioridad explícitamente declarada. mode Permite distinguir dos plantillas cuyo atributo match sea el mismo, de manera que en la invocación desde <xsl:apply-templates> se pueda indicar explícitamente cual usar. Dentro de este elemento se define la transformación a aplicar. Si no se indica nada, se sustituiría el nodo o nodos indicados en match por nada.
Cuando se aplica una plantilla a un nodo, se aplica únicamente al nodo seleccionado, pero se sustituye el nodo y todos sus descendientes por el resultado de la aplicación de la plantilla, lo que nos haría perder la información de los descendientes.
Si se quiere que antes de sustituir el nodo y todos sus descendientes se apliquen también a sus descendientes otras plantillas que queramos, tendremos que utilizar la instrucción <xs:applytemplates>
Una plantilla es una regla cuyas acciones se ejecutarán si el patrón que tiene asociado coincide con algún elemento del árbol XML. Cuando una plantilla se aplica, se dice que ha sido instanciada.
Ejemplo 0: <?xml versión=”1.0” encoding=”UTF-8”?> <xsl:stylesheet versión=”1.0” xmlns: xsl=”http://www.w3.org/1999/XSL/Transform” > <xsl:output method=”html” encoding=”iso-8859-1” omit-xml-declaration=”yes” Indent=”yes” /> <xsl:template match=”/”> <html> <body> <h1>Documento HTLM generado con cualquier documento XML</h1> </body> </html> </xsl:template> </xsl:stylesheet>
<xsl:apply-templates> Permite procesar el resto de nodos hijos del actual, es decir, seguir aplicando plantillas. Atributos select Expresión XPath que especifica los nodos a seleccionar para ser procesados. Si se omite, todos los nodos descendientes del actual serán seleccionados. Si se indica una expresión que no coincide con ningún conjunto de nodos, no se aplicará ninguna transformación. mode Permite distinguir entre varias plantillas con igual valor en su atributo match.
Ejemplo 1: Aplicada a un documento XML ¿Cuál será la salida de esta hoja de estilos ? <?xml versión=”1.0” encoding=”UTF-8”?> <xsl:stylesheet versión=”1.0” xmlns: xsl=”http://www.w3.org/1999/XSL/Transform” > <xsl:output method=”html” indent=”yes”/> <xsl:template match=”/”> <html> <body> <!-- se invoca la aplicación de plantillas sin atributos --> <h1><xsl:apply-templates /></h1> </body> </html> </xsl:template> </xsl:stylesheet>
Ejemplo 2: A partir del documento XML de ciclos y m贸dulos. Realizar una plantilla xslt que genere la siguiente salida
Se env铆a a la salida todo el contenido textual de los elementos descendientes de /
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="ISO-8859-1"/> <xsl:template match="/fp/ciclos/ciclo"> NOMBRE: <xsl:apply-templates select="nombre" />( <xsl:apply-templates select="@siglas" /> ) FAMILIA PROFESIONAL: <xsl:apply-templates select="familiaProfesional" /> GRADO: <xsl:apply-templates select="grado" /> </xsl:template> <xsl:template match="/fp/modulos/modulo" /> </xsl:stylesheet>
Resolución de conflictos con plantillas Existen reglas para determinar qué plantilla se aplicará en el caso de que más de una pueda afectar a un elemento. En ausencia de prioridad se aplicará la última plantilla en aparecer. Cada regla tiene una prioridad desde -9 hasta 9 que, además, puede ser asignada explicitamente a través del atributo priority
<xsl:value-of> Visualiza el contenido del elemento indicado en el atributo select y de todos sus descendientes. Atributos select Expresi贸n XPath que especifica de qu茅 elemento o atributo hay que extraer el contenido. disable-output-escaping Indica si los caracteres especiales (<, &,...) deben ser enviados a la salida tal cual o en forma de entidad (&lt; &amp;....). Valor por defecto no (se generan en forma de entidad)
<xsl:test> Permite escribir texto literal en la salida. En las hojas de transformación los saltos de línea (&#10;), tabuladores (&#9;), espacios en blanco (&#32;)… se envían directamente a la salida. Esta instrucción se usa para controlar ese funcionamiento. Atributos disable-output-escaping Indica si los caracteres especiales (<, &,...) deben ser enviados a la salida tal cual o en forma de entidad (&lt; &amp;....). Valor por defecto no (se generan en forma de entidad)
<xsl:for-each> Permite iterar sobre una lista de elementos y aplicar transformaciones sobre ellos. Se puede anidar para recorrer estructuras anidadas. Atributos select Expresi贸n XPath que especifica la lista de elementos sobre los que se va a iterar.
<xsl:sort> Envía a la salida datos del documento XML de partida ordenados por algún criterio. Se puede ordenar una salida por más de un criterio, anidando varias órdenes xsl_sort Atributos select Expresión XPath que especifica el nodo o conjunto de nodos por los que se construirá el criterio de ordenación. lang Indica qué idioma se utiliza al ordenar. Es un código de idioma.
data-type Indica el tipo de los datos que se ordenarán (text (por defecto), number, QName,...) order Especifica si el orden es ascendente (ascending) (por defecto) o descendente (descending) case-order Establece si las letras minúsculas (lower-first) o mayúsculas (upper-first) aparecerán primero al ordenar
<xsl:if> Produce un comportamiento condicional. Sólo permite una condición y se actúa si es cierta. No existe una rama del “si no”. Atributos test Expresión XPath que debe hacerse cierta para que se aplique la plantilla que le sigue.
<xsl:choose> <xsl:when> <xsl:otherwise> Implementa un comportamiento condicional con múltiples opciones y una opción por defecto. Similar a la instrucción switch Atributos (Sólo lleva atributos <xsl:when>) test Expresión XPath que debe hacerse cierta para que se aplique la plantilla que le sigue.
<xsl:call-template> Permite invocar a una plantilla por su nombre. Atributos name Nombre de la plantilla a la que se llama.
Mostrando valores de elementos y atributos de modo simplificado Valores de elementos: {nombre del elemento} Valores de atributos: {ruta/@atributo} Ejemplo: Documentos XML <trabajador dpto=”administración”>Miguel Alcántara Gómez </nombre> Documento XSLT {trabajador} = Miguel Alcántara Gómez {trabajador/@dpto} = administración
Generaci贸n de nuevos elementos y atributos Cuando la salida a generar en en formato XML, se puede optar por enviar a la salida elementos o atributos existentes en el documento XML de entrada o crear otros nuevos.
<xsl:element> Genera un nuevo elemento (nodo) en el documento de salida. Atributos: name Indica el nombre del elemento. Se puede construir dinĂĄmicamente extrayendo datos del documentos XML de entrada namespace URI del espacio de nombres del elemento. Se puede construir dinĂĄmicamente extrayendo datos del documentos XML de entrada use-attribute-set Lista (separada por espacios) de conjuntos de atributos para aĂąadir al elemento
<xsl:attribute> Genera un nuevo atributo de un elemento Atributos: name Indica el nombre del atributo. namespace URI del espacio de nombres del atributo.
<xsl:comment> Genera un comentario en el documento de salida. Puede ser un texto literal o un dato extra铆do del documento XML de partida.
<xsl:processing-instruction> Genera instrucciones de procesamiento en el documento de salida. Los atributos de la instrucci贸n aparecer谩n como contenido del elemento. Atributo name nombre de la instrucci贸n de procesamiento
<xsl:copy-of> Realiza una copia literal de un elemento a la salida. Los atributos y elementos descendientes se copiarán también. Se emplea cuando se quiere enviar a la salida un fragmento de documento XML sin aplicar ninguna transformación. Atributos select Indica el elemento que se copiará
<xsl:copy> Realiza una copia literal de un elemento a la salida pero no de sus atributos ni descendientes.
Atributos use-attribute-sets Indica una lista de conjuntos de atributos, separados por espacios, que se aplicarĂĄn al nodo de salida. Cada lista de conjunto de atributos debe definirse a travĂŠs del elemento <xsl:attribute-set>
<xsl:attribute-set> Permite crear un paquete de atributos identificado por un nombre, de manera que puedan ser asignados conjuntamente a un elemento. Dentro de este elemento aparece la declaraci贸n de los atributos que forman parte del paquete o conjunto
Atributos name Nombre del conjunto de atributos. use-attribute-sets Lista separada por espacios de otros conjuntos de atributos que se integren en este.
<xsl:variable> Las variables en XSLT son similares a las constantes en otros lenguajes de programación, una vez asignado un valor, no se puede modificar. Se usan para almacenar expresiones XPath complejas o trozos de código que van a usarse repetidas veces. Atributos name Nombre de la variable select Define el valor de la variable. Si no aparece este atributo, se asume que el valor de la variable es la cadena vacía. Para utilizar esa variable <xsl:copy-of select=”$nombre de la variable” />