Download - Curso de XSL
Pedro Pastor (Universitat d'Alacant)
Curso XSL 1
Curso de XSL
Sistema para la visualización de documentos XML
Pedro Pastor (Universitat d'Alacant)
Curso XSL 2
Arquitectura XSL
XSLT: lenguaje para la transformación de documentos XML.XPath: lenguage de consulta en
estructuras XML.
XSLFO: lenguaje de definición de objetos de formato de presentación.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 3
XSLT: definición
eXtensible Stylesheet Language Tranformations.http://www.w3.org/TR/xstl
Diseñado para la transformación de documentos XML en otras estructuras XML y no-XML.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 4
¿ Por que transformar XML ?
Conversión entre modelos de datosAunque legible, XML está pensado para el
intercambio de información entre aplicaciones.
Es necesaria una capa de presentación para hacer “amigable” el acceso de los humanos a la información XML.XML produce separación entre el modelo de datos
y presentación visual.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 5
Cómo se construye una presentación
1. Una transformación estructural desde el documento con la estructura de datos original hacia una estructura que refleje la presentación gráfica deseada.
2. Formateo de la salida, utilizando los elementos de representación visual adecuados.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 6
Proceso de publicación XML-XSL.
Doc. XML
original
HTML,PDF, ...
Procesador de XSLT
XSLT
NuevaEstructuraXML + FO
NuevaEstructuraXML + FO
NuevaEstructuraXML + FO
ProcesadorDe XSLFO
Pedro Pastor (Universitat d'Alacant)
Curso XSL 7
Cómo se realiza la transformación (1)
" lib ro "P C D A T A
tipoA T R IB U T O
"P e d ro"P C D A T A
n o m b reE L E M E N TO
"P a s to r"P C D A T A
a p e llid osE L E M E N TO
a u to rE L E M E N TO
títu loE L E M E N TO
tít itu lo S ecE L E M E N TO
IS B NE L E M E N TO
"X M L "P C D A T A
m a te riaE L E M E N TO
m a te riaE L E M E N TO
c la s if ica c iónE L E M E N TO
R e cu rsoE L E M E N TO
re cu rsoE L E M E N TO
ca tá lo goE L E M E N TO
D o cum e n to X M LN o do D ocu m e n to
Pedro Pastor (Universitat d'Alacant)
Curso XSL 8
Cómo se realiza la transformación(2)
" lib ro "P C D A T A
tipoA T R IB U T O
títu loE L E M E N TO
"P e d ro"P C D A T A
n o m b reE L E M E N TO
"P a s to r"P C D A T A
a p e llid osE L E M E N TO
a u to rE L E M E N TO
"X M L "P C D A T A
m a te riaE L E M E N TO
m a te riaE L E M E N TO
c la s if ica c iónE L E M E N TO
re cu rsoE L E M E N TO
ca tá lo goE L E M E N TO
D o cum e n to X M LN o do D ocu m e n to
Pedro Pastor (Universitat d'Alacant)
Curso XSL 9
Cómo se realiza la transformación(3)
"X M L b y e xam p le"
< li>"T ítu lo "
"P e dro P as to r"
< li>"A u to r"
"X M L " "Ja va"
< u l>
< li>"C la s if ica c ió n"
< u l>"L is ta d e lib ro s"
D o cu m en to H T M LN o do D ocu m e n to
Pedro Pastor (Universitat d'Alacant)
Curso XSL 10
Lo que ve el procesador
La raiz del documento.
Elementos.
Texto.
Atributos.
Espacios de nombres (Namespaces).
Instrucciones de procesamiento (PI).
Comentarios.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 11
Como se implementa la transformación
1. Desarrollo de una aplicación a medida a partir de los “parsers” XML existentes (SAX, DOM).
2. Programación XSLT:lenguaje declarativo para definir reglas de transformación genéricas (dependientes de un contexto).
Pedro Pastor (Universitat d'Alacant)
Curso XSL 12
Procesamiento XSLT-Servidor
XML
ProcesadorXSLT
XML
XSL_FO
HTML Navegador Web
Visor de FOFuente decontenidos
Pedro Pastor (Universitat d'Alacant)
Curso XSL 13
Procesamiento XSLT-Cliente
XML
ProcesadorXSLT
IMAGEN
HTMLNavegador Web
Visor de FO
Fuente decontenidos
Pedro Pastor (Universitat d'Alacant)
Curso XSL 14
Dónde tiene lugar la transformación
1. En el cliente:Tanto el documento XML como el XSL son servidos al cliente y este los procesa.
2. En el servidor:Éste aplica la XSL al XML y genera un documento publicable que envía al cliente (servlet, ASP, CGI, ...).
3. Un tercer programa hace la transformación.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 17
¿ Por que XSL ?
Está diseñado para integrarse en la arquitectura XML.
Es mucho más potente que CSS.
Aunque un poco menos potente que DSSSL es mucho más sencillo de usar.
Cada vez hay más herramientas para XSL.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 18
Composición de los documentos XSL.
XSLT usa XML para describir las reglas: patrones y plantillas.
Un documento XSL se construye a partir de una raiz: <xsl:stylesheet> ... </xsl:stylesheet>
Todos los elementos de XSL que son instrucciones pertenecen al espacio de nombres: xmlns:xsl=“http://www.w3.org/XSL/Transform/1.0”
Pedro Pastor (Universitat d'Alacant)
Curso XSL 19
Declaración de Hoja de Estilo
El elemento raiz de la Hoja de Estilo debe tener al menos el atributo version=“x.y”
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0“ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml" version="1.0“ encoding="UTF-8" indent="yes"/>***
</xsl:stylesheet>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 20
Asociar una XSL a un XML
Insertar una instrucción de procesamiento:
<?xml version=“1.0”?>
<?xml-stylesheet type=“text/xsl” href=“myHoja.xsl”?>
El atributo type debe contener el valor fijo “text/xsl”. href debe contener la URL que localiza la hoja de estilo.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 21
XSLT: Elementos “Top-level”.
xsl:import
xsl:include
xsl:strip-space
xsl:preserve-space
xsl:output
xsl:key
xsl:decimal-format
xsl:namespace-alias
xsl:attribute-set
xsl:variable
xsl:param
xsl:template
El elemento <xsl:stylesheet> puede contener como hijos cualquiera de los siguientes elementos (top-level):
Pedro Pastor (Universitat d'Alacant)
Curso XSL 22
Definición de <xsl:output><!-- Category: top-level-element --><xsl:outputmethod="xml" | "html" | "text" | qname-but-not-ncname version = nmtoken encoding = string omit-xml-declaration = "yes" | "no"standalone = "yes" | "no"doctype-public = string doctype-system = string cdata-section-elements = qnames indent = "yes" | "no"media-type = string />
Pedro Pastor (Universitat d'Alacant)
Curso XSL 23
Templates (Plantillas)
Es el elemento más importante de la especificación XSL.
Especifica la transformación que se aplicará a una parte concreta del documento origen.
Cada hoja de estilo debe tener al menos un “template”.
Un “template” seleccionado asocia una salida concreta con una entrada concreta.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 25
apply-templates
Para ir más allá de la raiz hay que dirigir al procesador en la búsqueda de elementos hijos del documento origen.
El uso de<xsl:apply-templates> indica dónde continuar recursivamente el proceso.
En dicho punto se aplicarán los templates apropiados según los hijos del elemento activo
Pedro Pastor (Universitat d'Alacant)
Curso XSL 26
xsl:apply-templates
En general, este elemento es vacío e indica el punto de inserción de contenidos.
Cada nodo que cumple el patrón (match) es tratado como un árbol.
<template match=“Capítulo”>
<apply-templates/>
</template>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 27
Cómo funcionan los “templates”<?xml version=“1.0”?><?xml-stylesheet type=“text/xsl” href=“miEstilo.xsl”?><Documento>
<hijoA_1><hijoA_1-1> ... </hijoA_1-1> <hijoA_1-2> ... </hijoA_1-2> <hijoA_1-1> ... </hijoA_1-1>
</hijoA_1><hijoB_1> ... <hijoB_1>
</Documento>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 28
Cómo funcionan los “templates”<?xml version=“1.0”?>
<xsl:stylesheet xmlns:xsl=“http://www.w3.org/XSL/Transaform/1.0”>
<xsl:template match=“/”>
<html> <xsl:apply-templates/></html>
</xsl:template>
<xsl:template match=“Documento”>
<body><xsl:apply-templates/></body>
</xsl:template>
</xsl:stylesheet>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 29
Cómo funcionan los “templates”<xsl:template match=“hijoA_1”>
<h1>Esto es la salida<h1><xsl:apply-template>
</xsl:template><xsl:template match=“hijoA_1-1”>
<p>Elemento = HijoA_1.1</p></xsl:template></xsl:stylesheet>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 32
Cómo funcionan los “templates”
Resultado:<html>
<body><h1>Esto es la salida<h1><p>Elemento=HijoA_1.1</p><p>Elemento=HijoA_1.1</p>
</body></html>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 33
El atributo “select”
<xsl:apply-templates select=“elemento”/>
Restringe a un tipo de hijos (subárboles) la aplicación de la regla.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 34
xsl:value-of
<xsl:template match=“padre”>
<xsl:value-of select=“id_hijo”/>
<xsl:template/>
Copia el contenido del nodo seleccionado en la salida.
El valor de “id_hijo” es relativo al nodo fuente seleccionado en el template.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 35
Regla por defecto para texto
<xsl:template match=“text()”><xsl:value-of select=“.”/>
</xsl:template>Concuerda con todos los nodos-texto y copia sus contenidos a la salida.Asegura que como mímimo se imprime el texto de todos los elementos seleccionados.Se puede sobrecargar esta regla para modificar el comportamiento por defecto.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 36
Regla por defecto para elementos
Situación: no queremos procesar un elemento pero si algunos de sus hijos.
<xsl:template match=“*|/”>
<xsl:apply-templates/>
</xsl:template>
Asegura que todos los elementos serán procesados (visitados) recursivamente.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 37
Regla por defecto para elementos(ejemplo-1)
<libro>
<introducción>
<para> Esto es un párrafo</para>
<para> Otro párrafo</para>
</introducción>
</libro>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 38
Regla por defecto para elementos(ejemplo-2)
<template match=“libro”><apply-templates/>
</template>
<template match=“para”><apply-templates/>
</template>
<!– No hay template para “introducción” -->
Pedro Pastor (Universitat d'Alacant)
Curso XSL 39
Modificar la regla por defecto
Ejemplo: Evitar que se procese ningún hijo de un
elemento que no tenga definido un template.
<template match=“*|/”>
<!– Nada -->
</template>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 40
Ocultar contenidos
<nota><para>...</para><para>...</para></nota>
<template match=“nota”></template>
Como consecuencia:
es necesaria una regla vacía para que no se procese un subárbol que depende de un elemento concreto.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 41
xsl:for-each
<xsl:for-each select=“”>
otras reglas XSL
</xsl:for-each>
Se aplica a colecciones de nodos.
Si no hay select, se aplica a todos los hijos del nodo actual.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 42
Manejo de tipos de nodos
Text()
Comment()
Pi()
Node()
Pedro Pastor (Universitat d'Alacant)
Curso XSL 43
Manipulación de espacios en blanco
<xsl:preserve-space element=“nombre”/>
Indica el subárbol origen al cual hay que preservarle los espacios en blanco.
<xsl:strip-space element=“nombre”/>
Indica el subárbol origen al cual hay que preservarle los espacios en blanco.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 44
Xsl:choose – xsl:when<xsl:template match=“capítulo/título”>
<xsl:choose><xsl:when test=“.[first-of-type()]”>
Primer capítulo:</xsl:when><xsl:otherwise>
Capítulo siguiente:</xsl:otherwise>
</xsl:choose></xsl:template>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 45
xsl: element- attribute - text
Insertan: un elemento, un atributo y un nodo hijo de tipo texto, respectivamente, en el árbol de salida.
<xsl:element name=“libro”>
<xsl:attribute name=“título”>El Quijote
</xsl:attribute>
<xsl:text>Este libro es famoso.</xsl:text>
</xsl:element>
<libro título=“El Quijote”>Este libro es famoso.</libro>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 46
Templates con nombreSe parece a la definición y llamada a subrutina:
<xsl:template name=“nombreTemplate”>
<xsl:param name=“parametro1”/>
<!– El código va aquí -->
</xsl:template>
<xsl:call-template name=“nombreTemplate”>
<xsl:with-param name=“parametro1” select=“valorParam”/>
</xsl:call-template>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 47
Variablesy función “document()”
Muy Importante: Una vez instanciadas NUNCA pueden cambiar de valor !!!
<xsl:variable name=“ficheroExt”
select=“document(“url”)/XPath”/>
...
<xsl:apply-templates select=“$ficheroExt/XPath”/>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 48
XPath
Lenguaje de expresiones de localización
Pedro Pastor (Universitat d'Alacant)
Curso XSL 49
Expresiones XPath
Parten una gramática formal especificación).
Generan un lenguaje formal no-ambiguo.
Expresiones de localización con doble funcionalidad en las operaciones: “pattern matching” -> devuelven un booleano.Evaluación de expresiones -> devuelven un
conjunto de nodos.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 50
Expresiones de localización(1)
Seleccionan un conjunto de nodos del documento origen.Existe un punto absoluto de referencia para las localizaciones: “/”, la raiz del documento origen.Las expresiones que no comienzan con “/” son relativas a un nodo de contexto (normalmente el actual).
Pedro Pastor (Universitat d'Alacant)
Curso XSL 51
Expresiones de localización(2)
El símbolo “/” a mitad de expresión sirve para incluir expresiones recursivamente (paso de localización), actuando como filtros sucesivos.
Un paso de localización se compone de:Una base:
Un eje de identificación (indicando dirección de localiz.).Un nodo de “test” (filtrando nodos de su tipo y nombre).
Uno o más predicados (filtrando nodos).
Pedro Pastor (Universitat d'Alacant)
Curso XSL 52
Ejes de localización
ancestor::
ancestor-or-self::
attribute::
child::
descendant::
descendant-or-self::
following::
following-sibling::
namespace::
parent::
preceding::
preceding-sibling::
self::
Hay trece ejes de localización:
Pedro Pastor (Universitat d'Alacant)
Curso XSL 53
Ejes XPath
p re ce d ing
p re ce d ingp re ced in g -s ib ling
d e scen da nt
d e scen da ntch ild
d e scen da ntch ild
d e scen da nt
d e scen da ntch ild
S E LF fo llo w ingfo llo w ing -s ib ling
a n ces to rp a re n t
fo llo w ing
A n ces to r
Pedro Pastor (Universitat d'Alacant)
Curso XSL 54
Ejes de localización:abreviaturas
Un nombre o tipo de nodo indica child::
Un carácter ‘@’ indica attribute::
La secuencia “//” indica/descendant-or-self::node()/
La secuencia “..” indica parent::node()
La secuencia “.” indica self::node()
Pedro Pastor (Universitat d'Alacant)
Curso XSL 55
Nodos de “test”
Determinan que nodos localizar en el eje indicado:Por nombre del nodo.Por tipo de nodo.Por valor de atributo.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 56
Predicados
Qualificadores opcionales de listas de nodos (la lista ordenada de nodos en un eje).
El orden es en función de la proximidad al nodo actual.
La concatenación de predicados se evalúa: de izda. a dcha. Contra todos los nodos del contexto. reduce la lista de nodos seleccionados, cambiando la
posición (contexto) de la expresión XPath.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 57
Ejemplos de expresiones y contextos
Self::nomNodo , Indica el nodo actual si se llama “nomNodo”, si no da
lista_vacía.
nomNodo , ./nomNodo , child::nomNodo , Conjunto de elementos-hijo del nodo actual que se llamen
“nomNodo”.
.//nomNodo , Elementos decendientes del actual (nombre=“nomNodo”).
//nomNodo , Elementos decendientes del raiz (nombre=“nomNodo”).
Pedro Pastor (Universitat d'Alacant)
Curso XSL 58
Ejemplos de expresiones y contextos
../nomNodo , Elementos “hermano” (y él mismo) = “nomNodo”.
@atrib , Nodos atributos asociados con nombre=“atrib”.
../@atrib , Los nodos atributo del nodo-padre con nombre=“atrib”.
../nomNodo/@atrib , Atributos “atrib” de los elementos-hermano=“nomNodo”.
nomNodo/@atrib , Atributos “atrib” de los elementos-hijo=“nomNodo”.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 59
Ejemplos de expresiones y contextos
nomNodo[position()=last()] , El último elemento-hijo=“nomNodo”.
nomNodo[position()=3] , nomNodo[3] , El tercer elemento-hijo=“nomNodo”.
nomNodo[@atrib][3] , El tercer elemento-hijo=“nomNodo” que tiene un
atributo=“atrib”.
nomNodo[3][@atrib] , El tercer elemento-hijo=“nomNodo” SI tiene un atributo
asociado=“atrib”, en caso negtivo da lista-vacía.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 60
Ejemplos de expresiones y contextos
ancestor::nomNodo , Conjunto de nodos antecesores=“nomNodo”.
ancestor::nomNodo[1] , El nodo antecesor más próximo=“nomNodo”.
ancestor::nomNodo[@atrib][1] , El nodo antecesor más próximo=“nomNodo” y
atributo=“atrib”.
ancestor::[1][@atrib] , El nodo antecesor más próximo=“nomNodo” SII tiene un
atributo=“atrib”, si-no : lista vacía.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 61
Ejemplos de expresiones y contextos
ancestor::nomNodo/@atrib , Selecciona los atributos=“atrib” de todos los elementos-
antecesores=“nomNodo”.
ancestor::nomNodo[@atrib][1]/@atrib , El atributo=“atrib” del elemento-antecedente=“nomNodo”
más próximo.
id(@ref)/@atrib , El atributo=“atrib” del elemento que devuelve la función id()
con parámetro el valor del atributo “ref” del elemento actual.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 62
Dirección de procesamiento de los Ejes
Los predicados se orientan por proximidad al nodo actual:Aplicados a antecesores actúan sobre conjuntos
ordenados en forma inversa al orden del documento.
Aplicados a sucesores actúan sobre conjuntos ordenados en el mismo orden del documento.
Los conjuntos resultado que se procesen como colección, se hará en el orden del documento.
Pedro Pastor (Universitat d'Alacant)
Curso XSL 63
Dirección de procesamiento de ejes (ejemplo)
Documento XML origen de transformación:
<?xml version=“1.0”?>
<conjunto>
<item>A</item>
<item>B</item>
<item>C</item>
</conjunto>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 64
Ejemplo (cont.)Hoja de estilo XSL:
<xsl:template match”/”><xsl:for-each select=“//item[last()]”>
<xsl:text>preceding-sibling::item[1]:</xsl:text><xsl:value-of select=“preceding-sibling::item[1]”/><xsl:text>&nl;(preceding-sibling::item)[1]:</xsl:text><xsl:value-of select=“(preceding-sibling::item)[1]”/><xsl:text>for-each preceding-sibling::item:</xsl:text><xsl:for-each select=”preceding-sibling::item/text()”><xsl:text>&nl; Item:</xsl:text><xsl:value-of select=“.”/></xsl:for-each></xsl:for-each></xsl:template>
Pedro Pastor (Universitat d'Alacant)
Curso XSL 65
Ejemplo: resultado
preceding-sibling::item[1]: B
(preceding-sibling::item[1]: A
for-each “proceding-sibling::item”: Item: A Item: B