Arquitectura XML
Download
Report
Transcript Arquitectura XML
Curso de XSL
Sistema para la visualización de
documentos XML
Pedro Pastor
(Universitat d'Alacant)
Curso XSL
1
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
2
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
3
¿ Por que transformar XML ?
Conversión entre modelos de datos
Aunque 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
4
Cómo se construye una
presentación
1.
2.
Una transformación estructural desde el
documento con la estructura de datos
original hacia una estructura que refleje la
presentación gráfica deseada.
Formateo de la salida, utilizando los
elementos de representación visual
adecuados.
Pedro Pastor
(Universitat d'Alacant)
Curso XSL
5
Proceso de publicación XMLXSL.
Procesador
de
XSLT
Procesador
De XSLFO
Doc.
XML
original
Nueva
Nueva
Nueva
Estructura
Estructura
Estructura
XML + FO
XML
FO
XML + +FO
XSLT
Pedro Pastor
(Universitat d'Alacant)
Curso XSL
HTML
,
PDF,
... 6
Cómo se realiza la
transformación (1)
DocumentoXML
NodoDocumento
catálogo
ELEMENTO
Recurso
ELEMENTO
tipo
ATRIBUTO
"libro"
PCDATA
autor
ELEMENTO
título
ELEMENTO
recurso
ELEMENTO
títituloSec
ELEMENTO
ISBN
ELEMENTO
clasificación
ELEMENTO
nombre
ELEMENTO
apellidos
ELEMENTO
materia
ELEMENTO
"Pedro"
PCDATA
"Pastor"
PCDATA
"XML"
PCDATA
Pedro Pastor
(Universitat d'Alacant)
Curso XSL
materia
ELEMENTO
7
Cómo se realiza la
transformación(2)
DocumentoXML
NodoDocumento
catálogo
ELEMENTO
recurso
ELEMENTO
tipo
ATRIBUTO
"libro"
PCDATA
Pedro Pastor
(Universitat d'Alacant)
título
ELEMENTO
autor
ELEMENTO
clasificación
ELEMENTO
nombre
ELEMENTO
apellidos
ELEMENTO
materia
ELEMENTO
"Pedro"
PCDATA
"Pastor"
PCDATA
"XML"
PCDATA
Curso XSL
materia
ELEMENTO
8
Cómo se realiza la
transformación(3)
DocumentoHTML
NodoDocumento
<ul>
"Lista de libros"
<li>
"Título"
<li>
"Autor"
<li>
"Clasificación"
"XML by example"
"Pedro Pastor"
<ul>
"XML"
Pedro Pastor
(Universitat d'Alacant)
Curso XSL
"Java"
9
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
10
Como se implementa la
transformación
1.
2.
Desarrollo de una aplicación a medida a
partir de los “parsers” XML existentes (SAX,
DOM).
Programación XSLT:
lenguaje declarativo para definir reglas de
transformación genéricas (dependientes de un
contexto).
Pedro Pastor
(Universitat d'Alacant)
Curso XSL
11
Procesamiento XSLT-Servidor
Fuente de
contenidos
Visor de FO
XSL_FO
Procesador
XSLT
HTML
Navegador Web
XML
Pedro Pastor
(Universitat d'Alacant)
XML
Curso XSL
12
Procesamiento XSLT-Cliente
Fuente de
contenidos
Visor de FO
IMAGEN
Procesador
XSLT
XML
Navegador Web
Pedro Pastor
(Universitat d'Alacant)
HTML
Curso XSL
13
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
14
¿ 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
17
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
18
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
19
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
20
XSLT: Elementos “Top-level”.
El elemento <xsl:stylesheet> puede contener como hijos
cualquiera de los siguientes elementos (top-level):
xsl:import
xsl:include
xsl:strip-space
xsl:preserve-space
xsl:output
xsl:key
Pedro Pastor
(Universitat d'Alacant)
Curso XSL
xsl:decimal-format
xsl:namespace-alias
xsl:attribute-set
xsl:variable
xsl:param
xsl:template
21
Definición de <xsl:output>
<!-- Category: top-level-element -->
<xsl:output
method="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
22
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
23
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
25
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
26
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
27
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
28
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
29
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=“elemento”/>
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
preservarle los espacios en blanco.
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 nombre
Se 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
Variables
y 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
Hay trece ejes de localización:
following-sibling::
namespace::
parent::
preceding::
preceding-sibling::
self::
ancestor::
ancestor-or-self::
attribute::
child::
descendant::
descendant-or-self::
following::
Pedro Pastor
(Universitat d'Alacant)
Curso XSL
52
Ejes XPath
Ancestor
preceding
ancestor
parent
following
preceding
preceding-sibling
SELF
following
following-sibling
descendant
child
descendant
child
descendant
Pedro Pastor
(Universitat d'Alacant)
descendant
child
descendant
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 ,
Pedro
Atributos
Pastor
“atrib” de los elementos-hijo=“nomNodo”.
(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 elementosantecesores=“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
Pedro Pastor
(Universitat d'Alacant)
Curso XSL
65