Tecnología XML Dr. Diego Lz. de Ipiña Gz. de Artaza [email_address] http://paginaspersonales.deusto.es/dipina
Contenidos <ul><li>XML </li></ul><ul><ul><li>DTD </li></ul></ul><ul><ul><li>Schema </li></ul></ul><ul><li>XML Parsing </li...
¿Qué es XML? <ul><li>eXtensible Mark-up Language. </li></ul><ul><li>Es un metalenguaje que permite diseñar otros lenguajes...
HTML y XML <ul><li>SGML (Standard Generalized Markup Language)  </li></ul><ul><li>HTML es una aplicación de SGML  </li></u...
XML describe estructura y semántica <ul><li><?xml version=”1.0”> </li></ul><ul><li><!DOCTYPE comedor SYSTEM “comedor.dtd”>...
HTML describe formato <ul><li><html> </li></ul><ul><li><head><title>Comedor</title></head> </li></ul><ul><li><body> </li><...
Ventajas XML <ul><li>Una de las mayores utilidades de XML es poder etiquetar los datos con su significado (self-describing...
Usos XML <ul><li>Sitios web </li></ul><ul><ul><li>Permite separar contenido y presentación </li></ul></ul><ul><li>Comunica...
Componentes documento XML <ul><li>Los documentos XML constan de: </li></ul><ul><ul><li>Instrucciones de procesamiento ( pr...
Instrucciones de procesamiento <ul><li>Las PI son instruccciones para el procesador del documento XML. </li></ul><ul><li>S...
Comentarios en XML <ul><li>Los comentarios no se procesan. </li></ul><ul><li>Tienen la siguiente sintaxis: </li></ul><ul><...
Elementos y atributos en XML <ul><li>Los elementos son los que aportan estructura semántica al documento. </li></ul><ul><l...
Elementos vs. Atributos <ul><li>Demasiados atributos hacen que los documentos XML se puedan leer difícilmente. </li></ul><...
Elementos vs. Atributos (cont) <ul><li><CUSTOMER>  </li></ul><ul><li><NAME>  </li></ul><ul><li><LAST_NAME>Smith</LAST_NAME...
Referencias a entidades <ul><li>Las referencias a entidades sirven para insertar un determinado contenido definido previam...
Códigos de escape <ul><li>Existen 5 referencias a entidades predefinidas: </li></ul><ul><ul><li>&amp; el carácter &  </li>...
Secciones CDATA <ul><li>Las secciones CDATA ( character data ) contienen texto que no debe ser procesado. </li></ul><ul><l...
Gramáticas en XML <ul><li>La gramática que restringe los elementos válidos dentro de un nuevo derivado de XML puede expres...
Document Type Definitions (DTDs) <ul><li>Especifican la estructura y sintaxis de un documento XML </li></ul><ul><li>Labgro...
Document Type Definitions (cont) <ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><!DOCTYPE  mensaje  SYSTEM “lab...
XML Schemas <ul><li>Los DTD no son muy potentes para definir gramáticas. </li></ul><ul><li>Otra forma de hacerlo es con Es...
Ejemplo Schema <ul><li>DTD : </li></ul><ul><li><!ELEMENT text (#PCDATA | emph | name)*>  </li></ul><ul><li><!ATTLIST text ...
Ejemplo Schema (cont) <ul><li>XML Document: </li></ul><ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><text time...
XML bien formado y/o XML válido <ul><li>Hay dos tipos de documentos XML: </li></ul><ul><ul><li>Bien formados : son aquello...
Reglas para que un documento esté bien formado <ul><li>Para que un documento esté bien formado: </li></ul><ul><ul><li>Debe...
Reglas para que un documento sea válido <ul><li>Para que un documento sea válido debe declarar el DTD o XML Schema contra ...
Proceso de validación documento XML
XML Namespaces <ul><li>El estándar XML también define los espacios de nombres ( XML Namespaces ). </li></ul><ul><li>Permit...
Ejemplo XML Namespaces <ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><!DOCTYPE  mensaje  SYSTEM &quot;mensaje....
Lenguajes basados en XML <ul><li>Chemical Markup Language (CML)  </li></ul><ul><li>Mathematical Markup Language (MathML)  ...
Herramientas de XML <ul><li>Editores </li></ul><ul><ul><li>http://www.xmlcooktop.com/     gratis </li></ul></ul><ul><ul><...
¿Por qué usar XML? <ul><li>Un documento XML puede ser fácilmente procesado y sus datos manipulados </li></ul><ul><li>Exist...
XML Parsing
XML Parsing (cont) <ul><li>SAX </li></ul><ul><ul><li>Define  interfaz dirigido por eventos ( event-driven ) para el proces...
Simple API for XML: SAX <ul><li>Define un interfaz común implementado por muchos XML Parsers </li></ul><ul><li>Es el están...
Características de SAX <ul><li>Analizador o parser SAX: </li></ul><ul><ul><li>Detecta cuándo empieza y termina un elemento...
¿Cómo funciona SAX? XML Document <?xml version=“1.0”?> <addressbook> </addressbook> <person> </person> <name>Diego Ipiña</...
SAX2/Java Parsers y Drivers <ul><li>Sun's JAXP http:// java.sun.com /xml/   </li></ul><ul><li>The Apache XML Project's Xer...
Java JAXP <ul><li>Define clase  SAXParserFactory  para crear una instancia de un objeto  SAXParser  (independiente de impl...
Arquitectura Java JAXP
EntityResolver y DTDHandler <ul><li>EntityResolver   </li></ul><ul><ul><li>InputSource resolveEntity(String publicId, Stri...
ErrorHandler <ul><ul><li>void error(SAXParserException exception)   </li></ul></ul><ul><ul><ul><li>Recibe notificación de ...
ContentHandler <ul><li>void characters(char[] ch, int start, int length) </li></ul><ul><ul><li>Recibe notificación de cara...
DefaultHandler <ul><li>Manejador de contenido que define una serie de métodos que son invocados cuando analizador detecta ...
Ejemplo SAX Parsing I <ul><li><?xml version=&quot;1.0&quot;?>  </li></ul><ul><li><CarteleraCine>  </li></ul><ul><li><Pelic...
Ejemplo SAX Parsing II <ul><li>import java.util.Vector; </li></ul><ul><li>// Imports de JAXP API </li></ul><ul><li>import ...
Ejemplo SAX Parsing III <ul><li>public  SesionCineSAXParser (String url) { </li></ul><ul><li>// Obtener referencia al pars...
Ejemplo SAX Parsing IV <ul><li>public void  startElement (String namespaceURI, String lName, </li></ul><ul><li>String qNam...
Ejemplo SAX Parsing V <ul><li>public void  characters (char[] ch, int start, int length) { </li></ul><ul><li>if (this.esTe...
Ejemplo SAX Parsing VI <ul><li>public void  endElement (String namespaceURI,  </li></ul><ul><li>String sName, String qName...
Ejemplo SAX Parsing VII <ul><li>// Método para recuperar vector con  </li></ul><ul><li>// objetos SesionesPelicula creados...
W3C Document Object Model (DOM) <ul><li>Documentos XML son tratados como un árbol de nodos </li></ul><ul><li>Cada elemento...
Características DOM <ul><li>Documento se carga totalmente en memoria en una estructura de árbol </li></ul><ul><li>Ventaja:...
W3C XML DOM Objects <ul><li>Element  – un elemento XML </li></ul><ul><li>Attribute  – un attributo  </li></ul><ul><li>Text...
Objetos relacionados con Nodos <ul><li>Node  – un nodo en el árbol de un documento </li></ul><ul><li>NodeList  – una lista...
Documento XML como un árbol de nodos <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?>  </li></ul><ul><li...
Documento XML como un árbol de nodos (cont)
JAXP DOM <ul><li>API JAXP de J2SE provee independencia del analizador </li></ul><ul><li>Para conseguir una instancia de an...
Clase DocumentBuilder <ul><li>Método  parse()  analiza el fichero entrada </li></ul><ul><li>Método  Document getDocument()...
Métodos del objecto Document <ul><li>Attr createAttribute(String name) Crea un atributo con el nombre dado </li></ul><ul><...
Métodos del interfaz Node <ul><li>Node </li></ul><ul><ul><li>NamedNodeMap getAttributes() Devuelve lista de atributos en u...
Métodos del interfaz NodeList y NamedNodeMap <ul><li>NodeList </li></ul><ul><ul><li>int getLength() Devuelve número de nod...
Ejemplo DOM I <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;iso-8859-1&quot;?> </li></ul><ul><li><Peliculas> </li><...
Ejemplo DOM II
Ejemplo DOM III <ul><li>import org.w3c.dom.Document; </li></ul><ul><li>import org.w3c.dom.NamedNodeMap; </li></ul><ul><li>...
Ejemplo DOM IV <ul><li>public static void  tratarNodo (Node nodo) { </li></ul><ul><li>switch ( nodo.getNodeType() ) { </li...
Ejemplo DOM V <ul><li>case  Node.DOCUMENT_NODE : </li></ul><ul><li>System.out.println(&quot;<xml version=&quot;1.0&quot;>&...
Ejemplo DOM VI <ul><li>case Node.ELEMENT_NODE: </li></ul><ul><li>String nombre = nodo.getNodeName(); </li></ul><ul><li>Sys...
Ejemplo DOM VII <ul><li>case Node.TEXT_NODE: </li></ul><ul><li>String texto = nodo.getNodeValue().trim(); </li></ul><ul><l...
Extensible Style Language Transformations (XSLT) I <ul><li>Con la diversidad de lenguajes de presentación que hay (WML, HT...
Extensible Style Language Transformations (XSLT) II <ul><li>Dos partes:  </li></ul><ul><ul><li>Transformation Language (XS...
Operaciones entre árboles en XSL
Ventajas y desventajas de XSLT <ul><li>Ventajas: </li></ul><ul><ul><li>No asume un único formato de salida de documentos  ...
Usando hojas de estilo XSLT <ul><li>Para crear una transformación XSL necesitamos:  </li></ul><ul><ul><li>El documento XML...
Documento XML (students.xml) <ul><li><?xml version=&quot;1.0&quot;?>  </li></ul><ul><li><course>  </li></ul><ul><li><name ...
Hoja de estilo XSLT (students.xsl) <ul><li><?xml version=&quot;1.0&quot;?>  </li></ul><ul><li><xsl:stylesheet version=&quo...
Resultado de transformación <ul><li>(students.html) </li></ul><ul><li><HTML>  </li></ul><ul><li><HEAD> <TITLE>Name of stud...
Formas de uso de XSLT <ul><li>Visualizar  directamente en un navegador  el documento XML que tiene asociada una hoja XSLT....
Aplicaciones usando XSLT Internet JSP Clases Java Base de Datos Cliente Servidor XML Arquitectura en 5 capas dónde el serv...
Ejemplos de Procesadores XSLT existentes <ul><li>Oracle XML parser for Java http://technet.oracle.com/tech/xml/parser_java...
XSLT son documentos XML bien formados <ul><li>xsl:stylesheet  – elemento raiz  </li></ul><ul><li>xsl:template  – cómo tran...
Ejemplo XSLT <ul><li><?xml version=&quot;1.0&quot;?>  </li></ul><ul><li><xsl:stylesheet version=&quot;1.0&quot;  xmlns:xsl...
Elementos XSLT <ul><li>xsl:value-of  permite recuperar el valor de un nodo </li></ul><ul><ul><li>Los nodos son seleccionad...
Elementos XSLT (cont) <ul><li>Para  realizar distintos procesamientos  en función de los datos se usa  xsl:choose : </li><...
Ejemplo <ul><li><?xml version=&quot;1.0&quot;?>  </li></ul><ul><li><xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot...
Patrones XPath para el atributo  match o select <ul><li>Seleccionar el nodo raiz:  </li></ul><ul><li><xsl:template match=&...
Patrones XPath para el atributo  match o select <ul><li>Seleccionar atributo título: </li></ul><ul><ul><li><xsl:value-of s...
Evaluando condiciones con [] <ul><li>Evaluando si una condición es cierta:  </li></ul><ul><ul><li>Si el elemento estudiant...
Ejemplo XSLT <ul><li>Problema: Imprimir nombre de alumnos con nota media mayor de 65% </li></ul><ul><li><?xml version=&quo...
Resultado transformación <ul><li>Salida (grades70.txt): </li></ul><ul><li>Student name=“Usue Artaza&quot; average=&quot;66...
Java JAXP <ul><li>Provee clase  Transformer  para la aplicación de XSL a un documento XML </li></ul><ul><li>Como siempre J...
Usando Java JAXP <ul><li>import javax.xml.parsers.DocumentBuilder; </li></ul><ul><li>import javax.xml.parsers.DocumentBuil...
Usando Java JAXP (cont) <ul><li>public String  obtenerCarteleraHMTL () { </li></ul><ul><li>DocumentBuilderFactory factory ...
Ejemplo XML + XSL    XHTML I <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;iso-8859-1&quot;?> </li></ul><ul><li><C...
Ejemplo XML + XSL    XHTML II <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;iso-8859-1&quot;?> </li></ul><ul><li><...
Ejemplo XML + XSL    XHTML III <ul><li><xsl:template match=&quot;Cartelera&quot;> </li></ul><ul><li><xsl:for-each select=...
Ejemplo XML + XSL    XHTML IV <ul><li><tr> </li></ul><ul><li><th></th> </li></ul><ul><li><th></th> </li></ul><ul><li><th>...
Ejemplo XML + XSL    XHTML V <ul><li><html> </li></ul><ul><li><body> </li></ul><ul><li><table border=&quot;1&quot;> </li>...
Ejemplo XML + XSL    XHTML VI <ul><li><tr> </li></ul><ul><li><td></td> </li></ul><ul><li><td>Lo que el viento se llev&oac...
Resultado procesamiento XSLT
Upcoming SlideShare
Loading in …5
×

XML de A a Z

8,975 views

Published on

Managing XMLs

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
8,975
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
222
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

XML de A a Z

  1. 1. Tecnología XML Dr. Diego Lz. de Ipiña Gz. de Artaza [email_address] http://paginaspersonales.deusto.es/dipina
  2. 2. Contenidos <ul><li>XML </li></ul><ul><ul><li>DTD </li></ul></ul><ul><ul><li>Schema </li></ul></ul><ul><li>XML Parsing </li></ul><ul><ul><li>SAX API </li></ul></ul><ul><ul><li>DOM API </li></ul></ul><ul><li>XSLT </li></ul>
  3. 3. ¿Qué es XML? <ul><li>eXtensible Mark-up Language. </li></ul><ul><li>Es un metalenguaje que permite diseñar otros lenguajes (WML, MathML, XHTML,..). </li></ul><ul><li>Cualquiera puede desarrollar su propio lenguaje de etiquetas adecuado al tipo de aplicación que más le convenga. </li></ul><ul><li>En realidad hay muchas tecnologías basadas en XML (XPath, XLink, XPointer, XSL, ...). </li></ul><ul><li>XML 1.0 Specification http://www.w3.org/TR/REC-xml </li></ul>
  4. 4. HTML y XML <ul><li>SGML (Standard Generalized Markup Language) </li></ul><ul><li>HTML es una aplicación de SGML </li></ul><ul><li>XML es subconjunto más fácil de usar de SGML </li></ul><ul><li>XHTML es una aplicación de XML </li></ul>
  5. 5. XML describe estructura y semántica <ul><li><?xml version=”1.0”> </li></ul><ul><li><!DOCTYPE comedor SYSTEM “comedor.dtd”> </li></ul><ul><li><comedor> </li></ul><ul><li><fabricante>Ipiña Altzariak</fabricante> </li></ul><ul><li><mesa tipo=&quot;redonda&quot; madera=&quot;arce&quot;> </li></ul><ul><li><precio>€400</precio> </li></ul><ul><li></mesa> </li></ul><ul><li><silla madera=&quot;arce&quot;> </li></ul><ul><li><cantidad>2</cantidad> </li></ul><ul><li><calidad>excelente</calidad> </li></ul><ul><li><cojin incluido=&quot;sí&quot;> </li></ul><ul><li><color>azul</color> </li></ul><ul><li></cojin> </li></ul><ul><li><precio>€200</precio> </li></ul><ul><li></silla> </li></ul><ul><li></comedor> </li></ul>
  6. 6. HTML describe formato <ul><li><html> </li></ul><ul><li><head><title>Comedor</title></head> </li></ul><ul><li><body> </li></ul><ul><li><h1>Comedor</h1> </li></ul><ul><li><p>Fabricante: Ipiña Altzariak</p> </li></ul><ul><li><ul> </li></ul><ul><li><li><b>Mesa redonda de madera de arce</b></li> </li></ul><ul><li><li><b>Dos sillas de madera de arce</b>, de excelente calidad, con un cojín azul cada una.</li> </li></ul><ul><li><li><b>3 sillas de madera de roble</b>. </li> </li></ul><ul><li></ul> </li></ul><ul><li></body> </li></ul><ul><li></html> </li></ul>
  7. 7. Ventajas XML <ul><li>Una de las mayores utilidades de XML es poder etiquetar los datos con su significado (self-describing data). </li></ul><ul><li>Permite la estructuración de la información. </li></ul><ul><li>Ello lleva el tratamiento automático de la información a límites insospechados. </li></ul><ul><li>XML es la base de la nueva generación de aplicaciones web  intercambio de datos </li></ul>
  8. 8. Usos XML <ul><li>Sitios web </li></ul><ul><ul><li>Permite separar contenido y presentación </li></ul></ul><ul><li>Comunicación <-> intercambio datos </li></ul><ul><ul><li>Servicios web </li></ul></ul><ul><li>Como configuración de programas </li></ul><ul><ul><li>Deployment descriptos en servidores J2EE </li></ul></ul><ul><ul><li>Ant make system </li></ul></ul>
  9. 9. Componentes documento XML <ul><li>Los documentos XML constan de: </li></ul><ul><ul><li>Instrucciones de procesamiento ( processing instructions – PI ) </li></ul></ul><ul><ul><li>Declaraciones de tipo de documento </li></ul></ul><ul><ul><li>Comentarios </li></ul></ul><ul><ul><li>Elementos </li></ul></ul><ul><ul><li>Referencias a entidades </li></ul></ul><ul><ul><li>Secciones CDATA </li></ul></ul>
  10. 10. Instrucciones de procesamiento <ul><li>Las PI son instruccciones para el procesador del documento XML. </li></ul><ul><li>Siempre hay al menos una PI, que pertenece al prólogo del documento: </li></ul><ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><saludo> </li></ul><ul><li>Hola, mundo! </li></ul><ul><li></saludo> </li></ul>
  11. 11. Comentarios en XML <ul><li>Los comentarios no se procesan. </li></ul><ul><li>Tienen la siguiente sintaxis: </li></ul><ul><li><!-- Esto es un comentario --> </li></ul>
  12. 12. Elementos y atributos en XML <ul><li>Los elementos son los que aportan estructura semántica al documento. </li></ul><ul><li>Se delimitan por etiquetas de apertura, cierre y etiquetas sin elementos interiores (etiquetas vacías). </li></ul><ul><li>Las etiquetas de apertura y las vacías suelen venir acompañadas de atributos, que parametrizan el elemento. </li></ul><ul><li>El valor de los atributos siempre se encierra entre comillas, dobles o simples. </li></ul><ul><li><saludo tipo=“coloquial”>Hola</saludo> </li></ul>
  13. 13. Elementos vs. Atributos <ul><li>Demasiados atributos hacen que los documentos XML se puedan leer difícilmente. </li></ul><ul><li>No se puede indicar estructura de documento mediante atributos </li></ul><ul><li><CUSTOMER LAST_NAME=&quot;Smith“ </li></ul><ul><li>FIRST_NAME=&quot;Sam&quot; DATE=&quot;October 15, 2001&quot; PURCHASE=&quot;Tomatoes&quot; PRICE=“€1.25&quot; NUMBER=&quot;8&quot; /> </li></ul>
  14. 14. Elementos vs. Atributos (cont) <ul><li><CUSTOMER> </li></ul><ul><li><NAME> </li></ul><ul><li><LAST_NAME>Smith</LAST_NAME> </li></ul><ul><li><FIRST_NAME>Sam</FIRST_NAME> </li></ul><ul><li></NAME> </li></ul><ul><li><DATE>October 15, 2001</DATE> </li></ul><ul><li><ORDERS> </li></ul><ul><li><ITEM> </li></ul><ul><li><PRODUCT>Tomatoes</PRODUCT> </li></ul><ul><li><NUMBER>8</NUMBER> </li></ul><ul><li><PRICE>$1.25</PRICE> </li></ul><ul><li></ITEM> </li></ul><ul><li></ORDERS> </li></ul><ul><li></CUSTOMER> </li></ul>
  15. 15. Referencias a entidades <ul><li>Las referencias a entidades sirven para insertar un determinado contenido definido previamente. </li></ul><ul><li><!ENTITY Empresa “Universidad de Deusto”> </li></ul><ul><li><pie>Creado por &Empresa;</pie> </li></ul>
  16. 16. Códigos de escape <ul><li>Existen 5 referencias a entidades predefinidas: </li></ul><ul><ul><li>&amp; el carácter & </li></ul></ul><ul><ul><li>&lt; el carácter < </li></ul></ul><ul><ul><li>&gt; el carácter > </li></ul></ul><ul><ul><li>&apos; el carácter ` </li></ul></ul><ul><ul><li>&quot; el caracter “ </li></ul></ul><ul><li>Se incluyen los caracteres del juego ISO 10646. </li></ul><ul><li>‘ </li></ul><ul><li>⼱ </li></ul>
  17. 17. Secciones CDATA <ul><li>Las secciones CDATA ( character data ) contienen texto que no debe ser procesado. </li></ul><ul><li>Se tratan como una secuencia de caracteres sin estructura. </li></ul><ul><li><![CDATA[< saludo > Hola, mundo !</ saludo >]]> </li></ul>
  18. 18. Gramáticas en XML <ul><li>La gramática que restringe los elementos válidos dentro de un nuevo derivado de XML puede expresarse en forma de: </li></ul><ul><ul><li>DTD (Document Type Definitions) o </li></ul></ul><ul><ul><li>Esquemas XML </li></ul></ul>
  19. 19. Document Type Definitions (DTDs) <ul><li>Especifican la estructura y sintaxis de un documento XML </li></ul><ul><li>Labgroups.dtd </li></ul><ul><li><!ELEMENT lab_group (student_name)*> </li></ul><ul><li><!ELEMENT student_name (#PCDATA)> </li></ul><ul><li><!ATTLIST student_name </li></ul><ul><li>dni ID #REQUIRED </li></ul><ul><li>tutor IDREF #IMPLIED> </li></ul>
  20. 20. Document Type Definitions (cont) <ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><!DOCTYPE mensaje SYSTEM “labgroups.dtd&quot;> </li></ul><ul><li><lab_group> </li></ul><ul><li><student_name dni=“44670523&quot;> </li></ul><ul><li>Josu Artaza </li></ul><ul><li></student_name> </li></ul><ul><li><student_name dni=“44543211&quot;> </li></ul><ul><li>Nuria Buruaga </li></ul><ul><li></student_name> </li></ul><ul><li><student_name dni=“23554521&quot; tutor=“33456211&quot;> </li></ul><ul><li>Inga Dorsman </li></ul><ul><li></student_name> </li></ul><ul><li></lab_group> </li></ul>
  21. 21. XML Schemas <ul><li>Los DTD no son muy potentes para definir gramáticas. </li></ul><ul><li>Otra forma de hacerlo es con Esquemas XML basados en el propio XML y que soporta más tipos de datos. </li></ul>
  22. 22. Ejemplo Schema <ul><li>DTD : </li></ul><ul><li><!ELEMENT text (#PCDATA | emph | name)*> </li></ul><ul><li><!ATTLIST text timestamp NMTOKEN #REQUIRED> </li></ul><ul><li>XML Schema: </li></ul><ul><li><xsd:element name=&quot;text&quot;> </li></ul><ul><li><xsd:complexType mixed=&quot;true&quot;> </li></ul><ul><li><xsd:sequence> </li></ul><ul><li><xsd:element ref=&quot;emph&quot;/> </li></ul><ul><li><xsd:element ref=&quot;name&quot;/> </li></ul><ul><li></xsd:sequence> </li></ul><ul><li><xsd:attribute name=&quot;timestamp&quot; type=&quot;xsd:date&quot; use=&quot;required&quot;/> </li></ul><ul><li></xsd:complexType> </li></ul><ul><li></xsd:element> </li></ul>
  23. 23. Ejemplo Schema (cont) <ul><li>XML Document: </li></ul><ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><text timestamp=&quot;08:45:00.000&quot;>The deadline of <name>ISO3 assigment</name> is <emph>November 21th 2003</emph>. </li></ul><ul><li></text> </li></ul>
  24. 24. XML bien formado y/o XML válido <ul><li>Hay dos tipos de documentos XML: </li></ul><ul><ul><li>Bien formados : son aquellos que cumplen las reglas sintácticas de XML </li></ul></ul><ul><ul><li>Válidos : son aquellos que, además de ser bien formados, siguen las reglas de una gramática (definida en un DTD o XML Schema) </li></ul></ul>
  25. 25. Reglas para que un documento esté bien formado <ul><li>Para que un documento esté bien formado: </li></ul><ul><ul><li>Debe tener un prólogo </li></ul></ul><ul><ul><li>Debe tener una etiqueta raíz </li></ul></ul><ul><ul><li>Las etiquetas se hallan correctamente anidadas </li></ul></ul><ul><ul><li>Se usan caracteres válidos y bien aplicados </li></ul></ul><ul><ul><li>Los valores de los atributos vienen encerrados entre comillas </li></ul></ul><ul><ul><li>... </li></ul></ul>
  26. 26. Reglas para que un documento sea válido <ul><li>Para que un documento sea válido debe declarar el DTD o XML Schema contra el cual debe validarse. </li></ul><ul><li>Se hace mediante DOCTYPE, pudiendo ser los DTD públicos o de sistema. </li></ul><ul><li><!DOCTYPE saludo SYSTEM “saludo.dtd”> </li></ul><ul><li><!DOCTYPE saludo PUBLIC “-//Saludos//DTD Lenguaje de saludos//ES” “http://www.deusto.es/dtds/saludo.dtd”> </li></ul><ul><li>También se puede insertar el DTD entero en ese punto, en lugar de referenciar al fichero. </li></ul>
  27. 27. Proceso de validación documento XML
  28. 28. XML Namespaces <ul><li>El estándar XML también define los espacios de nombres ( XML Namespaces ). </li></ul><ul><li>Permiten que un mismo documento XML tenga etiquetas de diferentes lenguajes (definidas en diferentes gramáticas DTD). </li></ul><ul><li>Así es posible mezclar más información en los documentos, por ejemplo, añadir información semántica a un documento XHTML. </li></ul>
  29. 29. Ejemplo XML Namespaces <ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><!DOCTYPE mensaje SYSTEM &quot;mensaje.dtd&quot;> </li></ul><ul><li><mensaje> </li></ul><ul><li><remite> </li></ul><ul><li><dir:direccion xmlns:dir=“http://www.deusto.es/direccion”> </li></ul><ul><li><dir:calle>Avda. Universidades</dir:calle> </li></ul><ul><li><dir:localidad cp=“40007”>Bilbao</dir:localidad> </li></ul><ul><li></dir:direccion> </li></ul><ul><li><nombre>Diego Ipiña</nombre> </li></ul><ul><li><email>dipina@eside.deusto.es</email> </li></ul><ul><li></remite> </li></ul><ul><li><!-- Resto del mensaje XML... --> </li></ul><ul><li></mensaje> </li></ul>
  30. 30. Lenguajes basados en XML <ul><li>Chemical Markup Language (CML) </li></ul><ul><li>Mathematical Markup Language (MathML) </li></ul><ul><li>Channel Definition Format (CDF) </li></ul><ul><li>Synchronized Multimedia Integration Language (SMIL) </li></ul><ul><li>XHTML </li></ul><ul><li>Scalable Vector Graphics (SVG) </li></ul><ul><li>SOAP y WSDL </li></ul><ul><li>VoiceML </li></ul><ul><li>Wireless Markup Language (WML) </li></ul>
  31. 31. Herramientas de XML <ul><li>Editores </li></ul><ul><ul><li>http://www.xmlcooktop.com/  gratis </li></ul></ul><ul><ul><li>XML Spy, www.xmlspy.com </li></ul></ul><ul><li>XML parsers </li></ul><ul><ul><li>Lee un documento XML </li></ul></ul><ul><ul><li>Verifica que XML está bien formado </li></ul></ul><ul><ul><li>Verifican que XML es válido </li></ul></ul><ul><ul><ul><li>expat , parser written in C by James Clark ( www.jclark.com ) </li></ul></ul></ul><ul><ul><ul><li>Lark, written in Java ( www.textuality.com /Lark/ ) </li></ul></ul></ul><ul><ul><ul><li>Apache Jakarta Xerces ( www.apache.org ) </li></ul></ul></ul><ul><li>XML Validators </li></ul><ul><ul><li>Verifican que XML es válido </li></ul></ul><ul><ul><ul><li>XML.com's Validator based on Lark (xml.com) </li></ul></ul></ul>
  32. 32. ¿Por qué usar XML? <ul><li>Un documento XML puede ser fácilmente procesado y sus datos manipulados </li></ul><ul><li>Existen APIs para procesar esos documentos en Java, C, C++, Perl.. (y por supuesto Python) </li></ul><ul><li>XML define datos portables al igual que Java define código portable </li></ul>
  33. 33. XML Parsing
  34. 34. XML Parsing (cont) <ul><li>SAX </li></ul><ul><ul><li>Define interfaz dirigido por eventos ( event-driven ) para el procesamiento de un documento XML </li></ul></ul><ul><ul><li>Definido por David Megginson y lista correo XML-DEV : http:// www.megginson.com /SAX </li></ul></ul><ul><li>DOM </li></ul><ul><ul><li>Provee una representación de un documento XML en forma de un árbol </li></ul></ul><ul><ul><li>Carga todo el documento XML en memoria </li></ul></ul><ul><ul><li>http://www.w3.org/DOM </li></ul></ul>
  35. 35. Simple API for XML: SAX <ul><li>Define un interfaz común implementado por muchos XML Parsers </li></ul><ul><li>Es el estándar de-facto para procesamiento de XML basado en eventos </li></ul><ul><li>SAX no es un parseador de XML </li></ul><ul><li>SAX2 añade soporte para XML Namespaces </li></ul><ul><li>La especificación de SAX 2.0/Java está en: http:// www.megginson.com/SAX/Java/index.html </li></ul>
  36. 36. Características de SAX <ul><li>Analizador o parser SAX: </li></ul><ul><ul><li>Detecta cuándo empieza y termina un elemento o el documento, o un conjunto de caracteres, etc. (genera eventos) </li></ul></ul><ul><ul><li>Gestiona los espacios de nombres </li></ul></ul><ul><ul><li>Comprueba que el documento está bien formado </li></ul></ul><ul><li>Las aplicaciones necesitan implementar manejadores de los eventos notificados </li></ul><ul><li>SAX lee secuencialmente de principio a fin, sin cargar todo el documento en memoria </li></ul><ul><li>Ventaja: eficiencia en cuanto al tiempo y la memoria empleados en el análisis </li></ul><ul><li>Desventaja: no disponemos de la estructura en árbol de los documentos </li></ul>
  37. 37. ¿Cómo funciona SAX? XML Document <?xml version=“1.0”?> <addressbook> </addressbook> <person> </person> <name>Diego Ipiña</name> <email>dipina@deusto.es</email> <person> </person> <name>Asier Perallos</name> <email>perallos@deusto.es</email> SAX Objects Parser startDocument Parser startElement Parser startElement & characters Parser startElement & characters Parser endElement Parser startElement Parser startElement & characters Parser startElement & characters Parser endElement Parser endElement & endDocument
  38. 38. SAX2/Java Parsers y Drivers <ul><li>Sun's JAXP http:// java.sun.com /xml/ </li></ul><ul><li>The Apache XML Project's Xerces Java Parser http://xml.apache.org/xerces-j/index.html </li></ul><ul><li>SAXON XSLT processor http:// users.iclway.co.uk/mhkay/saxon / </li></ul><ul><li>Oracle XML Developer's Kit for Java http:// technet.oracle.com/tech/xml/xdk_java.html </li></ul><ul><li>ParserAdapter http:// www.megginson.com/SAX/Java/index.html </li></ul>
  39. 39. Java JAXP <ul><li>Define clase SAXParserFactory para crear una instancia de un objeto SAXParser (independiente de implementación SAX parser) </li></ul><ul><li>factory = SAXParserFactory.newInstance(); </li></ul><ul><li>SAXParser saxParser = factory.newSAXParser(); </li></ul><ul><li>Objeto SAXParser define method parse() para arrancar procesamiento </li></ul><ul><li>Es necesario registrar SAXHandlers con cada SAXParser </li></ul><ul><li>Los 4 SAX Handlers principales son: </li></ul><ul><ul><li>EntityResolver – maneja entidades externas </li></ul></ul><ul><ul><li>DTDHandler – maneja eventos de DTD </li></ul></ul><ul><ul><li>ContentHandler – maneja contenido de un documento </li></ul></ul><ul><ul><li>ErrorHandler – maneja errores </li></ul></ul>
  40. 40. Arquitectura Java JAXP
  41. 41. EntityResolver y DTDHandler <ul><li>EntityResolver </li></ul><ul><ul><li>InputSource resolveEntity(String publicId, String systemId) </li></ul></ul><ul><li>DTDHandler </li></ul><ul><ul><li>void notationDecl(String name, String publicId, String systemId) </li></ul></ul><ul><ul><li>void unparsedEntityDecl(String name, String publicId, String systemId, String notationName) </li></ul></ul>
  42. 42. ErrorHandler <ul><ul><li>void error(SAXParserException exception) </li></ul></ul><ul><ul><ul><li>Recibe notificación de error recuperable. </li></ul></ul></ul><ul><ul><li>void fatalError(SAXParserException exception) </li></ul></ul><ul><ul><ul><li>Recibe notificación de error fatal. </li></ul></ul></ul><ul><ul><li>void warning (SAXParserException exception) </li></ul></ul><ul><ul><ul><li>Recibe notificación de advertencia . </li></ul></ul></ul>
  43. 43. ContentHandler <ul><li>void characters(char[] ch, int start, int length) </li></ul><ul><ul><li>Recibe notificación de caracteres encontrados dentro de un elemento. </li></ul></ul><ul><li>void endDocument() </li></ul><ul><ul><li>Recibe notificación de final de documento. </li></ul></ul><ul><li>void endElement(String namespaceURI, String localName, String qName) </li></ul><ul><ul><li>Recibe notificación de final de elemento. </li></ul></ul><ul><li>void processingInstruction(String target, String data) </li></ul><ul><ul><li>Recibe notificación cada vez que se encuentra una instrucción de procesamiento. </li></ul></ul><ul><li>void setDocumentLocator(Locator locator) </li></ul><ul><ul><li>Recibe objeto para determinar el origen de los eventos en el documento. </li></ul></ul><ul><li>void startDocument() </li></ul><ul><ul><li>Recibe notificación de comienzo de documento. </li></ul></ul><ul><li>void startElement(String namespaceURI, String localName, String qName, Attributes atts) </li></ul><ul><ul><li>Recibe notificación de comienzo de elemento </li></ul></ul>
  44. 44. DefaultHandler <ul><li>Manejador de contenido que define una serie de métodos que son invocados cuando analizador detecta determinados eventos al leer documento </li></ul><ul><li>Clase de conveniencia que puede ser usada como clase base para aplicaciones SAX2 </li></ul><ul><li>Provee implementaciones por defecto de los métodos callback de los 4 manejadores de SAX2: </li></ul><ul><ul><li>EntityResolver </li></ul></ul><ul><ul><li>DTDHanler </li></ul></ul><ul><ul><li>ErrorHandler </li></ul></ul><ul><ul><li>ContentHandler </li></ul></ul>
  45. 45. Ejemplo SAX Parsing I <ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><CarteleraCine> </li></ul><ul><li><Pelicula codigo='2' titulo='Los Otros' </li></ul><ul><li>director='Alejandro Amenabar' </li></ul><ul><li>actores='Nicole Kidman'> </li></ul><ul><li><Sesion>16:00</Sesion> </li></ul><ul><li><Sesion>19:00</Sesion> </li></ul><ul><li><Sesion>22:00</Sesion> </li></ul><ul><li></Pelicula> </li></ul><ul><li><Pelicula codigo='5' titulo='Malena' </li></ul><ul><li>director='Giuseppe Tornatore' </li></ul><ul><li>actores='Monica Bellucci, Giuseppe Sulfaro'> </li></ul><ul><li><Sesion>16:30</Sesion> </li></ul><ul><li><Sesion>19:00</Sesion> </li></ul><ul><li></Pelicula> </li></ul><ul><li></CarteleraCine> </li></ul>
  46. 46. Ejemplo SAX Parsing II <ul><li>import java.util.Vector; </li></ul><ul><li>// Imports de JAXP API </li></ul><ul><li>import javax.xml.parsers.SAXParserFactory; </li></ul><ul><li>import javax.xml.parsers.ParserConfigurationException; </li></ul><ul><li>import javax.xml.parsers.SAXParser; </li></ul><ul><li>// Imports de SAX API </li></ul><ul><li>import org.xml.sax.Attributes; </li></ul><ul><li>import org.xml.sax.SAXException; </li></ul><ul><li>import org.xml.sax.helpers.DefaultHandler; </li></ul><ul><li>public class SesionCineSAXParser extends DefaultHandler { </li></ul><ul><li>// Atributos en los que se cachea el estado de SesionesPelicula </li></ul><ul><li>// Vector con todas las sesiones por pelicula de este cine </li></ul><ul><li>private Vector sesionesPeliculas; </li></ul><ul><li>// Vector con los strings de horarios de todas las sesiones de una pelicula </li></ul><ul><li>private Vector sesionesStrPelicula; </li></ul><ul><li>// Metadata asociada a una película </li></ul><ul><li>private String codigo, titulo, director, actores; </li></ul><ul><li>// Contenido textual de una sesión </li></ul><ul><li>private String textoSesion; </li></ul><ul><li>// Flag que indica si estamos parseando el contenido de texto de una sesión </li></ul><ul><li>private boolean esTextoSesion = false; </li></ul><ul><li>... </li></ul>
  47. 47. Ejemplo SAX Parsing III <ul><li>public SesionCineSAXParser (String url) { </li></ul><ul><li>// Obtener referencia al parser factory </li></ul><ul><li>SAXParserFactory factory = SAXParserFactory.newInstance(); </li></ul><ul><li>// factory.setNamespaceAware(true); // activar namespaces </li></ul><ul><li>try { </li></ul><ul><li>// Crear una nueva instancia de un SAX parser </li></ul><ul><li>SAXParser saxParser = factory.newSAXParser(); </li></ul><ul><li>// Parsear el documento apuntado por URL </li></ul><ul><li>saxParser.parse(url, this); </li></ul><ul><li>} catch (Throwable t) { </li></ul><ul><li>t.printStackTrace(); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  48. 48. Ejemplo SAX Parsing IV <ul><li>public void startElement (String namespaceURI, String lName, </li></ul><ul><li>String qName,Attributes attrs) </li></ul><ul><li>throws SAXException { </li></ul><ul><li>// lname --> contiene el nombre local (sin prefijo), o el string vacio </li></ul><ul><li>// si procesamiento de namespaces no se lleva a cabo. </li></ul><ul><li>// qname --> el nombre cualificado (con prefijo), o el string vacío si namespaces no activo </li></ul><ul><li>if (qName.equals(&quot;CarteleraCine&quot;)) { </li></ul><ul><li>this.sesionesPeliculas = new Vector(); </li></ul><ul><li>} else if (qName.equals(&quot;Pelicula&quot;)) { </li></ul><ul><li>// Por cada peli preparar vector con horarios de sesiones </li></ul><ul><li>this.sesionesStrPelicula = new Vector(); </li></ul><ul><li>this.codigo = attrs.getValue(&quot;codigo&quot;); </li></ul><ul><li>this.titulo = attrs.getValue(&quot;titulo&quot;); </li></ul><ul><li>this.director = attrs.getValue(&quot;director&quot;); </li></ul><ul><li>this.actores = attrs.getValue(&quot;actores&quot;); </li></ul><ul><li>} else if (qName.equals(&quot;Sesion&quot;)) { </li></ul><ul><li>// Sólo recoger texto si dentro de sesión </li></ul><ul><li>this.esTextoSesion = true; </li></ul><ul><li>this.textoSesion = &quot;&quot;; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  49. 49. Ejemplo SAX Parsing V <ul><li>public void characters (char[] ch, int start, int length) { </li></ul><ul><li>if (this.esTextoSesion == true) { </li></ul><ul><li>// Sólo si estamos dentro de un elemento sesión </li></ul><ul><li>// recogemos su contenido. </li></ul><ul><li>// Si el contenido es largo este método callback puede ser </li></ul><ul><li>// invocado varias veces por el parser SAX </li></ul><ul><li>this.textoSesion += (new String(ch, start, length)).trim(); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  50. 50. Ejemplo SAX Parsing VI <ul><li>public void endElement (String namespaceURI, </li></ul><ul><li>String sName, String qName) </li></ul><ul><li>throws SAXException { </li></ul><ul><li>if (qName.equals(&quot;Pelicula&quot;)) { </li></ul><ul><li>// Salvamos los detalles de una pelicula en un objeto </li></ul><ul><li>Pelicula pelicula = new Pelicula(this.codigo, this.titulo, </li></ul><ul><li>this.director, this.actores); </li></ul><ul><li>// Añadimos nuevo objeto SesionesPelicula a vector sesionesPeliculas </li></ul><ul><li>this.sesionesPeliculas.add(new SesionesPelicula(pelicula, </li></ul><ul><li>this.sesionesStrPelicula)); </li></ul><ul><li>} else if (qName.equals(&quot;Sesion&quot;)) { </li></ul><ul><li>// Por cada sesión salvar el texto conteniendo horario sesión </li></ul><ul><li>this.esTextoSesion = false; </li></ul><ul><li>this.sesionesStrPelicula.add(this.textoSesion); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  51. 51. Ejemplo SAX Parsing VII <ul><li>// Método para recuperar vector con </li></ul><ul><li>// objetos SesionesPelicula creados </li></ul><ul><li>// en parsing </li></ul><ul><li>public Vector getSesionesPeliculas () { </li></ul><ul><li>return this.sesionesPeliculas; </li></ul><ul><li>} </li></ul>
  52. 52. W3C Document Object Model (DOM) <ul><li>Documentos XML son tratados como un árbol de nodos </li></ul><ul><li>Cada elemento es un “nodo” </li></ul><ul><li>Los elementos hijos y el texto contenido dentro de un elemento son subnodos </li></ul><ul><li>W3C DOM Site: http://www.w3.org/DOM/ </li></ul><ul><li>DOM Java Language Binding: http://www.w3.org/TR/DOM-Level-2-Core/java-binding.html </li></ul>
  53. 53. Características DOM <ul><li>Documento se carga totalmente en memoria en una estructura de árbol </li></ul><ul><li>Ventaja: fácil acceder a datos en función de la jerarquía de elementos, así como modificar el contenido de los documentos e incluso crearlos desde cero. </li></ul><ul><li>Desventaja: coste en tiempo y memoria que conlleva construir el árbol </li></ul>
  54. 54. W3C XML DOM Objects <ul><li>Element – un elemento XML </li></ul><ul><li>Attribute – un attributo </li></ul><ul><li>Text – texto contenido en un elemento o atributo </li></ul><ul><li>CDATAsection – sección CDATA </li></ul><ul><li>EntityReference – Referencia a una entidad </li></ul><ul><li>Entity – Indicación de una entidad XML </li></ul><ul><li>ProcessingInstruction – Una instrucción de procesamiento </li></ul><ul><li>Comment – Contenido de un comentario de XML </li></ul><ul><li>Document – El objeto documento </li></ul><ul><li>DocumentType – Referencia al elemento DOCTYPE </li></ul><ul><li>DocumentFragment – Referencia a fragmento de documento </li></ul><ul><li>Notation – Contenedor de una anotación </li></ul>
  55. 55. Objetos relacionados con Nodos <ul><li>Node – un nodo en el árbol de un documento </li></ul><ul><li>NodeList – una lista de objetos nodos </li></ul><ul><li>NamedNodeMap – permite interacción y acceso por nombre a una colección de atributos </li></ul>
  56. 56. Documento XML como un árbol de nodos <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> </li></ul><ul><li><DOCUMENT> </li></ul><ul><li><GREETING>Hello from XML</GREETING> </li></ul><ul><li><MESSAGE>Welcome to Programing XML in Java</MESSAGE> </li></ul><ul><li></DOCUMENT> </li></ul>
  57. 57. Documento XML como un árbol de nodos (cont)
  58. 58. JAXP DOM <ul><li>API JAXP de J2SE provee independencia del analizador </li></ul><ul><li>Para conseguir una instancia de analizador DOM a través de JAXP usamos D ocumentBuilder y DocumentBuilderFactory : </li></ul><ul><li>import javax.xml.parsers.*; </li></ul><ul><li>import org.w3c.dom.*; </li></ul><ul><li>DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance(); </li></ul><ul><li>// Crear nueva instancia de DOMBuilder </li></ul><ul><li>DocumentBuilder parser = fact.newDocumentBuilder(); </li></ul>
  59. 59. Clase DocumentBuilder <ul><li>Método parse() analiza el fichero entrada </li></ul><ul><li>Método Document getDocument() devuelve el documento generado durante parsing </li></ul><ul><li>parser.parse(fich); </li></ul><ul><li>Document doc = parser.getDocument(); </li></ul>
  60. 60. Métodos del objecto Document <ul><li>Attr createAttribute(String name) Crea un atributo con el nombre dado </li></ul><ul><li>Element createElement(String tagName) Crea un elemento con el nombre dado </li></ul><ul><li>Text createTextNode(String data) Crea un nodo de texto </li></ul><ul><li>Element getDocumentElement() Devuelve el elemento raíz el documento </li></ul><ul><li>Element getElementById(String elementId) Devuelve el elemento identificado por elementId </li></ul><ul><li>NodeList getElementsByTagName(String tagname) Devuelve una lista de elementos identificados por el nombre de etiqueta dado </li></ul>
  61. 61. Métodos del interfaz Node <ul><li>Node </li></ul><ul><ul><li>NamedNodeMap getAttributes() Devuelve lista de atributos en un nodo </li></ul></ul><ul><ul><li>Node getFirstChild() Devuelve el primer hijo de este nodo </li></ul></ul><ul><ul><li>Node getFirstChild() Devuelve el último hijo de este nodo </li></ul></ul><ul><ul><li>NodeList getChildNodes() Devuelve todos los hijos de este nodo </li></ul></ul><ul><ul><li>Node getParentNode() Devuelve nodo padre del nodo actual </li></ul></ul><ul><ul><li>short getNodeType() Devuelve tipo de nodo actual </li></ul></ul><ul><ul><li>String getNodeName() Devuelve nombre nodo </li></ul></ul><ul><ul><li>String getNodeValue() Devuelve contenido nodo </li></ul></ul>
  62. 62. Métodos del interfaz NodeList y NamedNodeMap <ul><li>NodeList </li></ul><ul><ul><li>int getLength() Devuelve número de nodos en lista </li></ul></ul><ul><ul><li>Node item(int index ) Devuelve el nodo identificado por index en una colección </li></ul></ul><ul><li>NamedNodeMap </li></ul><ul><ul><li>int getLength() Devuelve número de nodos en lista </li></ul></ul><ul><ul><li>Node getNamedItem(String name) Recupera un nodo dado su nombre </li></ul></ul><ul><ul><li>Node item(int index ) Devuelve el nodo identificado por index en una colección </li></ul></ul>
  63. 63. Ejemplo DOM I <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;iso-8859-1&quot;?> </li></ul><ul><li><Peliculas> </li></ul><ul><li><Pelicula codigo='1' titulo='Lo que el viento se llevó' </li></ul><ul><li>director='Victor Fleming' </li></ul><ul><li>actores='Clark Gable, Vivien Leigh, Leslie Howard'/> </li></ul><ul><li><Pelicula codigo='2' titulo='Los Otros' </li></ul><ul><li>director='Alejandro Amenabar' </li></ul><ul><li>actores='Nicole Kidman'/> </li></ul><ul><li><Pelicula codigo=&quot;5&quot; titulo=&quot;Malena&quot; </li></ul><ul><li>director=&quot;Giuseppe Tornatore&quot; </li></ul><ul><li>actores=&quot;Monica Bellucci, Giuseppe Sulfaro&quot;/> </li></ul><ul><li></Peliculas> </li></ul>
  64. 64. Ejemplo DOM II
  65. 65. Ejemplo DOM III <ul><li>import org.w3c.dom.Document; </li></ul><ul><li>import org.w3c.dom.NamedNodeMap; </li></ul><ul><li>import org.w3c.dom.Node; </li></ul><ul><li>import org.w3c.dom.NodeList; </li></ul><ul><li>import java.io.IOException; </li></ul><ul><li>public class EjemploDOM { </li></ul><ul><li>public static void main(String[] args) { </li></ul><ul><li>... </li></ul><ul><li>DocumentBuilderFactory fact = </li></ul><ul><li>DocumentBuilderFactory.newInstance(); </li></ul><ul><li>// Crear nueva instancia de DOMBuilder a través factoria </li></ul><ul><li>DocumentBuilder parser = fact.newDocumentBuilder(); </li></ul><ul><li>parser.parse(fich); </li></ul><ul><li>Document doc = parser.getDocument(); </li></ul><ul><li>EjemploDOM.tratarNodo(doc); </li></ul><ul><li>... </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  66. 66. Ejemplo DOM IV <ul><li>public static void tratarNodo (Node nodo) { </li></ul><ul><li>switch ( nodo.getNodeType() ) { </li></ul><ul><li>case Node.DOCUMENT_NODE: </li></ul><ul><li>break; </li></ul><ul><li>case Node.ELEMENT_NODE: </li></ul><ul><li>break; </li></ul><ul><li>case Node.ATTRIBUTE_NODE: </li></ul><ul><li>break; </li></ul><ul><li>case Node.TEXT_NODE: </li></ul><ul><li>break; </li></ul><ul><li>case Node.CDATA_SECTION_NODE: </li></ul><ul><li>break; </li></ul><ul><li>case Node.PROCESSING_INSTRUCTION_NODE: </li></ul><ul><li>break; </li></ul><ul><li>case Node.ENTITY_REFERENCE_NODE: </li></ul><ul><li>break; </li></ul><ul><li>case Node.DOCUMENT_TYPE_NODE: </li></ul><ul><li>break; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  67. 67. Ejemplo DOM V <ul><li>case Node.DOCUMENT_NODE : </li></ul><ul><li>System.out.println(&quot;<xml version=&quot;1.0&quot;>&quot;); </li></ul><ul><li>Document doc = (Document)nodo; </li></ul><ul><li>tratarNodo(doc.getDocumentElement()); </li></ul><ul><li>break; </li></ul>
  68. 68. Ejemplo DOM VI <ul><li>case Node.ELEMENT_NODE: </li></ul><ul><li>String nombre = nodo.getNodeName(); </li></ul><ul><li>System.out.print(&quot;<&quot; + nombre); </li></ul><ul><li>NamedNodeMap ats = nodo.getAttributes(); </li></ul><ul><li>for (int i=0; i<ats.getLength(); i++) { </li></ul><ul><li>tratarNodo(ats.item(i)); </li></ul><ul><li>} </li></ul><ul><li>System.out.println(&quot;>&quot;); </li></ul><ul><li>NodeList hijos = nodo.getChildNodes(); </li></ul><ul><li>... // tratar los hijos recursivamente </li></ul><ul><li>break; </li></ul><ul><li>case Node.ATTRIBUTE_NODE: </li></ul><ul><li>System.out.print(&quot; &quot; + nodo.getNodeName() + &quot;=&quot;&quot; + nodo.getNodeValue() +&quot;&quot;&quot;); </li></ul>
  69. 69. Ejemplo DOM VII <ul><li>case Node.TEXT_NODE: </li></ul><ul><li>String texto = nodo.getNodeValue().trim(); </li></ul><ul><li>if (!texto.equals(&quot;&quot;)) { </li></ul><ul><li>System.out.println(ind + texto); </li></ul><ul><li>} </li></ul><ul><li>break; </li></ul><ul><li>case Node.CDATA_SECTION_NODE: </li></ul><ul><li>System.out.println(nodo.getNodeValue()); </li></ul><ul><li>break; </li></ul><ul><li>NodeList peliNodes = document.getElementsByTagName(&quot;Pelicula&quot;); </li></ul>
  70. 70. Extensible Style Language Transformations (XSLT) I <ul><li>Con la diversidad de lenguajes de presentación que hay (WML, HTML, cHTML) existen dos alternativas para desarrollar las aplicaciones: </li></ul><ul><ul><li>Desarrollar versiones de los procesos de generación de presentación (JSP, ASP, CGI,..) para cada lenguaje. </li></ul></ul><ul><ul><li>Desarrollar solo una versión que genere XML y conversores de XML a los lenguajes de presentación. </li></ul></ul>
  71. 71. Extensible Style Language Transformations (XSLT) II <ul><li>Dos partes: </li></ul><ul><ul><li>Transformation Language (XSLT) </li></ul></ul><ul><ul><li>Formatting Language (XSL Formatting Objects) </li></ul></ul><ul><li>XSLT transforma un documento XML en otro documento XML </li></ul><ul><li>XSLFO formatea y estiliza documentos en varios modos </li></ul><ul><li>XSLT W3C Recommendation - http://www.w3.org/TR/xslt </li></ul>
  72. 72. Operaciones entre árboles en XSL
  73. 73. Ventajas y desventajas de XSLT <ul><li>Ventajas: </li></ul><ul><ul><li>No asume un único formato de salida de documentos </li></ul></ul><ul><ul><li>Permite manipular de muy diversas maneras un documento XML: reordenar elementos, filtrar, añadir, borrar, etc. </li></ul></ul><ul><ul><li>Permite acceder a todo el documento XML </li></ul></ul><ul><ul><li>XSLT es un lenguaje XML </li></ul></ul><ul><li>Desventajas: </li></ul><ul><ul><li>Su utilización es más compleja que un lenguaje de programación convencional </li></ul></ul><ul><ul><li>Consume cierta memoria y capacidad de proceso  DOM detrás </li></ul></ul>
  74. 74. Usando hojas de estilo XSLT <ul><li>Para crear una transformación XSL necesitamos: </li></ul><ul><ul><li>El documento XML a transformar ( students.xml ) </li></ul></ul><ul><ul><li>La hoja de estilo que especifica la transformación ( students.xsl ) </li></ul></ul>
  75. 75. Documento XML (students.xml) <ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><course> </li></ul><ul><li><name id=&quot;csci_2962&quot;>Programming XML in Java</name> </li></ul><ul><li><teacher id=“di&quot;>Diego Ipiña</teacher> </li></ul><ul><li><student id=“ua&quot;> </li></ul><ul><li><name>Usue Artaza</name> </li></ul><ul><li><hw1>30</hw1> </li></ul><ul><li><hw2>70</hw2> </li></ul><ul><li><project>80</project> </li></ul><ul><li><final>85</final> </li></ul><ul><li></student> </li></ul><ul><li><student id=“iu&quot;> </li></ul><ul><li><name>Iñigo Urrutia</name> </li></ul><ul><li><hw1>80</hw1> </li></ul><ul><li><hw2>90</hw2> </li></ul><ul><li><project>100</project> </li></ul><ul><li><final>40</final> </li></ul><ul><li></student> </li></ul><ul><li></course> </li></ul>
  76. 76. Hoja de estilo XSLT (students.xsl) <ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><xsl:stylesheet version=&quot;1.0“ xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;> </li></ul><ul><li><xsl:template match=&quot;course&quot;> </li></ul><ul><li><HTML> </li></ul><ul><li><HEAD><TITLE>Name of students</TITLE></HEAD> </li></ul><ul><li><BODY> </li></ul><ul><li><xsl:apply-templates select=&quot;student&quot;/> </li></ul><ul><li></BODY> </li></ul><ul><li></HTML> </li></ul><ul><li></xsl:template> </li></ul><ul><li><xsl:template match=&quot;student&quot;> </li></ul><ul><li><P><xsl:value-of select=&quot;name&quot;/></P> </li></ul><ul><li></xsl:template> </li></ul><ul><li></xsl:stylesheet> </li></ul>
  77. 77. Resultado de transformación <ul><li>(students.html) </li></ul><ul><li><HTML> </li></ul><ul><li><HEAD> <TITLE>Name of students</TITLE> </HEAD> </li></ul><ul><li><BODY> </li></ul><ul><li><P>Usue Artaza</P> </li></ul><ul><li><P>Iñigo Urrutia</P> </li></ul><ul><li></BODY> </li></ul><ul><li></HTML> </li></ul>
  78. 78. Formas de uso de XSLT <ul><li>Visualizar directamente en un navegador el documento XML que tiene asociada una hoja XSLT. </li></ul><ul><li>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. </li></ul><ul><li>Realizar las transformaciones dentro de un programa en el servidor y enviar a los clientes sólo el resultado de la transformación. </li></ul>
  79. 79. Aplicaciones usando XSLT Internet JSP Clases Java Base de Datos Cliente Servidor XML Arquitectura en 5 capas dónde el servidor contiene conversores XSLT para generar presentación en distintos formatos. XSLT
  80. 80. Ejemplos de Procesadores XSLT existentes <ul><li>Oracle XML parser for Java http://technet.oracle.com/tech/xml/parser_java2/ </li></ul><ul><li>Saxon http:// users.iclway.co.uk/mhkay/saxon/index.html </li></ul><ul><li>XT http:// www.jclark.com/xml/xt.html </li></ul><ul><li>Sablotron http://www.gingerall.com/charlie-bin/get/webGA/act/sablotron.act </li></ul><ul><li>Microsoft XML Parser http:// msdn.microsoft.com/downloads/webtechnology/xml/msxml.asp </li></ul><ul><li>Xalan Java http://xml.apache.org/xalan-j/index.html </li></ul><ul><li>Java JAXP </li></ul>
  81. 81. XSLT son documentos XML bien formados <ul><li>xsl:stylesheet – elemento raiz </li></ul><ul><li>xsl:template – cómo transformar un nodo seleccionado </li></ul><ul><ul><li>Se asocia con un fragmento del documento a través de una expresión en XPath </li></ul></ul><ul><ul><li>Transforma XML entrante en otro fragmento de XML </li></ul></ul><ul><ul><li>match – Atributo para seleccionar nodo </li></ul></ul><ul><ul><ul><li>&quot;/&quot; – nodo raiz del documento de entrada </li></ul></ul></ul><ul><li>Elemento xsl:apply-templates . Aplica los templates definidos para los hijos de un nodo seleccionado </li></ul>
  82. 82. Ejemplo XSLT <ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;> </li></ul><ul><li><xsl:template match=&quot;/&quot;> </li></ul><ul><li> <xsl:apply-templates/> </li></ul><ul><li></xsl:template> </li></ul><ul><li></xsl:stylesheet> </li></ul>
  83. 83. Elementos XSLT <ul><li>xsl:value-of permite recuperar el valor de un nodo </li></ul><ul><ul><li>Los nodos son seleccionados usando la sintáxis de la especificación XPath XML </li></ul></ul><ul><ul><li>Sólo selecciona el valor del primer estudiante que encuentre </li></ul></ul><ul><ul><li><xsl:template match=“course&quot;> </li></ul></ul><ul><ul><li><xsl:value-of select=“student&quot;/> </li></ul></ul><ul><ul><li></xsl:template> </li></ul></ul><ul><li>Si queremos seleccionar varios podemos hacer: </li></ul><ul><ul><li><xsl:template match=“course&quot;> </li></ul></ul><ul><ul><li><xsl:apply-templates select=“student&quot;/> </li></ul></ul><ul><ul><li></xsl:template> </li></ul></ul><ul><ul><li><xsl:template match=“student&quot;> </li></ul></ul><ul><ul><li><xsl:value-of select=&quot;.&quot;/> </li></ul></ul><ul><ul><li></xsl:template> </li></ul></ul><ul><li>O usar xsl:for-each </li></ul><ul><ul><li><xsl:template match=“course&quot;> </li></ul></ul><ul><ul><li><xsl:for-each select=“student&quot;> </li></ul></ul><ul><ul><li><xsl:value-of select=&quot;.&quot;/> </li></ul></ul><ul><ul><li></xsl:for-each> </li></ul></ul><ul><ul><li></xsl:template> </li></ul></ul>
  84. 84. Elementos XSLT (cont) <ul><li>Para realizar distintos procesamientos en función de los datos se usa xsl:choose : </li></ul><ul><ul><li>Se compone de elementos xsl:when </li></ul></ul><ul><ul><li>Un elemento opcional xsl:otherwise </li></ul></ul><ul><li>Para procesar o no un elemento en función de una condición se usa xsl:if : </li></ul><ul><ul><li>Condición en atributo test </li></ul></ul>
  85. 85. Ejemplo <ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;> </li></ul><ul><li><xsl:template match=&quot;/&quot;> </li></ul><ul><li><HTML> </li></ul><ul><li><HEAD> <TITLE>Name of students</TITLE> </HEAD> </li></ul><ul><li><BODY> </li></ul><ul><li><xsl:apply-templates/> </li></ul><ul><li></BODY> </li></ul><ul><li></HTML> </li></ul><ul><li></xsl:template> </li></ul><ul><li><xsl:template match=&quot;course&quot;> </li></ul><ul><li><xsl:apply-templates select=&quot;student&quot;/> </li></ul><ul><li></xsl:template> </li></ul><ul><li><xsl:template match=&quot;student&quot;> </li></ul><ul><li><xsl:for-each select=&quot;name&quot;><P><xsl:value-of select=&quot;.&quot;/></P></xsl:for-each> </li></ul><ul><li></xsl:template> </li></ul><ul><li></xsl:stylesheet> </li></ul>
  86. 86. Patrones XPath para el atributo match o select <ul><li>Seleccionar el nodo raiz: </li></ul><ul><li><xsl:template match=&quot;/&quot;> ... </xsl:template> </li></ul><ul><li>Seleccionar un elemento: </li></ul><ul><li><xsl:template match=&quot;student&quot;> ...</xsl:template> </li></ul><ul><li>Seleccionar hijos de un elemento: </li></ul><ul><li><xsl:template match=&quot;course/student&quot;> ... </xsl:template> </li></ul><ul><li><xsl:template match=&quot;course/*/name&quot;> ... </xsl:template> </li></ul><ul><li>Seleccionar descendientes de un elemento: </li></ul><ul><li><xsl:template match=&quot;course//name&quot;> ... </xsl:template> </li></ul>
  87. 87. Patrones XPath para el atributo match o select <ul><li>Seleccionar atributo título: </li></ul><ul><ul><li><xsl:value-of select=&quot;./@id&quot;/> </li></ul></ul><ul><li>Seleccionar comentarios: </li></ul><ul><ul><li><xsl:template match=&quot;comment()&quot;> ... </xsl:template> </li></ul></ul><ul><li>Seleccionar elementos de texto: </li></ul><ul><ul><li><xsl:template match=&quot;text()&quot;> ... </xsl:template> </li></ul></ul><ul><li>Recuperar posición que ocupa un sub-elemento dentro de elemento padre </li></ul><ul><ul><li><xsl:value-of select=&quot; position() &quot;/> </li></ul></ul>
  88. 88. Evaluando condiciones con [] <ul><li>Evaluando si una condición es cierta: </li></ul><ul><ul><li>Si el elemento estudiante tiene un hijo name </li></ul></ul><ul><ul><li><xsl:template match=&quot;student[name]&quot;> </li></ul></ul><ul><ul><li>Cualquier elemento que tiene un elemento namE </li></ul></ul><ul><ul><li><xsl:template match=&quot;*[name]&quot;> </li></ul></ul><ul><ul><li>Elemento student tiene un sub-elemento hw1 o hw2 element </li></ul></ul><ul><ul><li><xsl:template match=&quot;student[hw1 | hw2]&quot;> </li></ul></ul>
  89. 89. Ejemplo XSLT <ul><li>Problema: Imprimir nombre de alumnos con nota media mayor de 65% </li></ul><ul><li><?xml version=&quot;1.0&quot;?> </li></ul><ul><li><xsl:stylesheet version=&quot;1.0&quot; </li></ul><ul><li>xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;> </li></ul><ul><li><xsl:output method=&quot;text&quot;/> </li></ul><ul><li><xsl:template match=&quot;course&quot;> </li></ul><ul><li><xsl:apply-templates select=&quot;student&quot;/> </li></ul><ul><li></xsl:template> </li></ul><ul><li><xsl:template match=&quot;student&quot;> </li></ul><ul><li><xsl:variable name=&quot;ave&quot;> </li></ul><ul><li><xsl:value-of select=&quot;(hw1 + hw2 + project + final) div 4&quot;/> </li></ul><ul><li></xsl:variable> </li></ul><ul><li><xsl:if test=&quot;$ave > 65&quot;> </li></ul><ul><li> Student name=&quot;<xsl:value-of select=&quot;name&quot;/>&quot; average=&quot;<xsl:value-of select=&quot;$ave&quot;/>&quot; </li></ul><ul><li></xsl:if> </li></ul><ul><li></xsl:template> </li></ul><ul><li></xsl:stylesheet> </li></ul>
  90. 90. Resultado transformación <ul><li>Salida (grades70.txt): </li></ul><ul><li>Student name=“Usue Artaza&quot; average=&quot;66,25&quot; </li></ul><ul><li>Student name=“Iñigo Urrutia&quot; average=&quot;77,5&quot; </li></ul>
  91. 91. Java JAXP <ul><li>Provee clase Transformer para la aplicación de XSL a un documento XML </li></ul><ul><li>Como siempre Java JAXP asegura que el código fuente sea el mismo independientemente del parser XSLT subyacente </li></ul>
  92. 92. Usando Java JAXP <ul><li>import javax.xml.parsers.DocumentBuilder; </li></ul><ul><li>import javax.xml.parsers.DocumentBuilderFactory; </li></ul><ul><li>import javax.xml.transform.Transformer; </li></ul><ul><li>import javax.xml.transform.TransformerException; </li></ul><ul><li>import javax.xml.transform.TransformerFactory; </li></ul><ul><li>import javax.xml.transform.TransformerConfigurationException; </li></ul><ul><li>import javax.xml.transform.dom.DOMSource; </li></ul><ul><li>import javax.xml.transform.stream.StreamSource; </li></ul><ul><li>import javax.xml.transform.stream.StreamResult; </li></ul><ul><li>import org.w3c.dom.Document; </li></ul><ul><li>... </li></ul>
  93. 93. Usando Java JAXP (cont) <ul><li>public String obtenerCarteleraHMTL () { </li></ul><ul><li>DocumentBuilderFactory factory = </li></ul><ul><li>DocumentBuilderFactory.newInstance(); </li></ul><ul><li>try { </li></ul><ul><li>// Usar JAXP DOM para generar Document con fichero xml </li></ul><ul><li>DocumentBuilder builder = factory.newDocumentBuilder(); </li></ul><ul><li>Document document = builder.parse( &quot;http://localhost:8080/cartelera/Cines.jsp?Funcion=TodaCartelera&quot;); </li></ul><ul><li>// Generar un objeto transformer para realizar transform XSL </li></ul><ul><li>TransformerFactory tFactory = TransformerFactory.newInstance(); </li></ul><ul><li>StreamSource stylesource = new StreamSource( </li></ul><ul><li>&quot;http://localhost:8080/cartelera/Cartelera.xsl&quot;); </li></ul><ul><li>Transformer transformer = tFactory.newTransformer(stylesource); </li></ul><ul><li>DOMSource source = new DOMSource(document); </li></ul><ul><li>ByteArrayOutputStream outputByteArray = new ByteArrayOutputStream(); </li></ul><ul><li>StreamResult result = new StreamResult(outputByteArray); </li></ul><ul><li>transformer.transform(source, result); </li></ul><ul><li>return outputByteArray.toString(); </li></ul><ul><li>} catch (Exception e) { </li></ul><ul><li>e.printStackTrace(); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  94. 94. Ejemplo XML + XSL  XHTML I <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;iso-8859-1&quot;?> </li></ul><ul><li><Cartelera> </li></ul><ul><li><Cine codigo='1' nombre='Coliseo Java' direccion='Avda. Abaro' poblacion='Portugalete'> </li></ul><ul><li><Pelicula codigo='1' titulo='Lo que el viento se llevó' </li></ul><ul><li>director= 'Victor Fleming ' </li></ul><ul><li>actores= 'Clark Gable, Vivien Leigh, Leslie Howard '> </li></ul><ul><li><Sesion>16:00</Sesion> </li></ul><ul><li> <Sesion>19:30</Sesion> </li></ul><ul><li> <Sesion>22:00</Sesion> </li></ul><ul><li></Pelicula> </li></ul><ul><li><Pelicula codigo='5' titulo='Malena' </li></ul><ul><li>director='Giuseppe Tornatore' </li></ul><ul><li>actores='Monica Bellucci, Giuseppe Sulfaro'> </li></ul><ul><li><Sesion>16:30</Sesion> </li></ul><ul><li><Sesion>19:00</Sesion> </li></ul><ul><li></Pelicula> </li></ul><ul><li></Cine> </li></ul><ul><li>… </li></ul><ul><li></Cartelera> </li></ul>
  95. 95. Ejemplo XML + XSL  XHTML II <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;iso-8859-1&quot;?> </li></ul><ul><li><xsl:stylesheet xmlns:xsl= http://www.w3.org/1999/XSL/Transform version=&quot;1.0&quot;> </li></ul><ul><li><xsl:output method=&quot;html&quot;/> </li></ul><ul><li><xsl:template match=&quot;/&quot;> </li></ul><ul><li><html> </li></ul><ul><li><head> </li></ul><ul><li><style type=&quot;text/css&quot;> </li></ul><ul><li>table {font-family: arial, 'sans serif'; margin-left: 15pt;} </li></ul><ul><li>th,td {font-size: 80%;} </li></ul><ul><li>th {background-color:#FAEBD7} </li></ul><ul><li></style> </li></ul><ul><li></head> </li></ul><ul><li><body> </li></ul><ul><li><table border=&quot;1&quot;> </li></ul><ul><li><xsl:apply-templates/> </li></ul><ul><li></table> </li></ul><ul><li></body> </li></ul><ul><li></html> </li></ul><ul><li></xsl:template> </li></ul>
  96. 96. Ejemplo XML + XSL  XHTML III <ul><li><xsl:template match=&quot;Cartelera&quot;> </li></ul><ul><li><xsl:for-each select=&quot;Cine&quot;> </li></ul><ul><li><tr> </li></ul><ul><li><th><xsl:text>Cine</xsl:text></th> </li></ul><ul><li><th><xsl:text>Dirección</xsl:text></th> </li></ul><ul><li><th><xsl:text>Población</xsl:text></th> </li></ul><ul><li><th></th> </li></ul><ul><li></tr> </li></ul><ul><li><tr> </li></ul><ul><li><td><xsl:value-of select=&quot;./@nombre&quot;/></td> </li></ul><ul><li><td><xsl:value-of select=&quot;./@direccion&quot;/></td> </li></ul><ul><li><td><xsl:value-of select=&quot;./@poblacion&quot;/></td> </li></ul><ul><li><td><xsl:text></xsl:text></td> </li></ul><ul><li> </tr> </li></ul><ul><li><xsl:for-each select=&quot;Pelicula“> </li></ul><ul><li><tr> </li></ul><ul><li><th></th> </li></ul><ul><li><th><xsl:text>Película</xsl:text></th> </li></ul><ul><li><th><xsl:text>Director</xsl:text></th> </li></ul><ul><li><th><xsl:text>Actores</xsl:text></th> </li></ul><ul><li></tr> </li></ul><ul><li><tr> </li></ul><ul><li><td><xsl:text></xsl:text></td> </li></ul><ul><li><td><xsl:value-of select=&quot;./@titulo&quot;/></td> </li></ul><ul><li><td><xsl:value-of select=&quot;./@director&quot;/></td> </li></ul><ul><li><td><xsl:value-of select=&quot;./@actores&quot;/></td> </li></ul><ul><li></tr> </li></ul>
  97. 97. Ejemplo XML + XSL  XHTML IV <ul><li><tr> </li></ul><ul><li><th></th> </li></ul><ul><li><th></th> </li></ul><ul><li><th><xsl:text>Sesión</xsl:text></th> </li></ul><ul><li><th><xsl:text>Hora</xsl:text></th> </li></ul><ul><li></tr> </li></ul><ul><li><xsl:for-each select=&quot;Sesion&quot;> </li></ul><ul><li><tr> </li></ul><ul><li><td><xsl:text></xsl:text></td> </li></ul><ul><li><td><xsl:text></xsl:text></td> </li></ul><ul><li><td><xsl:value-of select=&quot;position()&quot;/></td> </li></ul><ul><li><td><xsl:value-of select=&quot;.&quot;/></td> </li></ul><ul><li></tr> </li></ul><ul><li></xsl:for-each> </li></ul><ul><li></xsl:for-each> </li></ul><ul><li></xsl:for-each> </li></ul><ul><li></xsl:template> </li></ul><ul><li></xsl:stylesheet> </li></ul>
  98. 98. Ejemplo XML + XSL  XHTML V <ul><li><html> </li></ul><ul><li><body> </li></ul><ul><li><table border=&quot;1&quot;> </li></ul><ul><li><tr> </li></ul><ul><li><th>Cine</th> </li></ul><ul><li><th>Direcci&oacute;n</th> </li></ul><ul><li><th>Poblaci&oacute;n</th> </li></ul><ul><li><th></th> </li></ul><ul><li></tr> </li></ul><ul><li><tr> </li></ul><ul><li><td>Coliseo Java</td> </li></ul><ul><li><td>Avda. Abaro</td> </li></ul><ul><li><td>Portugalete</td> </li></ul><ul><li><td></td> </li></ul><ul><li></tr> </li></ul><ul><li><tr> </li></ul><ul><li><th></th> </li></ul><ul><li><th>Pel&iacute;cula</th> </li></ul><ul><li><th>Director</th> </li></ul><ul><li><th>Actores</th> </li></ul><ul><li></tr> </li></ul>
  99. 99. Ejemplo XML + XSL  XHTML VI <ul><li><tr> </li></ul><ul><li><td></td> </li></ul><ul><li><td>Lo que el viento se llev&oacute;</td> </li></ul><ul><li><td>Santiago Segura</td> </li></ul><ul><li><td>Bo Derek, Al Pacino, Robert Reford</td> </li></ul><ul><li></tr> </li></ul><ul><li><tr> </li></ul><ul><li><th></th> </li></ul><ul><li><th></th> </li></ul><ul><li><th>Sesi&oacute;n</th> </li></ul><ul><li><th>Hora</th> </li></ul><ul><li></tr> </li></ul><ul><li><tr> </li></ul><ul><li><td></td> </li></ul><ul><li><td></td> </li></ul><ul><li><td>1</td> </li></ul><ul><li><td>16:00</td> </li></ul><ul><li></tr> </li></ul><ul><li><tr> </li></ul><ul><li>... </li></ul><ul><li></table> </li></ul><ul><li><body> </li></ul><ul><li></html> </li></ul>
  100. 100. Resultado procesamiento XSLT

×