You are on page 1of 100

Tecnologa XML

Dr. Diego Lz. de Ipia Gz. de Artaza dipina@eside.deusto.es http://paginaspersonales.deusto.es/dipina

Contenidos

XML

DTD Schema
SAX API DOM API

XML Parsing

XSLT
2

Qu es XML?

eXtensible Mark-up Language. Es un metalenguaje que permite disear otros lenguajes (WML, MathML, XHTML,..). Cualquiera puede desarrollar su propio lenguaje de etiquetas adecuado al tipo de aplicacin que ms le convenga. En realidad hay muchas tecnologas basadas en XML (XPath, XLink, XPointer, XSL, ...). XML 1.0 Specification http://www.w3.org/TR/REC-xml
3

HTML y XML

SGML (Standard Generalized Markup Language) HTML es una aplicacin de SGML XML es subconjunto ms fcil de usar de SGML XHTML es una aplicacin de XML

XML describe estructura y semntica


<?xml version=1.0> <!DOCTYPE comedor SYSTEM comedor.dtd> <comedor> <fabricante>Ipia Altzariak</fabricante> <mesa tipo="redonda" madera="arce"> <precio>400</precio> </mesa> <silla madera="arce"> <cantidad>2</cantidad> <calidad>excelente</calidad> <cojin incluido="s"> <color>azul</color> </cojin> <precio>200</precio> </silla> </comedor>
5

HTML describe formato


<html> <head><title>Comedor</title></head> <body> <h1>Comedor</h1> <p>Fabricante: Ipia Altzariak</p> <ul> <li><b>Mesa redonda de madera de arce</b></li> <li><b>Dos sillas de madera de arce</b>, de excelente calidad, con un cojn azul cada una.</li> <li><b>3 sillas de madera de roble</b>.</li> </ul> </body> </html>

Ventajas XML

Una de las mayores utilidades de XML es poder etiquetar los datos con su significado (self-describing data). Permite la estructuracin de la informacin. Ello lleva el tratamiento automtico de la informacin a lmites insospechados. XML es la base de la nueva generacin de aplicaciones web intercambio de datos
7

Usos XML

Sitios web

Permite separar contenido y presentacin


Servicios web Deployment descriptos en servidores J2EE Ant make system
8

Comunicacin <-> intercambio datos

Como configuracin de programas


Componentes documento XML

Los documentos XML constan de:

Instrucciones de procesamiento (processing instructions PI) Declaraciones de tipo de documento Comentarios Elementos Referencias a entidades Secciones CDATA
9

Instrucciones de procesamiento

Las PI son instruccciones para el procesador del documento XML. Siempre hay al menos una PI, que pertenece al prlogo del documento:

<?xml version="1.0"?> <saludo> Hola, mundo! </saludo>

10

Comentarios en XML

Los comentarios no se procesan. Tienen la siguiente sintaxis:

<!-- Esto es un comentario -->

11

Elementos y atributos en XML


Los elementos son los que aportan estructura semntica al documento. Se delimitan por etiquetas de apertura, cierre y etiquetas sin elementos interiores (etiquetas vacas). Las etiquetas de apertura y las vacas suelen venir acompaadas de atributos, que parametrizan el elemento. El valor de los atributos siempre se encierra entre comillas, dobles o simples.

<saludo tipo=coloquial>Hola</saludo>

12

Elementos vs. Atributos

Demasiados atributos hacen que los documentos XML se puedan leer difcilmente. No se puede indicar estructura de documento mediante atributos

<CUSTOMER LAST_NAME="Smith FIRST_NAME="Sam" DATE="October 15, 2001" PURCHASE="Tomatoes" PRICE=1.25" NUMBER="8" />
13

Elementos vs. Atributos (cont)


<CUSTOMER> <NAME> <LAST_NAME>Smith</LAST_NAME> <FIRST_NAME>Sam</FIRST_NAME> </NAME> <DATE>October 15, 2001</DATE> <ORDERS> <ITEM> <PRODUCT>Tomatoes</PRODUCT> <NUMBER>8</NUMBER> <PRICE>$1.25</PRICE> </ITEM> </ORDERS> </CUSTOMER>
14

Referencias a entidades

Las referencias a entidades sirven para insertar un determinado contenido definido previamente.

<!ENTITY Empresa Universidad de Deusto> <pie>Creado por &Empresa;</pie>

15

Cdigos de escape

Existen 5 referencias a entidades predefinidas:


