Pedro Pastor (Universitat d'Alacant)Curso XSL1 Curso de XSL Sistema para la visualización de...

Preview:

Citation preview

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.

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.

<xsl:template match=“Capítulo”>

<xsl:apply-templates/>

</xsl: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”<xsl:template match=“/”>

<html> <xsl:apply-templates/></html>

</xsl:template>

<xsl:template match=“Documento”>

<body><xsl:apply-templates/></body>

</xsl:template>

<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>

Pedro Pastor (Universitat d'Alacant)

Curso XSL 31

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 32

El atributo “select”

<xsl:apply-templates select=“xpath”/>

Restringe a un tipo de hijos (subárboles) la aplicación de la regla.

Pedro Pastor (Universitat d'Alacant)

Curso XSL 33

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 34

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 35

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 36

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 37

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 38

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 39

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 40

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 41

Manejo de tipos de nodos

Text()

Comment()

Pi()

Node()

Pedro Pastor (Universitat d'Alacant)

Curso XSL 42

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 eliminarle los espacios en blanco extra.

Pedro Pastor (Universitat d'Alacant)

Curso XSL 43

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 44

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 45

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 46

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 47

XPath

Lenguaje de expresiones de localización

Pedro Pastor (Universitat d'Alacant)

Curso XSL 48

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 49

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 50

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 51

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 52

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 53

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 54

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 55

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 56

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 57

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 58

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 59

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 60

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 61

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 62

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 63

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 64

Ejemplo: resultado

preceding-sibling::item[1]: B

(preceding-sibling::item[1]: A

for-each “proceding-sibling::item”: Item: A Item: B

Recommended