60
Pedro Pastor (Universitat d 'Alacant) Curso XSL 1 Curso de XSL Sistema para la visualización de documentos XML

Curso de XSL

  • Upload
    lane

  • View
    56

  • Download
    1

Embed Size (px)

DESCRIPTION

Curso de XSL. Sistema para la visualización de documentos XML. 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. XSLT: definición. - PowerPoint PPT Presentation

Citation preview

Page 1: Curso de XSL

Pedro Pastor (Universitat d'Alacant)

Curso XSL 1

Curso de XSL

Sistema para la visualización de documentos XML

Page 2: Curso de XSL

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.

Page 3: Curso de XSL

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.

Page 4: Curso de XSL

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.

Page 5: Curso de XSL

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.

Page 6: Curso de XSL

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

Page 7: Curso de XSL

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

Page 8: Curso de XSL

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

Page 9: Curso de XSL

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

Page 10: Curso de XSL

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.

Page 11: Curso de XSL

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

Page 12: Curso de XSL

Pedro Pastor (Universitat d'Alacant)

Curso XSL 12

Procesamiento XSLT-Servidor

XML

ProcesadorXSLT

XML

XSL_FO

HTML Navegador Web

Visor de FOFuente decontenidos

Page 13: Curso de XSL

Pedro Pastor (Universitat d'Alacant)

Curso XSL 13

Procesamiento XSLT-Cliente

XML

ProcesadorXSLT

IMAGEN

HTMLNavegador Web

Visor de FO

Fuente decontenidos

Page 14: Curso de XSL

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.

Page 15: Curso de XSL

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.

Page 16: Curso de 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”

Page 17: Curso de XSL

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>

Page 18: Curso de XSL

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.

Page 19: Curso de XSL

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

Page 20: Curso de XSL

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

Page 21: Curso de XSL

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.

Page 22: Curso de XSL

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

Page 23: Curso de XSL

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>

Page 24: Curso de XSL

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>

Page 25: Curso de XSL

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>

Page 26: Curso de XSL

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>

Page 27: Curso de XSL

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>

Page 28: Curso de XSL

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.

Page 29: Curso de XSL

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.

Page 30: Curso de XSL

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.

Page 31: Curso de XSL

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.

Page 32: Curso de XSL

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>

Page 33: Curso de XSL

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

Page 34: Curso de XSL

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>

Page 35: Curso de XSL

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.

Page 36: Curso de XSL

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.

Page 37: Curso de XSL

Pedro Pastor (Universitat d'Alacant)

Curso XSL 42

Manejo de tipos de nodos

Text()

Comment()

Pi()

Node()

Page 38: Curso de XSL

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.

Page 39: Curso de XSL

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>

Page 40: Curso de XSL

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>

Page 41: Curso de XSL

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>

Page 42: Curso de XSL

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

Page 43: Curso de XSL

Pedro Pastor (Universitat d'Alacant)

Curso XSL 48

XPath

Lenguaje de expresiones de localización

Page 44: Curso de XSL

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.

Page 45: Curso de XSL

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

Page 46: Curso de XSL

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

Page 47: Curso de XSL

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:

Page 48: Curso de XSL

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

Page 49: Curso de XSL

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

Page 50: Curso de XSL

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.

Page 51: Curso de XSL

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.

Page 52: Curso de XSL

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”).

Page 53: Curso de XSL

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

Page 54: Curso de XSL

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.

Page 55: Curso de XSL

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.

Page 56: Curso de XSL

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.

Page 57: Curso de XSL

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.

Page 58: Curso de XSL

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>

Page 59: Curso de XSL

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>

Page 60: Curso de XSL

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