&amp; el carcter & &lt; el carcter < &gt; el carcter > &apos; el carcter ` &quot; el caracter

Se incluyen los caracteres del juego ISO 10646. &#145; &#x2F31;

16

Secciones CDATA

Las secciones CDATA (character data) contienen texto que no debe ser procesado. Se tratan como una secuencia de caracteres sin estructura.

<![CDATA[<saludo>Hola, mundo!</saludo>]]>

17

Gramticas en XML

La gramtica que restringe los elementos vlidos dentro de un nuevo derivado de XML puede expresarse en forma de:

DTD (Document Type Definitions) o Esquemas XML

18

Document Type Definitions (DTDs)


Especifican la estructura y sintaxis de un documento XML Labgroups.dtd

<!ELEMENT lab_group (student_name)*> <!ELEMENT student_name (#PCDATA)> <!ATTLIST student_name dni ID #REQUIRED tutor IDREF #IMPLIED>
19

Document Type Definitions (cont)


<?xml version="1.0"?> <!DOCTYPE mensaje SYSTEM labgroups.dtd"> <lab_group> <student_name dni=44670523"> Josu Artaza </student_name> <student_name dni=44543211"> Nuria Buruaga </student_name> <student_name dni=23554521" tutor=33456211"> Inga Dorsman </student_name> </lab_group>

20

XML Schemas Los DTD no son muy potentes para definir gramticas. Otra forma de hacerlo es con Esquemas XML basados en el propio XML y que soporta ms tipos de datos.

21

Ejemplo Schema

DTD :

<!ELEMENT text (#PCDATA | emph | name)*> <!ATTLIST text timestamp NMTOKEN #REQUIRED>

XML Schema:

<xsd:element name="text"> <xsd:complexType mixed="true"> <xsd:sequence> <xsd:element ref="emph"/> <xsd:element ref="name"/> </xsd:sequence> <xsd:attribute name="timestamp" type="xsd:date" use="required"/> </xsd:complexType> </xsd:element>

22

Ejemplo Schema (cont)

XML Document:

<?xml version="1.0"?> <text timestamp="08:45:00.000">The deadline of <name>ISO3 assigment</name> is <emph>November 21th 2003</emph>. </text>
23

XML bien formado y/o XML vlido

Hay dos tipos de documentos XML: Bien formados: son aquellos que
cumplen las reglas sintcticas de XML

Vlidos: son aquellos que, adems de

ser bien formados, siguen las reglas de una gramtica (definida en un DTD o XML Schema)

24

Reglas para que un documento est bien formado

Para que un documento est bien formado:

Debe tener un prlogo Debe tener una etiqueta raz Las etiquetas se hallan correctamente anidadas Se usan caracteres vlidos y bien aplicados Los valores de los atributos vienen encerrados entre comillas ...

25

Reglas para que un documento sea vlido

Para que un documento sea vlido debe declarar el DTD o XML Schema contra el cual debe validarse. Se hace mediante DOCTYPE, pudiendo ser los DTD pblicos o de sistema.

<!DOCTYPE saludo SYSTEM saludo.dtd> <!DOCTYPE saludo PUBLIC -//Saludos//DTD Lenguaje de saludos//ES http://www.deusto.es/dtds/saludo.dtd>

Tambin se puede insertar el DTD entero en ese punto, en lugar de referenciar al fichero.
26

Proceso de validacin documento XML


Documento XML Well Formed?
si no

DTD?

Procesamiento de la informacin

(opcional)

no

si si

DTD

Error: Documento XML mal formado

Valid?

no

Error: Documento XML no vlido

27

XML Namespaces

El estndar XML tambin define los espacios de nombres (XML Namespaces). Permiten que un mismo documento XML tenga etiquetas de diferentes lenguajes (definidas en diferentes gramticas DTD). As es posible mezclar ms informacin en los documentos, por ejemplo, aadir informacin semntica a un documento XHTML.
28

Ejemplo XML Namespaces


<?xml version="1.0"?> <!DOCTYPE mensaje SYSTEM "mensaje.dtd"> <mensaje> <remite> <dir:direccion xmlns:dir=http://www.deusto.es/direccion> <dir:calle>Avda. Universidades</dir:calle> <dir:localidad cp=40007>Bilbao</dir:localidad> </dir:direccion> <nombre>Diego Ipia</nombre> <email>dipina@eside.deusto.es</email> </remite> <!-- Resto del mensaje XML... --> </mensaje>

29

Lenguajes basados en XML


Chemical Markup Language (CML) Mathematical Markup Language (MathML) Channel Definition Format (CDF) Synchronized Multimedia Integration Language (SMIL) XHTML Scalable Vector Graphics (SVG) SOAP y WSDL VoiceML Wireless Markup Language (WML)
30

Herramientas de XML

Editores

XML parsers

http://www.xmlcooktop.com/ gratis XML Spy, www.xmlspy.com Lee un documento XML Verifica que XML est bien formado Verifican que XML es vlido

XML Validators

expat, parser written in C by James Clark (www.jclark.com) Lark, written in Java (www.textuality.com/Lark/) Apache Jakarta Xerces (www.apache.org)

Verifican que XML es vlido

XML.com's Validator based on Lark (xml.com)


31

Por qu usar XML?

Un documento XML puede ser fcilmente procesado y sus datos manipulados Existen APIs para procesar esos documentos en Java, C, C++, Perl.. (y por supuesto Python) XML define datos portables al igual que Java define cdigo portable
32

XML Parsing
Documento XML Aplicacin XML

Parser XML

XML DTD XML Schema

33

XML Parsing (cont)

SAX

Define interfaz dirigido por eventos (event-driven) para el procesamiento de un documento XML Definido por David Megginson y lista correo XMLDEV : http://www.megginson.com/SAX

DOM

Provee una representacin de un documento XML en forma de un rbol Carga todo el documento XML en memoria http://www.w3.org/DOM
34

Simple API for XML: SAX

Define un interfaz comn implementado por muchos XML Parsers Es el estndar de-facto para procesamiento de XML basado en eventos SAX no es un parseador de XML SAX2 aade soporte para XML Namespaces La especificacin de SAX 2.0/Java est en: http://www.megginson.com/SAX/Java/index. html
35

Caractersticas de SAX

Analizador o parser SAX:

Las aplicaciones necesitan implementar manejadores de los eventos notificados SAX lee secuencialmente de principio a fin, sin cargar todo el documento en memoria Ventaja: eficiencia en cuanto al tiempo y la memoria empleados en el anlisis Desventaja: no disponemos de la estructura en rbol de los documentos
36

Detecta cundo empieza y termina un elemento o el documento, o un conjunto de caracteres, etc. (genera eventos) Gestiona los espacios de nombres Comprueba que el documento est bien formado

Cmo funciona SAX?


XML Document
<?xml version=1.0?> <addressbook> <person> <name>Diego Ipia</name> <email>dipina@deusto.es</email> </person> <person> <name>Asier Perallos</name>

SAX Objects Parser Parser startDocument startElement

Parser Parser Parser Parser Parser Parser Parser Parser

startElement & characters startElement & characters endElement startElement startElement & characters startElement & characters endElement endElement & endDocument 37

<email>perallos@deusto.es</email>
</person> </addressbook>

SAX2/Java Parsers y Drivers


Sun's JAXP http://java.sun.com/xml/ The Apache XML Project's Xerces Java Parser http://xml.apache.org/xerces-j/index.html SAXON XSLT processor http://users.iclway.co.uk/mhkay/saxon/ Oracle XML Developer's Kit for Java http://technet.oracle.com/tech/xml/xdk_java.html ParserAdapter http://www.megginson.com/SAX/Java/index.html

38

Java JAXP

Define clase SAXParserFactory para crear una instancia de un objeto SAXParser (independiente de implementacin SAX parser)

factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser();


Objeto SAXParser define method parse() para arrancar procesamiento Es necesario registrar SAXHandlers con cada SAXParser Los 4 SAX Handlers principales son:

EntityResolver maneja entidades externas DTDHandler maneja eventos de DTD ContentHandler maneja contenido de un documento ErrorHandler maneja errores

39

Arquitectura Java JAXP

40

EntityResolver y DTDHandler

EntityResolver

InputSource resolveEntity(String publicId, String systemId)


void notationDecl(String name, String publicId, String systemId) void unparsedEntityDecl(String name, String publicId, String systemId, String notationName)
41

DTDHandler

ErrorHandler
void error(SAXParserException exception)

Recibe notificacin de error recuperable.

void fatalError(SAXParserException exception)

Recibe notificacin de error fatal.

void warning (SAXParserException exception)

Recibe notificacin de advertencia.


42

ContentHandler
void characters(char[] ch, int start, int length)

Recibe notificacin de caracteres encontrados dentro de un elemento. Recibe notificacin de final de documento. Recibe notificacin de final de elemento.

void endDocument()

void endElement(String namespaceURI, String localName, String qName)

void processingInstruction(String target, String data)

Recibe notificacin cada vez que se encuentra una instruccin de procesamiento.


Recibe objeto para determinar el origen de los eventos en el documento. Recibe notificacin de comienzo de documento. Recibe notificacin de comienzo de elemento
43

void setDocumentLocator(Locator locator)

void startDocument()

void startElement(String namespaceURI, String localName, String qName, Attributes atts)

DefaultHandler

Manejador de contenido que define una serie de mtodos que son invocados cuando analizador detecta determinados eventos al leer documento Clase de conveniencia que puede ser usada como clase base para aplicaciones SAX2 Provee implementaciones por defecto de los mtodos callback de los 4 manejadores de SAX2:

EntityResolver DTDHanler ErrorHandler ContentHandler


44

Ejemplo SAX Parsing I


<?xml version="1.0"?> <CarteleraCine> <Pelicula codigo='2' titulo='Los Otros' director='Alejandro Amenabar' actores='Nicole Kidman'> <Sesion>16:00</Sesion> <Sesion>19:00</Sesion> <Sesion>22:00</Sesion> </Pelicula> <Pelicula codigo='5' titulo='Malena' director='Giuseppe Tornatore' actores='Monica Bellucci, Giuseppe Sulfaro'> <Sesion>16:30</Sesion> <Sesion>19:00</Sesion> </Pelicula> </CarteleraCine>
45

Ejemplo SAX Parsing II


import java.util.Vector; // Imports de JAXP API import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; // Imports de SAX API import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SesionCineSAXParser extends DefaultHandler { // Atributos en los que se cachea el estado de SesionesPelicula // Vector con todas las sesiones por pelicula de este cine private Vector sesionesPeliculas; // Vector con los strings de horarios de todas las sesiones de una pelicula private Vector sesionesStrPelicula; // Metadata asociada a una pelcula private String codigo, titulo, director, actores; // Contenido textual de una sesin private String textoSesion; // Flag que indica si estamos parseando el contenido de texto de una sesin private boolean esTextoSesion = false; ...

46

Ejemplo SAX Parsing III


public SesionCineSAXParser(String url) { // Obtener referencia al parser factory SAXParserFactory factory = SAXParserFactory.newInstance(); // factory.setNamespaceAware(true); // activar namespaces try { // Crear una nueva instancia de un SAX parser SAXParser saxParser = factory.newSAXParser(); // Parsear el documento apuntado por URL saxParser.parse(url, this); } catch (Throwable t) { t.printStackTrace(); } }
47

Ejemplo SAX Parsing IV


public void startElement(String namespaceURI, String lName, String qName,Attributes attrs) throws SAXException { // lname --> contiene el nombre local (sin prefijo), o el string vacio // si procesamiento de namespaces no se lleva a cabo. // qname --> el nombre cualificado (con prefijo), o el string vaco si namespaces no activo if (qName.equals("CarteleraCine")) { this.sesionesPeliculas = new Vector(); } else if (qName.equals("Pelicula")) { // Por cada peli preparar vector con horarios de sesiones this.sesionesStrPelicula = new Vector(); this.codigo = attrs.getValue("codigo"); this.titulo = attrs.getValue("titulo"); this.director = attrs.getValue("director"); this.actores = attrs.getValue("actores"); } else if (qName.equals("Sesion")) { // Slo recoger texto si dentro de sesin this.esTextoSesion = true; this.textoSesion = ""; } }

48

Ejemplo SAX Parsing V


public void characters(char[] ch, int start, int length) { if (this.esTextoSesion == true) { // Slo si estamos dentro de un elemento sesin // recogemos su contenido. // Si el contenido es largo este mtodo callback puede ser // invocado varias veces por el parser SAX this.textoSesion += (new String(ch, start, length)).trim(); } }

49

Ejemplo SAX Parsing VI


public void endElement(String namespaceURI, String sName, String qName) throws SAXException { if (qName.equals("Pelicula")) { // Salvamos los detalles de una pelicula en un objeto Pelicula pelicula = new Pelicula(this.codigo, this.titulo, this.director, this.actores); // Aadimos nuevo objeto SesionesPelicula a vector sesionesPeliculas this.sesionesPeliculas.add(new SesionesPelicula(pelicula, this.sesionesStrPelicula)); } else if (qName.equals("Sesion")) { // Por cada sesin salvar el texto conteniendo horario sesin this.esTextoSesion = false; this.sesionesStrPelicula.add(this.textoSesion); } }

50

Ejemplo SAX Parsing VII


// Mtodo para recuperar vector con // objetos SesionesPelicula creados // en parsing public Vector getSesionesPeliculas() { return this.sesionesPeliculas; }

51

W3C Document Object Model (DOM)

Documentos XML son tratados como un rbol de nodos Cada elemento es un nodo Los elementos hijos y el texto contenido dentro de un elemento son subnodos W3C DOM Site: http://www.w3.org/DOM/ DOM Java Language Binding: http://www.w3.org/TR/DOM-Level-2Core/java-binding.html
52

Caractersticas DOM

Documento se carga totalmente en memoria en una estructura de rbol

Ventaja: fcil acceder a datos en funcin

de la jerarqua de elementos, as como modificar el contenido de los documentos e incluso crearlos desde cero.

Desventaja: coste en tiempo y memoria


que conlleva construir el rbol

53

W3C XML DOM Objects


Element un elemento XML Attribute un attributo Text texto contenido en un elemento o atributo CDATAsection seccin CDATA EntityReference Referencia a una entidad Entity Indicacin de una entidad XML ProcessingInstruction Una instruccin de procesamiento Comment Contenido de un comentario de XML Document El objeto documento DocumentType Referencia al elemento DOCTYPE DocumentFragment Referencia a fragmento de documento Notation Contenedor de una anotacin

54

Objetos relacionados con Nodos

Node un nodo en el rbol de un documento NodeList una lista de objetos nodos NamedNodeMap permite interaccin y acceso por nombre a una coleccin de atributos

55

Documento XML como un rbol de nodos


<?xml version="1.0" encoding="UTF-8"?> <DOCUMENT> <GREETING>Hello from XML</GREETING> <MESSAGE>Welcome to Programing XML in Java</MESSAGE> </DOCUMENT>

56

Documento XML como un rbol de nodos (cont)

57

JAXP DOM

API JAXP de J2SE provee independencia del analizador Para conseguir una instancia de analizador DOM a travs de JAXP usamos DocumentBuilder y DocumentBuilderFactory:

import javax.xml.parsers.*; import org.w3c.dom.*; DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance(); // Crear nueva instancia de DOMBuilder DocumentBuilder parser = fact.newDocumentBuilder();
58

Clase DocumentBuilder

Mtodo parse() analiza el fichero entrada Mtodo Document getDocument() devuelve el documento generado durante parsing

parser.parse(fich); Document doc = parser.getDocument();


59

Mtodos del objecto Document

Attr createAttribute(String name) Crea un atributo con el nombre dado Element createElement(String tagName) Crea un elemento con el nombre dado Text createTextNode(String data) Crea un nodo de texto Element getDocumentElement() Devuelve el elemento raz el documento Element getElementById(String elementId) Devuelve el elemento identificado por elementId NodeList getElementsByTagName(String tagname) Devuelve una lista de elementos identificados por el nombre de etiqueta dado

60

Mtodos del interfaz Node

Node

NamedNodeMap getAttributes() Devuelve lista de atributos en un nodo Node getFirstChild() Devuelve el primer hijo de este nodo Node getFirstChild() Devuelve el ltimo hijo de este nodo NodeList getChildNodes() Devuelve todos los hijos de este nodo Node getParentNode() Devuelve nodo padre del nodo actual short getNodeType() Devuelve tipo de nodo actual String getNodeName() Devuelve nombre nodo String getNodeValue() Devuelve contenido nodo

61

Mtodos del interfaz NodeList y NamedNodeMap

NodeList

int getLength() Devuelve nmero de nodos en lista Node item(int index) Devuelve el nodo identificado por index en una coleccin int getLength() Devuelve nmero de nodos en lista Node getNamedItem(String name) Recupera un nodo dado su nombre Node item(int index) Devuelve el nodo identificado por index en una coleccin
62

NamedNodeMap

Ejemplo DOM I
<?xml version="1.0" encoding="iso-8859-1"?> <Peliculas> <Pelicula codigo='1' titulo='Lo que el viento se llev' director='Victor Fleming' actores='Clark Gable, Vivien Leigh, Leslie Howard'/> <Pelicula codigo='2' titulo='Los Otros' director='Alejandro Amenabar' actores='Nicole Kidman'/> <Pelicula codigo="5" titulo="Malena" director="Giuseppe Tornatore" actores="Monica Bellucci, Giuseppe Sulfaro"/> </Peliculas>
63

Ejemplo DOM II
Root

Pelculas

Pelcula

...

Pelcula

codigo=1

titulo=Lo que el viento se llev

codigo=5

titulo=Malena

diirector=Victor Fleming

actores=Clark Gable, Vivien Leigh, Leslie Howard

diirector=Giuseppe Tornatore

actores=Monica Bellucci, Giuseppe Sulfaro

64

Ejemplo DOM III


import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.IOException; public class EjemploDOM { public static void main(String[] args) { ... DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance(); // Crear nueva instancia de DOMBuilder a travs factoria DocumentBuilder parser = fact.newDocumentBuilder(); parser.parse(fich); Document doc = parser.getDocument(); EjemploDOM.tratarNodo(doc); ... } }
65

Ejemplo DOM IV
public static void tratarNodo(Node nodo) { switch (nodo.getNodeType()) { case Node.DOCUMENT_NODE: break; case Node.ELEMENT_NODE: break; case Node.ATTRIBUTE_NODE: break; case Node.TEXT_NODE: break; case Node.CDATA_SECTION_NODE: break; case Node.PROCESSING_INSTRUCTION_NODE: break; case Node.ENTITY_REFERENCE_NODE: break; case Node.DOCUMENT_TYPE_NODE: break; } } 66

Ejemplo DOM V
case Node.DOCUMENT_NODE: System.out.println("<xml version=\"1.0\">"); Document doc = (Document)nodo; tratarNodo(doc.getDocumentElement()); break;

67

Ejemplo DOM VI
case Node.ELEMENT_NODE: String nombre = nodo.getNodeName(); System.out.print("<" + nombre); NamedNodeMap ats = nodo.getAttributes(); for (int i=0; i<ats.getLength(); i++) { tratarNodo(ats.item(i)); } System.out.println(">"); NodeList hijos = nodo.getChildNodes(); ... // tratar los hijos recursivamente break; case Node.ATTRIBUTE_NODE: System.out.print(" " + nodo.getNodeName() + "=\"" + nodo.getNodeValue() +"\"");
68

Ejemplo DOM VII


case Node.TEXT_NODE: String texto = nodo.getNodeValue().trim(); if (!texto.equals("")) { System.out.println(ind + texto); } break; case Node.CDATA_SECTION_NODE: System.out.println(nodo.getNodeValue()); break;

NodeList peliNodes = document.getElementsByTagName("Pelicula");


69

Extensible Style Language Transformations (XSLT) I

Con la diversidad de lenguajes de presentacin que hay (WML, HTML, cHTML) existen dos alternativas para desarrollar las aplicaciones:

Desarrollar versiones de los procesos de generacin de presentacin (JSP, ASP, CGI,..) para cada lenguaje. Desarrollar solo una versin que genere XML y conversores de XML a los lenguajes de presentacin.
70

Extensible Style Language Transformations (XSLT) II

Dos partes:

Transformation Language (XSLT) Formatting Language (XSL Formatting Objects)

XSLT transforma un documento XML en otro documento XML XSLFO formatea y estiliza documentos en varios modos XSLT W3C Recommendation http://www.w3.org/TR/xslt
71

Operaciones entre rboles en XSL

72

Ventajas y desventajas de XSLT

Ventajas:

No asume un nico formato de salida de documentos Permite manipular de muy diversas maneras un documento XML: reordenar elementos, filtrar, aadir, borrar, etc. Permite acceder a todo el documento XML XSLT es un lenguaje XML
Su utilizacin es ms compleja que un lenguaje de programacin convencional Consume cierta memoria y capacidad de proceso DOM detrs

Desventajas:

73

Usando hojas de estilo XSLT

Para crear una transformacin XSL necesitamos:

El documento XML a transformar (students.xml) La hoja de estilo que especifica la transformacin (students.xsl)

74

Documento XML (students.xml)


<?xml version="1.0"?> <course> <name id="csci_2962">Programming XML in Java</name> <teacher id=di">Diego Ipia</teacher> <student id=ua"> <name>Usue Artaza</name> <hw1>30</hw1> <hw2>70</hw2> <project>80</project> <final>85</final> </student> <student id=iu"> <name>Iigo Urrutia</name> <hw1>80</hw1> <hw2>90</hw2> <project>100</project> <final>40</final> </student> </course>

75

Hoja de estilo XSLT (students.xsl)


<?xml version="1.0"?> <xsl:stylesheet version="1.0 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="course"> <HTML> <HEAD><TITLE>Name of students</TITLE></HEAD> <BODY> <xsl:apply-templates select="student"/> </BODY> </HTML> </xsl:template> <xsl:template match="student"> <P><xsl:value-of select="name"/></P> </xsl:template> </xsl:stylesheet>
76

Resultado de transformacin

(students.html)

<HTML> <HEAD> <TITLE>Name of students</TITLE> </HEAD> <BODY> <P>Usue Artaza</P> <P>Iigo Urrutia</P> </BODY> </HTML>
77

Formas de uso de XSLT


Visualizar directamente en un navegador el documento XML que tiene asociada una hoja XSLT. Ejecutar el procesador XSLT independientemente del navegador. Se le pasan las entradas necesarias (fichero origen y hoja XSLT a utilizar) y genera la salida en un fichero, con el que podemos hacer lo que queramos. Realizar las transformaciones dentro de un programa en el servidor y enviar a los clientes slo el resultado de la transformacin.

78

Aplicaciones usando XSLT


Cliente Internet XSLT Servidor
XML

JSP

Arquitectura en 5 capas dnde el servidor contiene conversores XSLT para generar presentacin en distintos formatos.

Clases Java Base de Datos


79

Ejemplos de Procesadores XSLT existentes


Oracle XML parser for Java http://technet.oracle.com/tech/xml/parser_java2/ Saxon http://users.iclway.co.uk/mhkay/saxon/index.html XT http://www.jclark.com/xml/xt.html Sablotron http://www.gingerall.com/charliebin/get/webGA/act/sablotron.act Microsoft XML Parser http://msdn.microsoft.com/downloads/webtechnology/xml/msx ml.asp Xalan Java http://xml.apache.org/xalan-j/index.html Java JAXP
80

XSLT son documentos XML bien formados


xsl:stylesheet elemento raiz xsl:template cmo transformar un nodo seleccionado

Se asocia con un fragmento del documento a travs de una expresin en XPath Transforma XML entrante en otro fragmento de XML match Atributo para seleccionar nodo

"/" nodo raiz del documento de entrada

Elemento xsl:apply-templates. Aplica los templates definidos para los hijos de un nodo seleccionado
81

Ejemplo XSLT
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999 /XSL/Transform"> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>
82

Elementos XSLT

xsl:value-of permite recuperar el valor de un nodo


Los nodos son seleccionados usando la sintxis de la especificacin XPath XML Slo selecciona el valor del primer estudiante que encuentre

<xsl:template match=course"> <xsl:value-of select=student"/> </xsl:template>

Si queremos seleccionar varios podemos hacer:


<xsl:template match=course"> <xsl:apply-templates select=student"/> </xsl:template> <xsl:template match=student"> <xsl:value-of select="."/> </xsl:template> <xsl:template match=course"> <xsl:for-each select=student"> <xsl:value-of select="."/> </xsl:for-each> </xsl:template>

O usar xsl:for-each

83

Elementos XSLT (cont)

Para realizar distintos procesamientos en funcin de los datos se usa xsl:choose:


Se compone de elementos xsl:when Un elemento opcional xsl:otherwise

Para procesar o no un elemento en funcin de una condicin se usa xsl:if:

Condicin en atributo test

84

Ejemplo
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <HTML> <HEAD> <TITLE>Name of students</TITLE> </HEAD> <BODY> <xsl:apply-templates/> </BODY> </HTML> </xsl:template> <xsl:template match="course"> <xsl:apply-templates select="student"/> </xsl:template> <xsl:template match="student"> <xsl:for-each select="name"><P><xsl:value-of select="."/></P></xsl:for-each> </xsl:template> </xsl:stylesheet>

85

Patrones XPath para el atributo match o select


Seleccionar el nodo raiz: <xsl:template match="/"> ... </xsl:template> Seleccionar un elemento: <xsl:template match="student"> ...</xsl:template> Seleccionar hijos de un elemento: <xsl:template match="course/student"> ... </xsl:template> <xsl:template match="course/*/name"> ... </xsl:template> Seleccionar descendientes de un elemento: <xsl:template match="course//name"> ... </xsl:template>

86

Patrones XPath para el atributo match o select

Seleccionar atributo ttulo:


<xsl:value-of select="./@id"/>

Seleccionar comentarios:
<xsl:template match="comment()"> ... </xsl:template>

Seleccionar elementos de texto:


<xsl:template match="text()"> ... </xsl:template>

Recuperar posicin que ocupa un subelemento dentro de elemento padre


<xsl:value-of select="position()"/>
87

Evaluando condiciones con []

Evaluando si una condicin es cierta:


Si el elemento estudiante tiene un hijo name <xsl:template match="student[name]"> Cualquier elemento que tiene un elemento namE <xsl:template match="*[name]"> Elemento student tiene un sub-elemento hw1 o hw2 element <xsl:template match="student[hw1 | hw2]">

88

Ejemplo XSLT
Problema: Imprimir nombre de alumnos con nota media mayor de 65% <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="course"> <xsl:apply-templates select="student"/> </xsl:template> <xsl:template match="student"> <xsl:variable name="ave"> <xsl:value-of select="(hw1 + hw2 + project + final) div 4"/> </xsl:variable> <xsl:if test="$ave > 65"> Student name="<xsl:value-of select="name"/>" average="<xsl:valueof select="$ave"/>" </xsl:if> </xsl:template> </xsl:stylesheet> 89

Resultado transformacin

Salida (grades70.txt):

Student name=Usue Artaza" average="66,25" Student name=Iigo Urrutia" average="77,5"

90

Java JAXP

Provee clase Transformer para la aplicacin de XSL a un documento XML Como siempre Java JAXP asegura que el cdigo fuente sea el mismo independientemente del parser XSLT subyacente

91

Usando Java JAXP


import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; ...
92

Usando Java JAXP (cont)


public String obtenerCarteleraHMTL() { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { // Usar JAXP DOM para generar Document con fichero xml DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse( "http://localhost:8080/cartelera/Cines.jsp?Funcion=TodaCartelera"); // Generar un objeto transformer para realizar transform XSL TransformerFactory tFactory = TransformerFactory.newInstance(); StreamSource stylesource = new StreamSource( "http://localhost:8080/cartelera/Cartelera.xsl"); Transformer transformer = tFactory.newTransformer(stylesource); DOMSource source = new DOMSource(document); ByteArrayOutputStream outputByteArray = new ByteArrayOutputStream(); StreamResult result = new StreamResult(outputByteArray); transformer.transform(source, result); return outputByteArray.toString(); } catch (Exception e) { e.printStackTrace(); } 93 }

Ejemplo XML + XSL XHTML I


<?xml version="1.0" encoding="iso-8859-1"?> <Cartelera> <Cine codigo='1' nombre='Coliseo Java' direccion='Avda. Abaro' poblacion='Portugalete'> <Pelicula codigo='1' titulo='Lo que el viento se llev' director= 'Victor Fleming ' actores= 'Clark Gable, Vivien Leigh, Leslie Howard '> <Sesion>16:00</Sesion> <Sesion>19:30</Sesion> <Sesion>22:00</Sesion> </Pelicula> <Pelicula codigo='5' titulo='Malena' director='Giuseppe Tornatore' actores='Monica Bellucci, Giuseppe Sulfaro'> <Sesion>16:30</Sesion> <Sesion>19:00</Sesion> </Pelicula> </Cine> </Cartelera>

94

Ejemplo XML + XSL XHTML II


<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform version="1.0"> <xsl:output method="html"/> <xsl:template match="/"> <html> <head> <style type="text/css"> table {font-family: arial, 'sans serif'; margin-left: 15pt;} th,td {font-size: 80%;} th {background-color:#FAEBD7} </style> </head> <body> <table border="1"> <xsl:apply-templates/> </table> </body> </html> </xsl:template>

95

Ejemplo XML + XSL XHTML III


<xsl:template match="Cartelera"> <xsl:for-each select="Cine"> <tr> <th><xsl:text>Cine</xsl:text></th> <th><xsl:text>Direccin</xsl:text></th> <th><xsl:text>Poblacin</xsl:text></th> <th></th> </tr> <tr> <td><xsl:value-of select="./@nombre"/></td> <td><xsl:value-of select="./@direccion"/></td> <td><xsl:value-of select="./@poblacion"/></td> <td><xsl:text></xsl:text></td> </tr> <xsl:for-each select="Pelicula> <tr> <th></th> <th><xsl:text>Pelcula</xsl:text></th> <th><xsl:text>Director</xsl:text></th> <th><xsl:text>Actores</xsl:text></th> </tr> <tr> <td><xsl:text></xsl:text></td> <td><xsl:value-of select="./@titulo"/></td> <td><xsl:value-of select="./@director"/></td> <td><xsl:value-of select="./@actores"/></td> </tr>

96

Ejemplo XML + XSL XHTML IV


<tr> <th></th> <th></th> <th><xsl:text>Sesin</xsl:text></th> <th><xsl:text>Hora</xsl:text></th> </tr> <xsl:for-each select="Sesion"> <tr> <td><xsl:text></xsl:text></td> <td><xsl:text></xsl:text></td> <td><xsl:value-of select="position()"/></td> <td><xsl:value-of select="."/></td> </tr> </xsl:for-each> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet>
97

Ejemplo XML + XSL XHTML V


<html> <body> <table border="1"> <tr> <th>Cine</th> <th>Direcci&oacute;n</th> <th>Poblaci&oacute;n</th> <th></th> </tr> <tr> <td>Coliseo Java</td> <td>Avda. Abaro</td> <td>Portugalete</td> <td></td> </tr> <tr> <th></th> <th>Pel&iacute;cula</th> <th>Director</th> <th>Actores</th> </tr> 98

Ejemplo XML + XSL XHTML VI


<tr> <td></td> <td>Lo que el viento se llev&oacute;</td> <td>Santiago Segura</td> <td>Bo Derek, Al Pacino, Robert Reford</td> </tr> <tr> <th></th> <th></th> <th>Sesi&oacute;n</th> <th>Hora</th> </tr> <tr> <td></td> <td></td> <td>1</td> <td>16:00</td> </tr> <tr> ... </table> <body> </html>

99

Resultado procesamiento XSLT

100

You might also like