Este documento presenta un curso sobre XML. Explica los requisitos técnicos para usar XML en entornos Microsoft y Java. Luego describe los elementos clave del estándar XML como DOM, XSL y aplicaciones prácticas de XML. Finalmente, introduce conceptos básicos de XML como su definición, características y ejemplos de documentos XML.
2. Requisitos
- PC con Windows 98 / NT / 2000, 64 MB de RAM (dependen del
servidor a usar)
Para entorno Microsoft:
- Internet Explorer
- Parser MSXML 3 o superior.
- Servidor IIS o Personal Web Server de Microsoft.
Para entorno Java:
- JDK 1.1.8 o superior
- JAXP (Java API for XML Processing)
- Servidor Web (por ej. iPlanet Web Server FastTrack Edition)
3. El estándar XML
Qué es XML y qué elementos lo
El estándar XML
componen
Acceso a los datos de un documento
DOM
XML
Cómo dar formato a un documento
XSL
XML con XSL
Aplicaciones Uso práctico de XML en entornos
Prácticas Java y Microsoft
4. XML - Introducción
• XML (eXtended Markup Language) es un lenguaje que
proporciona un formato para describir datos estructurados
• Es un lenguaje de marcas
• Es un subconjunto de SGML (Standard Generalized
Markup Language)
• Definido por el W3C en 1998
5. XML - Características
• Lenguaje de marcas extensible, es un metalenguaje
• Es “case sensitive”
• Representación estructural de los datos en forma de árbol
• Define los datos en una aplicación, no su presentación
• Permite interoperatividad entre máquinas distintas (un
estándar para el intercambio de datos)
6. XML - Ejemplo de documento XML
<?xml version="1.0"?>
<!DOCTYPE discos SYSTEM "cds.dtd">
<discos>
<disco>
<artista tipo="individual">Frank Sinatra</artista>
<titulo numerodepistas="2">In The Wee Small Hours</titulo>
<pistas>
<pista>In The Wee Small Hours</pista>
<pista>Mood Indigo</pista>
</pistas>
<precio>$12.99</precio>
</disco>
<disco>
<artista tipo="band">The Offspring</artista>
<titulo numerodepistas="2">Americana</titulo>
<pistas>
<pista>Welcome</pista>
<pista>Have You Ever</pista>
</pistas>
<precio>$12.99</precio>
</disco>
</discos>
7. XML - Elementos XML
•Un documento XML está formado por tags o etiquetas
para la estructuración de los datos.
Por ejemplo: <disco>
•Un elemento XML está formado por una etiqueta de
inicio y otra etiqueta final. Entre ambas está el valor del
dato al que se refiere el tag.
En este ejemplo, el elemento pista tiene como valor
“Welcome”:
<pista>Welcome</pista>
8. XML - Elementos XML - Atributos
• Un elemento XML puede contener uno o más atributos
en su tag inicial
En este ejemplo, el atributo sería “tipo”, y su valor
“individual”:
<artista tipo="individual">Frank Sinatra</artista>
• Un elemento XML puede no contener un valor, solamente
atributos. En este caso se puede escribir con un solo tag
terminado en /.
Esta expresión
<precio valor=“$12.99”></precio>
equivale a
<precio valor=“$12.99”/>
9. XML - Documentos XML
Un documento XML es un conjunto de elementos XML anidados
(con estructura de árbol)
Reglas a tener en cuenta:
• Todos los elementos deben cerrarse
• Los elementos deben estar limpiamente anidados
• Un documento XML debe tener un único elemento raíz
10. XML - Reglas de Construcción de
Nombres XML
En la construcción de nombres XML (atributos y elementos
XML) se deben tener en cuenta las siguientes reglas:
• Un nombre XML puede contener los siguientes caracteres:
Letras (A-Z, a-z), dígitos (0-9), guión bajo (_), guión (-) y punto
(.)
• Debe empezar con una letra o guión bajo
• Puede usar dos puntos (:) sólo en namespaces
• No puede contener espacios en blanco
11. XML - Documento XML Bien Formado
Se dice que un documento XML está bien formado si
cumple las siguientes reglas:
• Todo tag debe tener su correspondiente tag final.
• Los elementos deben quedar debidamente anidados
• Debe haber exactamente un elemento raíz
• Los valores de los atributos deben estar entre comillas
• Un mismo elemento no debe tener más de un atributo con
el mismo nombre
• Los comentarios no deben colocarse dentro de los tags
• Los caracteres & y < deben ser precedidos por un si
forman parte de los datos de un elemento o atributo.
Validar un documento XML Con un Parser XML
12. XML - Ejercicio 1
¿Es el siguiente documento XML un documento bien formado?
<empleados>
<empleado nombre=“Juan” apellido=“Pérez” apellido=“Sánchez”>
<direccion calle=“López Peñalver”>
</empleado>
<Empleado nombre=“Alberto”>
<direccion calle=“López Peñalver”>
</Empleado>
<empleado>
<localidad>Málaga</localidad>
</Empleado>
</empleados>
<oficinas>
<oficina 1tlf=“951000000” 2tlf=“951000001”>
<ciudad>Madrid</ciudad>
</oficina>
<oficina>
<ciudad telefono=“12312312”>Barcelona</ciudad>
</oficina>
</oficinas>
13. XML - Ejercicio 2
Crear un documento XML válido que contenga los siguientes datos:
Vuelo Origen Destino Salida Llegada
IB777 Málaga Madrid 8:00 8:50
IB888 Madrid Barcelona 9:00 10:10
IB999 Madrid Málaga 12:00 12:50
Código Avión Vuelos
1234 IB777,IB999
1122 IB888
14. XML - Namespaces
•Un XML namespace es una colección de nombres que
pueden ser usados en elementos o atributos.
•Un namespace distingue nombres de forma única en la Web,
para evitar conflictos.
•Un namespace puede ser identificado por una:
URI (Universal Resource Identifier)
URL (Uniform Resource Locator)
URN (Uniform Resource Number)
15. XML - Namespaces - Declaración
Se declara con el atributo xmlns en el elemento deseado.
Existen dos tipos de declaración:
•Declaración por defecto. No hace falta usar prefijo, todos los
nombres pertenecen al namespace declarado:
<BOOK xmlns="urn:BookLovers.org:BookInfo">
<TITLE>A Suitable Boy</TITLE>
<PRICE currency="US Dollar">22.95</PRICE>
</BOOK>
•Declaración explícita. Cada nombre debe usar un prefijo
especificando el namespace al que pertenece:
<BOOKS>
<bk:BOOK xmlns:bk="urn:BookLovers.org:BookInfo"
xmlns:money="urn:Finance:Money">
<bk:TITLE>A Suitable Boy</bk:TITLE>
<bk:PRICE money:currency="US Dollar">22.95</bk:PRICE>
</bk:BOOK>
</BOOKS>
16. XML - Prólogo del Documento XML
Antes del elemento raíz del documento XML pueden aparecer
una serie de elementos, formando la siguiente estructura:
<?xml version="1.0"?> Declaración XML
<!--
Discos.xml, ejemplo de documento XML Comentarios
-->
<?xml-stylesheet href=“discos.xsl” type=“text/xml”?> Instrucciones de
procesamiento
<!DOCTYPE discos SYSTEM “discos.dtd">
Document Type
<discos> Declaration
....
</discos> Elemento raiz
17. XML - Prólogo del Documento XML
Declaración
• No es necesaria para que el documento sea bien formado
• Incluye los siguientes atributos:
• version: versión de XML
• encoding: codificación de los caracteres
• standalone: especifica si no es necesaria una validación por
DTD
<?xml version="1.0" encoding="ISO-8859-1"?>
Comentarios
• Pueden aparecer en cualquier sitio excepto dentro de un tag
<!--
Discos.xml, ejemplo de documento XML
-->
18. XML - Prólogo del Documento XML
Instrucciones de procesamiento
• Asocia el documento XML con algún elemento externo, como por
ejemplo una hoja de estilos xsl.
<?xml-stylesheet href=“discos.xsl” type=“text/xml”?>
Document Type Declaration
• Referencia a un DTD (Document Type Definition), el cual valida el
documento XML.
<!DOCTYPE discos SYSTEM “discos.dtd">
19. XML - DTDs (Document Type
Definition)
• Un DTD es un documento que especifica las restricciones que
debe cumplir un documento XML.
• Un documento válido es aquel que cumple las restricciones
especificadas en su DTD. Un documento es inválido si no las
cumple o simplemente no referencia a ningún DTD.
• Permite la declaración de tres tipos de estructuras:
Elementos
Atributos
Entidades
• Debido a sus limitaciones se creó el lenguaje XML Schema.
20. XML - DTDs - Declaración
Un DTD se puede declarar de 2 formas:
• En un fichero aparte
<!DOCTYPE discos SYSTEM “discos.dtd">
• En el propio documento XML (en el prólogo):
<!DOCTYPE empleado
[
<!ELEMENT empleado (nombre, direccion)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT direccion (ciudad, calle)>
<!ELEMENT ciudad (#PCDATA)>
<!ELEMENT calle (#PCDATA)>
]
>
21. XML - DTDs - Declaración de Elementos
• Un Elemento se declara especificando su nombre y los
elementos que lo componen:
<!ELEMENT empleado (nombre, direccion)>
• Si el elemento no contiene ningún otro elemento, se
especifica el tipo del valor que contiene
<!ELEMENT nombre (#PCDATA)>
#PCDATA permite caracteres alfanuméricos
•Así, el siguiente documento XML sería válido para el DTD anterior:
<empleado>
<nombre>Antonio</nombre>
<direccion>
<ciudad>Málaga</ciudad>
<calle>Larios</calle>
</direccion>
</empleado>
22. XML - DTDs - Declaración de Elementos
• Si separamos con comas los elementos hijo, el orden de
aparición de éstos debe cumplirse
<!ELEMENT empleado (nombre, direccion)>
• Si separamos los elementos con una barra ( | ), con que
aparezca sólo uno de ellos ya se cumplirá la condición
<!ELEMENT empleado (nombre | direccion)>
• También pueden agruparse con paréntesis:
<!ELEMENT empleado ((nombre | apellido) , direccion)>
23. XML - DTDs - Declaración de Elementos
Modificadores
• Los siguientes modificadores especifican el número de elementos
que deben aparecer:
* 0 ó más
+ 1 ó más
? 0ó1
• Si no se muestra ningún modificador, debe aparecer
exactamente 1 elemento.
Ejemplos:
<!ELEMENT empleado (nombre , apellido? , direccion+)>
<!ELEMENT empleado (nombre , apellido , (direccion | telefono)*)>
24. XML - DTDs - Declaración de Elementos
Elementos Vacíos
• Si un elemento no contiene valor, se declara con la palabra EMPTY
<!ELEMENT direccion EMPTY>
Contenido ANY
• Si un elemento puede tener cualquier tipo de valor o de elementos
compuestos, se declara con la palabra ANY
<!ELEMENT otrosDatos ANY>
25. XML - DTDs - Ejercicio 1
Crear un DTD que valide la siguiente estructura:
<proveedores>
<proveedor>
<nombre>Pascal</nombre>
<productos>
<producto>Leche</producto>
<producto>Flan</producto>
</productos>
</proveedor>
<proveedor>
<nombre>Capitán Pesconovo</nombre>
<productos>
<producto>Merluza</producto>
</productos>
<telefono>
952888777
</telefono>
</proveedor>
</proveedores>
26. XML - DTDs - Declaración de Atributos
• Un elemento puede tener 1 o más atributos. Por ejemplo, para
declarar los atributos ciudad, calle y numero del elemento
direccion, se haría de la siguiente forma:
<!ATTLIST direccion
ciudad CDATA #FIXED <direccion ciudad=“Málaga” calle=“Larios”
calle CDATA #REQUIRED numero=“5”/>
numero CDATA #IMPLIED
>
• La expresión #REQUIRED indica que el atributo es
obligatorio
• La expresión #IMPLIED indica que el atributo es opcional
• La expresión #FIXED indica que el atributo no es modificable
• La expresión CDATA es el tipo de dato (datos alfanuméricos)
• Se puede direccion pais un valor por defecto:
<!ATTLIST especificar CDATA “España”>
27. XML - DTDs - Declaración de Atributos
Tipos de atributos
• Enumeración. Limita los posibles valores del atributo.
<!ATTLIST empleado sexo (hombre | mujer) #REQUIRED>
• Tipos de atributos simple.
• CDATA. Caracteres alfanuméricos
• ID. Identificador único para un elemento.
• IDREF. Referencia a un número identificador contenido en
el atributo ID de algún otro elemento
<!ATTLIST empleado <empleado empid=“A120”>
empid ID #REQUIRED </empleado>
supervisor IDREF #IMPLIED <empleado empid=“A240” supervisor=“A120”>
> </empleado>
28. XML - DTDs - Declaración de Entidades
• Una entidad es una asociación entre el nombre de la entidad y su
valor. La entidad puede aparecer en el valor de un elemento o
atributo, y será sustituido por su valor.
• Hay 5 entidades predefinidas:
• < (<)
• & (&)
• > (>)
• " (")
• ' (')
• Se pueden definir entidades nuevas:
<!ENTITY empresa “Coritel AOS">
y usarlas de la siguiente forma
<empleado empresa=“&empresa;">
30. XML - Schema
• Estándar para la validación de documentos XML
• Validación mediante un parser
• Mejora con respecto a los DTDs
Permite mayor exactitud en el tipo de datos.
Está escrito en formato XML
Es extensible y escalable
Permite especificar el número de elementos que contiene
un elemento
Las declaraciones de elementos están anidadas
31. XML - Schema - Declaración
• Todo schema debe ser declarado con el elemento Schema y en
el siguiente namespace:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Schema xmlns=“urn:schemas-microsoft-com:xml-data“
xmlns:dt="urn:schemas-microsoft-com:datatypes">
...
</Schema>
• Al ser el schema un documento XML, la primera línea será la
versión de XML usada.
• Se almacena en un archivo con extensión xml.
32. XML - Schema - Elementos
• Elementos simples:
<ElementType name=“precio“ content=“textOnly”/>
content: textOnly, eltOnly, empty, mixed (por defecto)
• Elementos compuestos:
<ElementType name=“producto“ order=“seq”>
<element type=“nombre” minOccurs=“1”/>
<element type=“precio”/>
</ElementType>
minOccurs: número mínimo de apariciones del elemento
0,1
maxOccurs: número máximo de apariciones del elemento
1,*
order: seq (por defecto), one, many
33. XML - Schema - Elementos
• Agrupación: especifica reglas de aparición para un subconjunto de
elementos
<ElementType name=“producto“>
<element type=“nombre”/>
<element type=“precio”/>
<group order="one">
<element type=“descripcion"/>
<element type=“categoria"/>
</group>
</ElementType>
35. XML - Schema - Referencia al schema
Un documento XML especifica que debe ajustarse a un schema de
la siguiente forma:
<productos xmlns=“x-schema:schemaproductos.xml">
...
</productos>
36. XML - Schema - Ejercicio 1
Ejercicio 1: XML Schema
Ejercicio 1.1
• Crear un XML Schema en productosesq.xml para la validación
del archivo productos.xml, donde debe haber al menos 1
producto, idProducto sea obligatorio, cada producto tenga al
menos 1 procedencia y el precio sea opcional.
37. XML - Schema - Tipos
Los tipos se especifican con el atributo dt:type
<ElementType name=“precio“ dt:type=“int”/>
Tipos:
id valor único
idref referencia a un id
string cadena
boolean 0ó1
char 1 carácter
date fecha en formato 1994-11-05
time hora en formato 08:15:27
int entero consigo opcional
float número real
i1,i2,i4,i8 entero, especificando el número de bytes
r4,r8 real, especificando el número de bytes
ui1,ui2,ui4,ui8 entero sin signo
38. XML - Schema - Restricciones
El elemento datatype permite especificar el tipo de un elemento o
atributo y restringir sus valores
<ElementType name=“FechaEntrega" content="textonly">
<datatype dt:type="date" dt:min="1969-07-20“
dt:max=“2003-12-31"/>
</ElementType>
Posibles atributos de datatype:
dt:type tipo del elemento o atributo
dt:values valores posibles si dt:type = enumeration
dt:max máximo valor permitido
dt:maxExclusive máximo valor permitido excluyente
dt:min mínimo valor permitido
dt:minExclusive mínimo valor permitido excluyente
dt:maxLength máxima longitud del valor
39. XML - Schema - Enumeración
En la enumeración sólo es válido uno de los valores especificados:
<AttributeType name=“calidad" dt:type="enumeration“
dt:values=“alta media baja"/>
40. XML - Schema - Ejercicio 2
Ejercicio 2: XML Schema
Ejercicio 2.1
• Crear un XML Schema para la validación del archivo
clientes.xml, de forma que:
idCliente sea obligatorio y número de 5 dígitos como
máximo
dni sea obligatorio y alfanumérico con 8 caracteres máximo
localidad opcional
nombre obligatorio
apellido1 opcional
apellido2 opcional, pero si aparece debe ser después de
un apellido1
sexo opcional, y será “Hombre” o “Mujer”
direcciones es opcional, pero si aparece habrán 1 ó más
direcciones. ciudad, calle y número deben aparecer en ese
orden
41. XML - SAX
• SAX (Simple API for XML) es una API que permite a una
aplicación escribir código genérico que pueda funcionar con
cualquier parser
• SAX no es un parser en sí, sólo una capa entre una aplicación
y un parser
XML file XML parser SAX aplicación
42. DOM
Qué es XML y qué elementos lo
El estándar XML
componen
Acceso a los datos de un documento
DOM
XML
Cómo dar formato a un documento
XSL
XML con XSL
Aplicaciones Uso práctico de XML en entornos
Prácticas Java y Microsoft
43. DOM - Introducción
• El DOM (Document Object Model) es una API (Application
Programming Interface) creada para acceder a los datos de un
documento XML.
• Muchos lenguajes tienen librerías que permiten acceder al DOM
de un documento XML mediante un parser.
• El estándar “Level 1 DOM” definido por el W3C es seguido, entre
otros navegadores, por Netscape 6 y Explorer 5.
• Al DOM de un documento XML puede accederse desde
Javascript, VBScript u otros lenguajes que lo soporten.
44. DOM - Data Island
• Un Data Island es un documento XML insertado en una página
HTML. Esto se puede conseguir de 2 formas:
• Insertando el código del documento XML en la página:
<XML ID="XMLCliente">
<clientes>
<cliente idCliente=“81422”>
<nombre>Antonio</nombre>
</cliente>
<cliente idCliente=“81555”>
<nombre>Jose Carlos</nombre>
</cliente>
</clientes>
</XML>
• Referenciando el archivo donde está contenido el documento
XML:
<XML ID="XMLCliente" SRC=“clientes.xml"></XML>
45. DOM - Acceso a elementos
• XMLDocument: obtiene el documento XML
• documentElement: obtiene el elemento raiz del documento XML
• childNodes: obtiene una lista de los elementos hijos de un
elemento
• item(n): devuelve el elemento n de una lista
• text: devuelve el valor de un nodo
La expresión
XMLCliente.XMLDocument.documentElement.childNodes.item(0).childNodes.item(0).text
devuelve “Antonio”
• length: devuelve el número de nodos hijos
46. DOM - Acceso a elementos
• firstChild: devuelve el primer elemento hijo de otro elemento
• lastChild: devuelve el último elemento hijo de otro elemento
• getElementsByTagName(nombre) : obtiene una lista de los
elementos encontrados con el nombre indicado. Busca de forma
recursiva.
XMLCliente.XMLDocument.documentElement.getElementsByTagName(“nombre”).item(0).text
devuelve “Antonio”
• nextSibling: devuelve el siguiente elemento en la lista de hijos
del elemento padre, o null si es el último elemento.
• previousSibling: devuelve el anterior elemento en la lista de
hijos del elemento padre, o null si es el primer elemento.
• parentNode: devuelve el nodo padre de un elemento.
47. DOM - Acceso a atributos
• getAttribute(nombre) : obtiene el valor del atributo con el nombre
especificado
XMLCliente.XMLDocument.documentElement.firstChild.getAttribute("idCliente")
devuelve “81422”
• attributes: obtiene una lista de los atributos de un elemento
XMLCliente.XMLDocument.documentElement.firstChild.attributes.item(0).text
también devuelve “81422”
48. DOM - Ejercicio 1
Ejercicio 1: Acceso a XML
Ejercicio 1.1
• Insertar el contenido de clientes.xml en un Data Island en el
código de pagina.htm
• Modificar la función mostrarDatos() para que muestre mensajes
con los siguientes datos:
• Mostrar el nombre del primer cliente
• Mostrar el idCliente del último cliente
• Mostrar el número de clientes
• Hacer un bucle que muestre los dni.
• Hacer un bucle que, para cada cliente, si tiene localidad
que la muestre, y si no, que muestre el mensaje “Sin
localidad”
49. DOM - Modificación de elementos
Creación de un elemento
• createElement(nombre) : devuelve un elemento con el nombre
especificado
• createTextNode(nombre) : devuelve un objeto Text que debe ser
insertado en un elemento
• appendChild(objeto) : inserta un hijo a la lista de hijos de un
elemento. El objeto puede ser un Elemento o un objeto Text.
El siguiente código inserta el apellido al primer cliente con valor
“Fernández”
element = XMLCliente.createElement("apellido");
textNode = XMLCliente.createTextNode("Fernández");
element.appendChild(textNode);
XMLCliente.XMLDocument.documentElement.firstChild.appendChild(element);
50. DOM - Modificación de elementos
Eliminación de un elemento
• removeChild(objeto) : elimina el objeto especificado
La siguiente instrucción elimina el segundo cliente:
XMLCliente.XMLDocument.documentElement.removeChild (
XMLCliente.XMLDocument.documentElement.childNodes.item(1) );
Cambiar el valor de un elemento
Simplemente con la operación de asignación. La siguiente sentencia
modifica el nombre del primer cliente:
XMLCliente.XMLDocument.documentElement.firstChild.firstChild.text = “Jesús";
51. DOM - Modificación de atributos
Creación o cambio de valor de un atributo
• setAttribute(nombre,valor) : si el atributo especificado existe,
cambia su valor, si no, crea uno nuevo y le asigna el valor especificado.
El siguiente ejemplo crea el atributo “dni” para el primer cliente:
XMLCliente.XMLDocument.documentElement.firstChild.setAttribute(“dni", “55333444");
Eliminación de un atributo
• removeAttribute(nombre) : elimina de un nodo el atributo con el
nombre especificado. Este ejemplo borra el atributo “nif” creado en la
sentencia anterior:
XMLCliente.XMLDocument.documentElement.firstChild.removeAttribute(“dni");
52. DOM - Ejercicio 2
Ejercicio 2: Modificación de XML
Ejercicio 2.1
• Referenciar al archivo clientes.xml desde un Data Island en el
código de pagina.htm
• Modificar la función cambiarDatos() para que haga lo siguiente:
• Añadir el atributo “localidad” al segundo cliente con el valor
“Málaga”
• Añadir una etiqueta “apellido” al último cliente con el valor
“Martín”
• Eliminar el primer cliente
• Cambiar el nombre del último cliente por “Jorge”.
• Para comprobar los cambios, hacer 3 bucles que muestren
todos los nombres, apellidos y localidades. Debe mostrar:
Nombres: Jose Carlos, Jorge
Apellidos: Sánchez, Martín
Localidades: Málaga, null
53. XSL
Qué es XML y qué elementos lo
El estándar XML
componen
Acceso a los datos de un documento
DOM
XML
Cómo dar formato a un documento
XSL
XML con XSL
Aplicaciones Uso práctico de XML en entornos
Prácticas Java y Microsoft
54. XSL - Introducción
• XSL (eXtensible Stylesheet Language) es un estándar creado por el
W3C para el tratamiento visual de documentos XML.
• El estándar XSL define dos lenguajes: XSLT y XPath.
• XSLT (XSL Transformations) es un lenguaje que define una serie de
elementos que sirven para dar un formato a un documento XML.
• XPath (XML Path Language) es un lenguaje que define una forma de
construir expresiones que identifican parte de un documento XML.
• Sigue una estructura de árbol, al igual que XML.
Procesador XSLT
• Un procesador XSLT es un programa que se encarga de aplicar una
plantilla XSL a un documento XML.
• Recibe como entrada un documento XSL y otro XML y devuelve
como salida un documento XML, que puede ser una página HTML.
55. XSL - Modo de funcionamiento
• XSLT usa una serie de tags que están definidos dentro de un
namespace. El namespace definido para los tags de XSLT 1.0 debe
definirse en el tag stylesheet de la siguiente forma:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
....
</xsl:stylesheet>
• El documento XSL contiene 1 o más plantillas (templates),
definidas dentro del elemento stylesheet. El atributo match indica a
que elemento se le aplica la plantilla. “/” indica que la plantilla se
aplica al elemento root.
<xsl:template match="/">
...
</xsl:template>
56. XSL - Ejemplo
Éste sería un ejemplo de documento XSL:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0“ mlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match=“/">
<html>
<head><title>Clientes</title></head>
<body>
.....
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Para aplicar el documento XSL al XML, el procesador XSLT busca
un template que se aplique al elemento root, y lo ejecuta.
57. XSL - Ejecución en IE
• Internet Explorer 5 contiene un Procesador XSLT (MSXML).
• Para aplicar una plantilla XSLT a un documento XML, se añade la
siguiente línea al comienzo del documento XML.
<?xml-stylesheet type=“text/xsl” href=“clientes.xsl” ?>
• Abrir el fichero xml con el Explorer
58. XSL - XPath
• XPath es un lenguaje para construir expresiones que referencien
a una parte de un documento XML
<clientes>
<cliente idCliente=“81422” dni=“33555888”>
<nombre>Antonio</nombre>
</cliente>
<cliente idCliente=“81555”>
<nombre>Jose Carlos</nombre>
</cliente>
</clientes>
• Referencias absolutas: comienzan con el elemento root ( / )
/clientes/cliente devuelve todos los nodos cliente
/clientes/cliente[1] devuelve el primer cliente
• Referencias relativas: parten del nodo contextual.
clientes/cliente también devuelve los nodos cliente
59. XSL - XPath - Símbolos especiales
Símbolos especiales
Aparte de la barra / , hay otros símbolos con los siguientes significados:
Símbolo Significado
@nombre Atributo llamado nombre
// El nodo y todos sus descendientes
. El propio nodo
.. El nodo padre
* Todos los nodos hijo
@* Todos los atributos
/clientes/cliente/@idCliente devuelve todos los idCliente
/clientes//* devuelve todos los nodos descendientes de cliente
Suponiendo que el nodo contextual es /clientes/cliente con idCliente=“81422”:
./nombre devuelve el valor del elemento nombre (“Antonio”)
60. XSL - XPath - Predicados
Predicados
Un predicado es una condición que filtra los elementos devueltos
por una expresión.
/clientes/cliente[nombre=‘Antonio’] devuelve los clientes
llamados Antonio
/clientes/cliente[@idCliente=‘81422’]/nombre devuelve el
nombre del cliente con idCliente igual a ‘81422’
Negación
La palabra not pone como condición que no esté un elemento o
atributo.
/clientes/cliente[not(@dni)] devuelve los clientes que no
tengan como atributo el dni.
/clientes/cliente[not(apellido)] devuelve los clientes que no
tengan el tag apellido
61. XSL - XPath - Ejercicio 1
<paises>
<pais idPais=“11”>
<nombre>Italia</nombre>
<ciudades>
<ciudad idCiudad=“320”>
<nombre>Roma</nombre>
<poblacion>5000000</poblacion>
</ciudad>
</ciudades>
</pais>
</paises>
• Obtener los nombres de todos los países
• Obtener los nombres de todas las ciudades del segundo país de la lista
• Obtener los nombres de las ciudades con población mayor a 1000000
• Obtener los idCiudad de las ciudades con población entre 50000 y 100000
• Obtener el idPais del país que contenga la ciudad con idCiudad = 320
62. XSL - XHTML
XHTML (eXtended HyperText Markup Language)
• Implementación de HTML compatible con XML
• Validación:
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN“
"DTD/xhtml1-strict.dtd">
Reglas de construcción:
• Tags obligatorios: head y body
• Tags en minúscula
• Elementos correctamente anidados
• Todos los elementos deben ser cerrados
Texto<p> <p>Texto</p>
<br> <br/>
63. XSL - XHTML
Reglas de construcción:
• Los atributos deben ir entre comillas
<td width=100> <td width=“100”>
• Los atributos deben tener valor
<option value=“1” selected>
<option value=“1” selected=“selected”>
• Para los scripts se delimita una sección CDATA
<script language="JavaScript type="text/javascript"> <!
[CDATA[
document.write("<b>Hello World!</b>");
]]>
</script>
65. XSL - Elementos XSLT
• xsl:value-of
devuelve el valor especificado en el atributo select. Puede calcular
el resultado de operaciones aritméticas
<xsl:template match=“cliente">
<xsl:value-of select="@idCliente"/>
</xsl:template>
• xsl:element
inserta un elemento con el nombre indicado en name
<xsl:element name=“a">
Ir a siguiente página
</xsl:element>
66. XSL - Elementos XSLT
• xsl:attribute
añade un atributo al elemento en el que esté contenido. El nombre
del atributo se especifica en el atributo name y su valor se especifica
en el contenido del elemento xsl:attribute.
<a>
<xsl:attribute name=“href">
http://www.com
</xsl:attribute>
Ir a inicio
</a>
• xsl:if
si la evaluación del contenido del atributo test es true, inserta el
contenido del elemento
<xsl:if test=“not(@idCliente)">
<b>Falta el dni del cliente</b>
</xsl:if>
67. XSL - Elementos XSLT
• xsl:for-each
itera sobre los elementos de la lista que devuelva la expresión
contenida en el atributo select
<xsl:for-each select=“/clientes/cliente">
<i><xsl:value-of select=“@idCliente”/></i><br>
</xsl:for-each>
• xsl:choose, xsl:when, xsl:otherwise
instancia el contenido del primer elemento xsl:when cuyo atributo
test devuelva true. Si ningún test se cumple, se instancia el contenido
del elemento xsl:otherwise.
<xsl:choose>
<xsl:when test=“expresion1”>
...
</xsl:when>
...
<xsl:otherwise>....
</xs:otherwise>
</xsl:choose>
68. XSL - Elementos XSLT
• xsl:comment
inserta un comentario en el árbol resultante.
<xsl:comment> genera el código
comentario <!-- comentario -->
</xsl:comment>
69. XSL - Funciones
Estas son las funciones más usadas definidas por XPath.
• position(). Devuelve la posición del nodo actual relativa al
conjunto de nodos del contexto.
• count(conjuntoNodos) . Devuelve el número de nodos del
conjunto pasado como parámetro.
• concat(cadena1, cadena2, ...) . Devuelve la concatenación de
sus argumentos.
• substring(cadena, inicio, fin) . Devuelve la subcadena que
comienza en la posición inicio y termina en fin.
• round(numero). Devuelve el entero más cercano al valor
pasado.
• not(boolean). Devuelve la negación del argumento. Si el
argumento no es booleano, lo convierte con la función boolean().
• boolean(objeto) . Si objeto es 0, NaN, un conjunto vacío o una
cadena vacía, devuelve false; en otro caso devuelve true.
70. XSL - Ejercicios
Preparación de la máquina
• Instalación del parser MSXML 3 o superior de Microsoft
• Activación del parser (xmlinst.exe)
71. XSL - Ejercicio 1
Ejercicio 1: Aplicar plantilla XSL a XML
Ejercicio 1.1
• Modificar el archivo productos.xml para aplicarle la plantilla
productos.xsl
Ejercicio 1.2
• Modificar el archivo productos.xsl para que debajo de cada
código muestre el precio
Ejercicio 1.3
• Modificar el archivo productos.xsl para que debajo de cada
precio muestre una lista de ciudades de procedencia.
Ejercicio 1.4
• Modificar el archivo productos.xsl para que al comienzo
muestre el número total de productos y, delante de cada
producto, aparezca un índice (1,2,...).
72. XSL - Ejercicio 2
Ejercicio 2: Elementos XSLT
Ejercicio 2.1
• Modificar el archivo productos.xsl para que si el código del
producto es 100, muestre tras el nombre el texto “(Producto en
Oferta)”
Ejercicio 2.2
• Modificar el archivo productos.xsl para que, si el precio es
menor que un euro, muestre tras el nombre el texto “(menos de 1
euro)”
Ejercicio 2.3
• Modificar el fichero productos.xsl para que, debajo de cada
producto, aparezca un botón con el nombre del producto y, al
pulsarlo, muestre su precio.
73. Aplicaciones Prácticas
Qué es XML y qué elementos lo
El estándar XML
componen
Acceso a los datos de un documento
DOM
XML
Cómo dar formato a un documento
XSL
XML con XSL
Aplicaciones Uso práctico de XML en entornos
Prácticas Java y Microsoft
74. Aplicaciones Prácticas - Introducción
XML se usa principalmente en los siguientes entornos:
• Uso de XML conjuntamente con HTML en el cliente.
Internet Explorer
Netscape Navigator
• XML en entorno Java
JAXP
• XML en entorno Microsoft
MSXML
75. Aplicaciones Prácticas - Java
• JAXP (Java API for XML Processing) es una librería de
clases de Sun que contiene:
• Un parser XML (Crimson)
• Un procesador XSLT (Xalan)
• Parte de las clases tienen licencia de W3C, y el resto de
Apache.
• Puede descargarse libremente desde http://java.sun.com/xml
• Necesita la previa instalación del JDK 1.1.8 (Java Development
Kit) o Java 2 SDK (Software Development Kit)
76. Aplicaciones Prácticas - Java
Uso de las clases de JAXP
Acceso a un documento XML desde un fichero
// Clases de JAVAXP
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
// Excepciones
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
// Acceso a ficheros
import java.io.File;
import java.io.IOException;
// DOM de W3C
import org.w3c.dom.Document;
import org.w3c.dom.DOMException;
77. Aplicaciones Prácticas - Java
Acceso a un documento XML desde un fichero (2)
// Se declara el documento donde se almacenará el XML
static Document document;
public static void main(String argv[])
{
// Se instancia la clase DocumentBuilderFactory
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
// Se obtiene el xml del archivo
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(new File(“archivo.xml”));
// Se accede al documento
document.getDocumentElement().....
}
78. Aplicaciones Prácticas - Java - Objetos
En JAXP su usan los siguientes objetos. Algunos métodos
cambian ligeramente, pero su significado son el mismo que en
el DOM:
Document
• Element createElement(nombre)
• Text createTextNode (valor)
• Element getDocumentElement()
Element subclase de Node
• String getAttribute (nombre)
• NodeList getElementsByTagName (nombre)
• removeAttribute (nombre)
• setAttribute(nombre,valor)
Text subclase de Node
80. Aplicaciones Prácticas - Java - Objetos
El método getChildNodes () devuelve una sucesión de
elementos Text y Element intercalados:
getChildNodes().item(i)
<clientes> i Devuelve
Texto1
0 Text
<cliente>Antonio</cliente>
Texto2 1 Element
<cliente>Jose</cliente> 2 Text
Texto3 3 Element
</clientes> 4 Text
81. Aplicaciones Prácticas - Java -
Ejercicios
Preparación de la máquina
• Instalación de JDK (Java Development Kit) 1.1.8 o superior
http://java.sun.com/products
• Instalación de JAXP (Java API for XML Processing)
http://java.sun.com/xml
• Instalación del servidor Web
Por ejemplo: iPlanet Web Server FastTrack Edition
http://www.iplanet.com/downloads/download/index.html
82. Aplicaciones Prácticas - Java - Ejercicio
1
Ejercicio 1: Acceso a XML
Ejercicio 1.1
• Compilar la clase ejemplo.java
javac ejemplo.java (genera el fichero ejemplo.class)
• Ejecutar la clase ejemplo.class
jview ejemplo clientes.xml
Ejercicio 1.2
• Modificar la clase java acceder.java para que lea un documento
XML pasado como parámetro.
jview acceder clientes.xml
Ejercicio 1.3
• Modificar la clase acceder.java para que muestre por pantalla el
nombre del segundo cliente
Ejercicio 1.4
• Modificar la clase acceder.java creando un bucle que muestre
todos los atributos idCliente de todos los clientes.
83. Aplicaciones Prácticas - Java
Transformación de un documento XML con XSLT
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
84. Aplicaciones Prácticas - Java
Transformación de un documento XML con XSLT (2)
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
File stylesheet = new File(“archivo.xsl”);
File datafile = new File(“archivo.xml”);
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(datafile);
TransformerFactory tFactory = TransformerFactory.newInstance();
StreamSource stylesource = new StreamSource(stylesheet);
Transformer transformer = tFactory.newTransformer(stylesource);
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
85. Aplicaciones Prácticas - Java - Ejercicio
2
Ejercicio 2: Aplicar una plantilla XSL
Ejercicio 2.1
• Crear la clase java conversor.java al que se le pase como
parámetro un documento XSL y un documento XML y que
escriba en un fichero htm de salida el resultado de aplicarle la
plantilla XSL al documento XML.
• Probarla con el documento clientes.xml y la plantilla clientes.xsl
java conversor clientes.xsl clientes.xml
Ejercicio 2.2
• Modificar la plantilla clientes.xsl para que muestre debajo del
idCliente su dni, y si no tiene, que muestre un mensaje
indicándolo.
86. Aplicaciones Prácticas - Java
Almacenar un documento XML en un archivo
• Usando el Transformer sin aplicarle ningún estilo:
Transformer transformer = tFactory.newTransformer();
StreamResult result = new StreamResult(new FileWriter("salida.xml"));
87. Aplicaciones Prácticas - Java - Ejercicio
3
Ejercicio 3: Modificación de un archivo XML
Ejercicio 3.1
• Crear la clase modificar.java a partir de la clase conversor.java
para que ésta lea el contenido de un documento Xml pasado
como parámetro, inserte un dni en el segundo cliente y guarde
las modificaciones.
Ejercicio 3.2
• Modificar la clase modificar.java para que cree un nuevo cliente
con los siguientes datos:
Nombre: Javier
idCliente: 81678
dni: 55666777
88. Aplicaciones Prácticas - Java
Otros parsers
• JDOM (www.jdom.org)
• XT (http://www.jclark.com/xml/xt.html). Implementación de un
procesador XSLT usando el parser XP.
• Xerces-J (http://xml.apache.org/xerces-j/index.html). Parser
creado por el proyecto Apache XML.
89. Aplicaciones Prácticas - Java - JSP
Acceso a un documento XML desde JSP
• Se importan las mismas clases que en Java
<%@ page import="javax.xml.parsers.DocumentBuilder" %>
...
• Se accede al documento. El fichero leído partirá del directorio
raíz del servidor web:
<%
Document document;
File xmlFile = new File("public_html archivo.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(xmlFile);
%>
<%=document.getDocumentElement().....%>
90. Aplicaciones Prácticas - Java - JSP
Aplicación de XSL desde JSP
• Se importan las mismas clases que en Java
• Se aplica la plantilla y se manda a la variable out:
<%
Document document;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
File stylesheet = new File("public_htmlarchivo.xsl");
File datafile = new File("public_htmlarchivo.xml");
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(datafile);
TransformerFactory tFactory = TransformerFactory.newInstance();
StreamSource stylesource = new StreamSource(stylesheet);
Transformer transformer = tFactory.newTransformer(stylesource);
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(out);
transformer.transform(source, result);
%>
91. Aplicaciones Prácticas - Java - Ejercicio
4
Ejercicio 4: Uso de XML con JSP
Ejercicio 4.1
• Modificar el archivo pagina.jsp para que muestre los datos del
archivo cliente.xml de la siguiente forma:
Nombre: Antonio
Código: 81422
Dni: 33555888 ó No tiene
Teléfonos: 952334455 666909090 ó No tiene
Ejercicio 4.2
• Modificar la página pagina2.jsp para que muestre por pantalla
el resultado de aplicar la plantilla clientes.xsl a clientes.xml.
• Modificar el archivo clientes.xsl para que pagina2.jsp muestre el
mismo resultado de pagina.jsp
92. Aplicaciones Prácticas - Microsoft
• Para usar XML en aplicaciones Microsoft, se usa el objeto COM
Microsoft XML (MSXML).
• Internet Explorer 5 viene con una versión antigua (msxml.dll)
Objeto Microsoft.XMLDOM
• Se debe instalar una versión más moderna
Objeto MSXML2.DOMDocument
93. Aplicaciones Prácticas - Microsoft
Acceder a un documento XML
• Si estamos en Visual Basic, añadir el objeto Microsoft XML a las
referencias del proyecto.
• Instanciar el objeto.
En Visual Basic.
Dim objParser As MSXML.DOMDocument
Set objParser = New MSXML.DOMDocument
En ASP
Set objParser = Server.CreateObject("Microsoft.XMLDOM")
94. Aplicaciones Prácticas - Microsoft
• Cargar el documento XML
desde un archivo:
If objParser.Load("c:tempxmldocumento.xml") Then
' Ha funcionado
Else
' Ha ocurrido un error
End If
Desde una cadena de texto:
objParser.loadXML(“<clientes> .... </clientes>”);
• Usar el documento (obtener el elemento raíz):
objParser.documentElement
• Destruir el objeto tras usarlo.
Set objParser = nothing
95. Aplicaciones Prácticas - Microsoft -
Ejercicio 1
Ejercicio 1: Acceso a XML desde ASP
Ejercicio 1.1
• Modificar el archivo pagina.asp para que guarde en la variable
domXml el documento almacenado en productos.xml.
• Modificar la página para que muestre el idPedido del primer
pedido del documento XML.
Ejercicio 1.2
• Modificar la página para que aparezca la cantidad del segundo
producto del tercer pedido.
Ejercicio 1.3
• Modificar la página para que muestre los nombres de todos los
productos adquiridos.
Ejercicio 1.4
• Modificar la página para que aparezca el número de cliente del
pedido con idPedido=1002, y la suma de todo su pedido.
96. Aplicaciones Prácticas - Microsoft
Aplicar una plantilla XSLT a un documento XML
<%
Dim domXml As MSXML.DOMDocument
Dim domXsl As MSXML.DOMDocument
Dim resutl As String
Set domXml = New MSXML.DOMDocument
Set domXsl = New MSXML.DOMDocument
domXml.Load("c:documento.xml")
domXsl.Load("c:plantilla.xsl")
result = domXml.transformNode(domXsl)
%>
Mostrar el resultado en ASP
<%=result
%>
97. Aplicaciones Prácticas - Microsoft -
Ejercicio 2
Ejercicio 2: Aplicación de una plantilla XSL a un
documento XML desde ASP
Ejercicio 2.1
• Modificar el archivo pagina.asp para que muestre el resultado
de aplicar la plantilla productos.xsl al documento productos.xml.
Ejercicio 2.2
• Modificar el archivo productos.xsl para que muestre el siguiente
resultado:
Pedido nº: 1000
Cliente: 123
Productos:
Línea Id Nombre Precio Total (euros)
1 315 Patatas fritas 0.9
2... ... .... ....
....
98. Recursos
• W3C (Wolrd Wide Web Consorcium)
http://www.w3.org
• Sun
http://java.sun.com/xml
• Microsoft
http://msdn.microsoft.com/xml
• Apache XML Project
http://xml.apache.org
• Otros
http://www.xml.com
http://www.xml.org
http://www.xmlsoftware.com
http://www.xmlhack.com
Notas del editor
Los lenguajes de marcas tienen sus orígenes en el GML (Generalized Markup Language), creado por IBM en los 60 para resolver sus problemas con el tratamiento de documentos. Cada aplicación usaba unas marcas distintas para describir las entidades de los documentos, así que IBM usó código ASCII para la creación de estas marcas, ya que podrían ser accesibles desde cualquier aplicación. Más tarde, GML cayó en manos de ANSI (American National Standards Institute), pasando a denominarse SGML (Standard Generalized Markup Language) y convistiéndose en un borrador. ISO (International Standards Organization) lo convirtió en un estándar en 1986. Después se crearon lenguajes de marcas subconjuntos de SGML, como XML, HTML (HyperText Markup Language) o RTF (Rich Text Format). En 1989, el protocolo HTML fue creado por el CERN (Organización Europea en Investigación de Física Nuclear). Tenía el problema de que era demasiado simple, y no permitía crear tags personalizados. Así, en 1998, el w3c acepta el estándar XML. La mayor diferencia de XML con SGML es que XML no precisa de DTDs, mientras que SGML sí. Existen 2 tipos de lenguajes de marcas, los que se dedican al tratamiento de la información y los que se encargan de mostrar esa información con un formato específico. XML sería del primer tipo, ya que solo contiene datos, no la forma de mostrarlos (si es en negrita, tamaño de letra,...). Sin embargo HTML si se encarga de esto último. Así, estos 2 lenguajes suelen trabajar conjuntamente, XML proporciona los datos y HTML les da un formato y los muestra.
XML es un lenguaje que no tiene unas marcas prefijadas. Las marcas pueden ser creadas por el usuario o la aplicación, lo que proporciona una gran flexibilidad para representar datos. Debido a este hecho, se ha convertido en uno de los estándares más usados en Internet a la hora de intercambiar información entre varias máquinas, porque es independiente de la plataforma en la que se traten los datos (tan solo es texto ASCII). XML no es sólo un lenguaje para estructurar datos. También es un metalenguaje que sirve para definir otros lenguajes. Así, HTML es un subconjunto de XML con unos tags específicos. XML usa las etiquetas para estructurar los datos. Esta estructura es en forma de árbol, que permite mantener la información de forma jerárquica siendo así más fácil e intuitivo acceder a ella.
Este es un ejemplo de un documento XML que contiene información acerca de discos de música. Dejando aparte las 2 primeras líneas que conforman la cabecera, en este ejemplo se puede observar claramente la estructura en forma de árbol que debe mantener un documento XML. Se distingue un elemento raíz (<discos>), y de él cuelgan varios elementos <disco>. A su vez, dentro de cada disco se guarda diferente información sobre él (artista, título, pistas y precio).
Un elemento XML puede contener tanto un valor, como en este ejemplo, como otros elementos XML. También es posible las dos cosas a la vez.
El ejemplo anterior de los discos es un documento XML. Reglas: Los elementos deben cerrarse, es decir, toda etiqueta debe tener su correspondiente etiqueta que cierra el elemento. O ser una etiqueta cerrada al final, como en <precio valor=“”/> Los elementos deben estar limpiamente anidados, es decir, las etiquetas de apertura y cierre no pueden cruzarse como en este caso: <disco> <artista> </disco> </artista> El documento debe tener una única raíz, no es posible tener la siguiente estructura en el primer nivel: <discos> ... </discos> <cds> ... </cds> Para permitir esto, habría que insertar estas etiquetas dentro de otra superior.
De este modo, no puede usarse cualquier otro carácter como eñes o comillas. Las siguientes etiquetas serían erróneas: <1er-apellido>Fernández</1er-apellido> (no puede empezar por un número) <segundo apellido>López</segundo apellido> (no puede contener espacios) Además, hay que recordar que XML es case-sensitive , por lo que la etiqueta de cierre debe ser igual que la de inicio: <nombre>Alfonso</Nombre> no sería correcto.
Un parser XML es una aplicación que se encarga de obtener un documento XML para acceder a su contenido. Si al cargar el documento XML, el parser falla, entonces es que el documento XML no está bien formado porque incumple alguna de las reglas.
Fallos: El primer empleado no puede tener 2 atributos “apellido”. Los elementos “direccion” de los 2 primeros empleados no tienen cierre. El tercer empleado tiene los elementos de inicio y de fin distintos La primera oficina tiene atributos “1tlf” y “2tlf” (no son válidos). Los empleados y las oficinas tienen que estar dentro de un elemento común
Los namespaces fueron creados para evitar colisiones en los nombres que las etiquetas o atributos de los documentos XML que circulan por Internet. Por ejemplo, se puede crean un documento XML con información a cerca de empleados y con la etiqueta “nombre” que guarde el nombre del empleado. Pero si se quiere crear otro documento XML, por ejemplo de clientes, con la etiqueta “nombre”, debe poder diferenciarse de alguna forma estos 2 tags que se llaman igual pero contienen información distinta. En realidad, las URL y URN son subconjuntos de URI, son clases de URI. Una URL es una forma de identificar un recurso en Internet, dando una dirección. Por ejemplo, el namespace usado para utilizar etiquetas xsl: http://www.w3.org/1999/XSL/Transform Un recurso puede ser tanto una página web como un archivo o, en este caso, un namespace . Una URN también identifica un recurso, pero no por su localización, si no asignándole un nombre. Este nombre puede estar asociado con varias localizaciones, y si una no está disponible, se intenta acceder a otra. Por ejemplo: urn:BookLovers.org:BookInfo
Declaración por defecto. En el ejemplo, los nombres BOOK, TITLE y currency pertenecen al namespace especificado. Declaración explícita. Se usa cuando dentro de un mismo elemento (en este caso BOOK) aparecen nombres XML (etiquetas o atributos) pertenecientes a varios namespaces. En el ejemplo, BOOK, TITLE y PRICE pertenecen al namespace definido con el nombre bk , y currency pertenece al namespace definido por money .
Todo documento XML está formado por 2 secciones: el prólogo (que contiene información propia del xml) y el document element o elemento raíz (que contiene los datos en sí). Ninguno de los elementos del prólogo son obligatorios, aunque sí son recomendables. Aunque si se quiere que el documento XML sea válido, se deberá usar un DTD y declararlo en el prólogo.
Declaración No es obligatoria, aunque es recomendable ponerla. Si se pone, debe aparecer en la primera línea. No puede ser precedida por espacios en blanco o comentarios. El ejemplo especifica que el documento XML cumple con el estándar XML 1.0, y que usa una codificación ISO-8859-1, también conocida como Latin-1, es decir, que contiene caracteres propios de países de Europa occidental, como España, Francia o Alemania. El atributo standalone es opcional. Un valor “no” indica que el documento debe acceder a un DTD externo para , por ejemplo, añadir valores por defecto. Un valor “yes” indica que no necesita del DTD. El valor por defecto es “no”. Comentarios El siguiente tag sería válido: <nombre>Antonio <!--Apellido-->López</nombre> Pero este otro no: <nombre <!-- nombre del cliente -->>Antonio López</nombre> Un parser XML no está obligado a procesar los comentarios, por lo que al acceder a los datos del documento tras haber sido leído por el parser, es posible que los comentarios no aparezcan (esto depende del parser usado).
Instrucciones de procesamiento Al igual que los comentarios, pueden ser colocadas en cualquier parte del texto, excepto dentro de un tag. Pero algunas instrucciones de procesamiento tienen algunas restricciones con su posición. Por ejemplo, la del ejemplo, debe insertarse antes del elemento raíz del documento XML. Document Type Declaration Un documento válido debe tener una referencia a un DTD para que lo valide. El DTD contiene una serie de reglas que el documento XML debe cumplir. En la declaración se debe indicar el nodo raíz y el nombre del fichero dtd. En el ejemplo se indica que discos es el nodo raíz y discos.dtd es el archivo que contieneel DTD. También es posible insertar el DTD en la propia declaración en lugar de referenciar un archivo externo, pero es más útil mantener el DTD aparte, ya que puede ser usado por varios documentos XML.
El DTD es el encargado de validar la estructura de un documento XML. El parser XML es el encargado de comprobar que el documento XML cumple las reglas del DTD, y si no se cumple alguna especificar cual. El DTD puede definir elementos (las etiquetas usadas en el documento XML), atributos (los atributos contenidos en esas etiquetas) y entidades (nombres asociados a un valor, por ejemplo, &empresa; puede contener el nombre de la empresa). Hay algunas definiciones o restricciones que no pueden describirse con un DTD. Por ejemplo, no puede definirse el document root, no puede especificarse el número de instancias que tiene cada elemento en el documento XML, o no puede detallar el formato de fecha o número que debe usar cada valor. Debido a estas carencias, se creó el XML Schema, otro lenguaje de validación de documentos XML, aunque éste no se hizo recomendación por parte del W3C hasta Mayo del 2001.
En el primer caso, discos se refiere al document element , y discos.dtd se refiere al archivo donde se ubica el DTD. Así, el formato de la declaración sería el siguiente: <!DOCTYPE document-element SYSTEM "DTD-URI"> Para el segundo caso, tendría la siguiente sintaxis: <!DOCTYPE document-element [declarations...]> También es posible combinar las dos formas obteniendo un DTD interno y añadiéndole nuevas reglas en la misma sentencia de definición. La sintaxis sería la siguiente: <!DOCTYPE document-element SYSTEM "DTD-URI" [declarations...]>
La primera sentencia declara la etiqueta “empleado”, especificando que debe contener una etiqueta “nombre” y otra etiqueta “direccion”, en ese orden. Si faltara alguna de esas etiquetas, ya no se cumpliría las restricciones del DTD. La segunda sentencia declara un nodo hoja, es decir, una etiqueta que debe tener un valor concreto, y no otras etiquetas. Así que se debe especificar el tipo de dato, en este caso, PCDATA.
En la primera sentencia, debe cumplirse el orden de aparición de los elementos hijo. En la segunda sentencia, se cumplirá la restricción si aparece uno de los hijos o los dos. La tercera sentencia especifica que debe aparecer primero el nombre o el apellido o los dos, y después la dirección.
Los modificadores se pueden poner detrás de un elemento o de una lista de elementos que estén dentro de unos paréntesis. El primer ejemplo especifica que el elemento empleado debe tener primero un tag nombre , luego opcionalmente un tag apellido , y después uno o más tags direccion . El segundo ejemplo especifica que el elemento empleado debe contener primero un elemento nombre , después otro elemento apellido , y después una sucesión de elementos que pueden ser direccion o telefono . Esta última sucesión puede estar vacía o puede contener todos los elementos necesarios, y no importa el orden de alternancia en el que aparezcan las direcciones y los teléfonos.
Elementos Vacíos Un elemento vacío es aquel que no tiene valor. Normalmente los elementos vacíos suelen tener uno o más atributos. Para el ejemplo anterior, cualquiera de los siguientes elementos sería correcto: <direccion/> <direccion></direccion> Lo más lógico sería añadirle algunos atributos: <direccion calle=“Larios” numero=“1” piso=“1” letra=“A”/> Contenido ANY Permite cualquier contenido dentro del elemento. No es recomendable usarlo, a no ser que sea necesario, aunque es útil cuando se está desarrollando un DTD y hay partes que no están construidas. Para el ejemplo, el siguiente elemento sería válido <otrosDatos> ..... </otrosDatos>
Se debe crear un archivo xml con el contenido del slide y un archivo dtd que lo valide, y probarlo con el xmlwriter.
La sintaxis para la declaración de atributos sería la siguiente: <!ATTLIST elem-name [attr-name attr-type default-value-clause]+> En el primer ejemplo se está definiendo 3 atributos para el elemento direccion . El primero sería fijo ( ciudad ), el segundo ( calle ) sería obligatorio, y el tercero ( numero ) sería opcional. El cuadro de la derecha muestra un elemento válido para esa declaración. También es posible declarar los atributos en líneas separadas: <!ATTLIST direccion ciudad CDATA # FIXED> <!ATTLIST direccion calle CDATA #REQUIRED > <!ATTLIST direccion numero CDATA #IMPLIED> Los atributos pueden aparecer en el elemento en cualquier orden. Es decir, el siguiente elemento también sería válido: < direccion numero=“5” calle=“Larios” ciudad=“Málaga” / > La cláusula de valor por defecto ( default-value-clause ) puede tener los siguientes valores: REQUIRED. El atributo es obligatorio y no se especifica valor por defecto. IMPLIED. El atributo es opcional y no se especifica valor por defecto. FIXED. El atributo tiene un valor fijo e inmutable. Es un atributo obligatorio que no puede ser modificado. Si se declara con un valor por defecto, el atributo debe aparecer en cada elemento con ese valor. Por ejemplo, <!empresa nombre CDATA #FIXED “Accenture”/> no permitiría el siguiente elemento <empresa nombre=“AC”/> el atributo debe aparecer, y con el mismo nombre: <empresa nombre=“Accenture”/> Valor por defecto. El atributo es opcional. Si aparece, contendrá el valor especificado, y si no, cogerá el valor por defecto. En el ejemplo, si el atributo pais no aparece en la dirección, se tomará el valor “España”.
Enumeración. Los posibles valores que aparecen en la enumeración son tokens. Un token permite los mismos caracteres que un nombre XML (letras, dígitos, guión bajo y punto), pero además permite que el token empiece por cualquiera de esos caracteres. En el ejemplo se está definiendo que el valor del elemento empleado debe ser “hombre” o “mujer”. Así mismo, está declarando que es un atributo obligatorio. De esta forma, el siguiente elemento sería incorrecto: <empleado sexo=“H”/> Tipos de atributo. En el cuadro de la izquierda se muestra una definición de atributo en un DTD, y en el de la derecha aparece un ejemplo válido de elementos XML para la definición anterior. CDATA es el tipo de dato más usado. Permite caracteres alfanuméricos. ID. Cada elemento debe tener un valor único en este atributo. Así, el ejemplo declara que no pueden haber dos empleados con el mismo empid . Los valores de estos atributos deben ser nombres XML válidos. Por esto, un valor no puede empezar por número, así que al id del empleado se le debe añadir un carácter válido al principio (en lugar de “120” se puede usar “A120”). Cada elemento puede tener como máximo un atributo de tipo ID. IDREF. En el ejemplo, el elemento empleado tiene como atributo opcional un supervisor , que debe contener el valor del empid de alguno de los elementos empleado . Además, está el tipo IDREFS, que permite almacenar varios valores separados por espacio.
Las entidades predefinidas están para evitar usar símbolos que no están permitidos en los valores de los elementos y atributos. En el ejemplo, la entidad &empresa; se sustituiría por su valor, obteniendo el resultado: < empleado empresa= “ Coritel AOS "> El parser XML es el encargado de realizar esta sustitución. El valor de una entidad puede tener tanto un texto como una URI. Además, puede contener referencias a otras entidades, siempre y cuando no se produzcan ciclos en esas referencias.
Crear un archivo xml con el documento del slide y otro dtd que lo valide. Se puede validar un documento XML con herramientas como XMLwriter. http://www.xmlwriter.com El atributo nohay se refiere al producto a enviar si no hubieran existencias del producto.
XML Schema es un estándar para la validación de la estructura de un documento XML. Debido a algunas carencias en la definición de datos por parte de los DTDs, se creó el estándar XML Schema, que permite definir con más detalle la estructura de un documento XML, como los tipos de datos. Este tipo de mejoras eran necesarias. Por ejemplo, en la validación de una orden de compra, es necesario comprobar que no existen cantidades negativas o inserción de letras donde deben haber números. Este tipo de validaciones las puede realizar el XML Schema. Tras 2 años decidiendo que debía entrar en el estándar, en Mayo del 2001 el W3C lo convirtió en estándar. Se valida mediante un parser, usando un método estándar que recibe como entrada el documento XML y el XML Schema y devuelve si el documento es válido o no. Mejora con respecto a los DTDs Permite especificar el tipo de los datos (entero, decimal...) y restringir el rango de valores introducidos. Por ejemplo, especificar que el valor de un campo debe ser entre 1 y 999. También puede especificar que una cadena debe empezar por determinada letra o tener determinado número de caracteres. Los DTDs usan una sintaxis completamente diferente a la usada en los documentos XML. Los XML Schemas, al estar escrito respetando las normas XML, es más fácil de depurar por el programador y de manejar por el parser. Los XML Schemas pueden ser ampliados con módulos externos, de forma que un schema puede usar las declaraciones de tipos ya escritas en otro schema. Permite especificar el número de veces que aparece un elemento dentro de otro, y el orden en que éstos aparecen. En el DTD, para decir que un elemento debe aparecer 20 veces habría que poner 20 veces el nombre del elemento: <!ELEMENT padre (hijo,hijo,hijo,...)> En un DTD, todos los elementos se declaran en el primer nivel. De esta forma, el nodo raiz podría ser cualquiera de esos elementos. Sin embargo, en un XML Schema se declaran de forma anidada, de forma que un elemento es forzosamente hijo de otro. Aunque también se permite la declaración de varios elementos en el primer nivel.
El atributo content permite: textOnly: sólo contiene texto eltOnly: sólo contiene elementos empty: el elemento está vacío ( por ejemplo: <direccion ... /> ) mixed: puede contener tanto elementos como texto El atributo order puede ser: seq: debe contener todos los elementos indicados y en el orden indicado one: sólo puede contener uno de los elementos indicados many: puede contener los elementos indicados 0 ó más veces y en cualquier orden.
Antes de realizar los ejercicios es recomendable instalar la versión 3 o superior de MSXML.
En este ejemplo, el atributo calidad sólo podría contener uno de los valores indicados: alta, media o baja.
SAX es una API que permite que un mismo código que accede a un parser sirva para acceder a otro parser. Aunque esos dos parsers deben cumplir el estándar SAX. SAX en realidad es un estándar de facto , es decir, es una norma seguida por muchos parsers pero no está definido como estándar por ninguna organización (como el W3C).
El DOM son un conjunto de métodos y propiedades que sirven para acceder a los datos de un documento XML. Esto se hace gracias a un parser que se encarga de leer el documento XML, ya sea desde un fichero o desde cualquier otra procedencia, y devuelve el objeto correspondiente para el acceso al DOM. Pero el estándar XML no define la forma de escribir o leer el documento en un archivo. El W3C definió en 1998 el estándar DOM Level 1, es decir, una serie de especificaciones que los objetos de cualquier librería deben seguir. Pero esto a veces no se cumple exactamente, por lo que la API de una librería y otra puede variar. En esta sección se usa la API definida por el parser de Microsoft (MSXML), válida para Internet Explorer.
Pueden usarse los dos métodos de obtener un documento XML, pero el más común es el segundo, ya que permite que el archivo que contiene el XML sea usado por otras páginas HTML.
Las propiedades y funciones más comunes para acceder a los datos de un documento XML son las siguientes: XMLDocument. documentElement. childNodes. Es una propiedad de solo lectura. Si el elemento no tiene hijos, devuelve una lista vacía. El elemento devuelto es del tipo NodeList. item(n) es un método del objeto NodeList. text devuelve el valor de un elemento, pero si éste tiene hijos, devuelve el valor de todos sus hijos separados por espacio. El ejemplo, que usa el documento XML de la página anterior, obtiene el elemento raiz ( clientes ), después el primer hijo (el primer nodo cliente ), de éste, su primer hijo ( nombre ) y de éste su valor (“Antonio”).
En el ejemplo, el fragmento XMLCliente.XMLDocument.documentElement. getElementsByTagName(“nombre”) devolvería una lista con dos elementos, los dos tags nombre que existen a partir del elemento raíz.
getAttribute(nombre) devuelve null en caso de que no exista el atributo.
Ejercicio 1.1 Para probar la página se abrirá en el Explorer y se pulsará el botón “Acceder al XML” para que se muestren los mensajes.
createTextNode crea un objeto Text , pero no es insertado automáticamente en el árbol XML, debe ser insertado por alguno de los métodos appendChild , replaceChild o insertBefore . Al crearse, su parentNode se establece e a null. El ejemplo muestra como insertar una etiqueta llamada apellido con el valor “Fernández” en el primer cliente, al mismo nivel que la etiqueta nombre . Primero se debe crear un objeto Element con la función createElement pasándole el nombre del tag, luego un objeto Text con la función createTextNode pasándole el valor que vamos a darle a la etiqueta. Después se añade el texto a la etiqueta con appendChild . Finalmente, se accede al primer elemento cliente con XMLCliente.XMLDocument.documentElement.firstChild y se le aplica la función appendChild para añadirle el elemento creado.
removeChild . Se le pasa como parámetro un objeto, por lo que antes hay que acceder a él para pasárselo como parámetro. El elemento no tiene por qué ser un elemento hoja, al eliminarse un elemento con hijos, éstos también son eliminados. En el ejemplo, la expresión XMLCliente.XMLDocument.documentElement.childNodes.item(1) devuelve el segundo elemento cliente , y es pasado como parámetro a la función.
setAttribute . removeAttribute . Elimina el atributo especificado. Si en el DTD se define algún valor por defecto para ese atributo, el atributo, en lugar de ser eliminado, toma inmediatamente ese valor.
Ejercicio 2.1 Para probar la página se abrirá en el Internet Explorer y se pulsará el botón “Cambiar el XML”. Hay que tener en cuenta que los cambios no se guardan en el fichero, sólo en memoria. Por esto, si se quiere volver a probar la página hay que recargarla para que vuelva a obtener el xml del fichero, no se puede pulsar 2 veces el botón si recargarla.
XSL es un estándar que sirve de hoja de estilos para proporcionar un formato a los documentos XML. Aunque ya existen otros formatos de hojas de estilos, como CSS, la principal diferencia de XSL radica en que permite modificar la propia estructura del XML. Así, CSS sólo da un aspecto al texto que ya hay, mientras que XSL además puede filtrar los datos, cambiar el orden de éstos o insertar sus propios datos en el resultado final. XSL fue definido por el W3C en 1997 como un borrador, es decir, fue publicada pero podía ser modificada. En 1999, se convirtió en una recomendación del W3C y se encuentra en la versión 1.0. XSL está formado por 3 partes: los lenguajes XSLT y XPath, y por Formatting Objects , un conjunto de elementos para el uso de características avanzadas de diseño de documentos. De esta forma quedan separados los datos y la presentación. El documento XML almacena los datos y la plantilla XSL se encarga del formato. El procesador XSLT es el encargado de realizar la transformación del documento XML aplicándole una plantilla XSL. El resultado también es un documento XML. Al ser HTML un subconjunto de XML, la salida puede ser definida en HTML. También se puede obtener el resultado en otros lenguajes de marcas, como WML (Wireless Markup Language). Existen tanto procesadores XSLT de libre distribución (Xalan, Saxon, XT) como otros que están incluidos en Sistemas Operativos o navegadores (MSXML viene con Internet Explorer) o en bases de datos relacionales (Oracle XML). El procesador XSLT puede actuar de dos formas: En el servidor: el cliente hace una petición al servidor, éste obtiene el documento XML y la hoja de estilos XSL, el propio servidor ejecuta el procesador XSLT y envía el resultado al cliente. En el cliente: el cliente hace una petición del XML, y éste se lo manda. Si el XML necesita una hoja de estilos XSL, se la pide al servidor y éste se la envía. El propio cliente ejecuta el procesador XSLT y muestra el resultado. Este es el modelo de trabajo de MSXML. Tiene la ventaja de que libera de trabajo al servidor.
El namespace definido para xsl puede tener otro prefijo que no sea xsl , pero éste es el que se usa normalmente. También se puede hacer uso del siguiente namespace, que es el de la primera versión de xsl: http://www.w3.org/TR/WD-xsl pero carece de algunas características avanzadas, como funciones o cálculos aritméticos. Si el namespace http://www.w3.org/1999/XSL/Transform no funciona, significa que se debe instalar una versión más avanzada del parser. Pueden declararse plantillas para otros elementos que no sean el raíz, por ejemplo: <xsl:template match=“/clientes/cliente”> </xsl:template> esta plantilla está definida para el elemento cliente hijo de clientes . Para ejecutarla, se debe llamar al elemento apply-templates : <xsl:apply-templates select=“/clientes/cliente”/> Pero si no se llama, sólo se ejecutará la plantilla del elemento raíz.
Un documento XSL es también un documento XML, por lo que también podemos insertarle una cabecera. En el ejemplo especifica la versión de xml (1.0) y la codificación de los caracteres usados (ISO-8859-1, es decir, caracteres de países occidentales).
Estos serían los pasos para aplicar una plantilla XSLT a un documento XML usando el Internet Explorer 5.
XPath es un lenguaje no-XML (no usa tags) integrado como parte del estándar XSL. Define un lenguaje capaz de seleccionar una parte de un documento XML, como una lista de elementos o de valores. Las expresiones usadas en el atributo match de los elementos xsl:template usan el lenguaje Xpath, así como las usadas en elementos xsl:if , xsl:for-each , ... Las referencias absolutas comienzan con una barra desde el elemento raíz. Si se tiene una lista, los corchetes se pueden usar para obtener un elemento indicando su índice (siendo el primer elemento el número 0). Las referencias absolutas parten del nodo contextual. Si el tag template se aplica al nodo raíz ( / ), ése será el nodo contextual. Aunque puede cambiar al entrar, por ejemplo, en un bucle for-each . El nodo contextual pasaría a ser el nodo actual del bucle.
El punto (.) y dos puntos (..) parten del nodo contextual. Por lo tanto, si estamos dentro de un bucle xsl:for-each , el punto se referirá al nodo actual. Los comodines se usan para poder referirse a cualquier elemento hijo (sólo los hijos directos) con *, o a cualquier atributo con *@. Así, la expresión /clientes/*/nombre cogería cualquier elemento nombre que descienda de un elemento descendiente de clientes .
Predicados La expresión que aparece entre los corchetes suele ser una expresión booleana. Pueden usarse los operadores comunes (= , != , < , > , <= , >=), aunque normalmente es necesario sustituir el símbolo < por su entidad equivalente &lt; (lower than). También pueden usarse los operadores booleanos and , or y not .
XHTML es la revisión de HTML para hacerlo compatible con XML. Así, un documento XHTML podrá ser tratado por cualquier herramienta que trate con documentos XML (editores, parsers, ...). De hecho, XHTML es un subconjunto de XML, es un lenguaje definido usando XML. HTML se encuentra actualmente en la versión 4, y esta será la última versión de este lenguaje. Debido a la demanda de un lenguaje más extensible y estándar, se creó XHTML 1.0. Todos los elementos usados en HTML 4 siguen siendo válidos en XHTML 1.0. Para la validación de los documentos XHTML pueden usarse 3 DTDs, dependiendo del tipo de documento a usar. Además de ajustarse a las reglas de XML, un documento XHTML debe seguir otra serie de reglas de construcción. Si una plantilla XSL devuelve una página HTML, ésta debe cumplir las reglas de construcción de XML, pero no hace falta que cumpla todas las reglas de XHTML. Por ejemplo, no es obligatorio que exista el tag head .
Los scripts se meten en una sección CDATA para que no haya problemas con los caracteres < y &. CDATA trata los caracteres sin procesarlos. Así, pusiésemos fuera de la sección CDATA una comparación Javascript: if (x<y) ... el símbolo < sería tratado como el inicio de un tag y fallaría.
Los elementos XSL deben usarse de manera que el resultado tenga estructura de árbol, al igual que XML. Todos los elementos deben tener un elemento de cierre. Las normas son las mismas que para los documentos XML. Dentro de un elemento pueden insertarse otros elementos. Así, dentro de un bucle for-each pueden insertarse, por ejemplo, elementos if o incluso otro elemento for-each , como ocurre en la mayoría de lenguajes de programación. xsl:value-of Inserta en el árbol resultante el resultado de evaluar la expresión contenida en el atributo select . El resultado dependerá del tipo de dato insertado en el atributo select . Si es un elemento (incluso el elemento raíz), devuelve su contenido o el contenido de todos sus hijos, quitando los tags y dejando sólo los valores de los elementos. Si es un atributo devuelve el valor del atributo. En el valor devuelto resuelve los valores de las entidades y las sustituye en el texto. Si se le pasa un conjunto de nodos, devuelve el valor del primer nodo. El ejemplo devuelve el valor del atributo idCliente del nodo contextual. Las operaciones aritméticas válidas son +,-,*,div,mod xsl:element El ejemplo crearía un elemento así en el árbol resultante: <a> Ir a siguiente página</a> Este elemento además puede tener atributos, que deberán ser definidos con elementos xsl:attribute .
xsl:attribute Añade un atributo al elemento que lo contiene en el árbol resultante. En todo caso debe preceder a cualquier otro contenido del elemento que lo contiene. En el ejemplo, dentro del elemento <a> se debe insertar tanto su atributo como su valor. Los atributos deben ir primero. Daría como resultado lo siguiente: <a href=“http://www.com”>Ir a inicio</a> También pueden definirse una lista de atributos con el elemento <xsl:attribute-set> y usarlos en varios elementos. xsl:if Inserta el contenido en el árbol resultante si la evaluación de test devuelve true . El ejemplo inserta un mensaje si el nodo contextual no tiene un atributo idCliente .
xsl:for-each Instancia su contenido en el árbol resultante tantas veces como elementos encuentre en el conjunto introducido en el atributo select . La expresión del atributo select debe ser una expresión XPath válida. En cada iteración, coge un elemento del conjunto como elemento actual, y cualquier expresión XPath que sea una referencia relativa, será relativa respecto a ese elemento actual. Dentro del elemento pueden insertarse otros elementos for-each , if o cualquier otro elemento xsl. Opcionalmente, puede contener un elemento <xsl:sort> para que itere sobre los elemento siguiendo un orden concreto. Si no se incluye este elemento, se itera según el orden de aparición de los elementos. Este elemento tiene la siguiente estructura: <xsl:sort select="expression" data-type="text" | "number" order="ascending" | "descending“ /> siendo expression una expresión XPath que indica el campo por el que debe ordenarse, data-type indica si es una ordenación numérica o alfanumérica, y order indica si es ascendente o descendente. xsl:choose, xsl:when, xsl:otherwise Debe contener uno o más elementos xsl:when y cero o un elemento xsl:otherwise . Sólo instancia el contenido del primer elemento when que se cumpla, y si no se cumple ninguno, instancia el contenido del elemento otherwise . Si no se cumple ningún when y no existe elemento otherwise , entonces no devuelve nada.
xsl:comment Este elemento no puede contener otros elementos. Sólo texto y referencias a entidades. Estas referencias serán reemplazadas por el texto asociado en el árbol resultante.
Estas son las funciones más comunes que pueden ser usadas en XSLT, tomadas del estándar XPath. A parte de éstas, hay otras funciones de XPath y algunas funciones definidas por XSLT. Estas funciones pueden ser usadas en los tags xsl:value-of .
Las versiones 5 y 5.5 del Internet Explorer contienen un parser antiguo (MSXML) que no permite aplicar todas las ventajas del estándar XSL. Se debe instalar la versión 3 de MSXML o superior para poder realizar los ejercicios del tutorial. Pero, después de instalarla, IE seguirá usando la primera versión, puesto que la versión 3 estará desactivada. Se pueden instalar varias versiones del MSXML sin pisar una a la otra, pero sólo habrá una activa que se use en las aplicaciones de Microsoft. Para activarla se debe ejecutar el xmlinst.exe
Ejercicio 1.1 Para probar el xml, abrirlo desde el Internet Explorer. Si se usan caracteres extraños, se debe agregar el atributo encoding=“ISO-8859-1” a la cabecera: <?xml version="1.0" encoding="ISO-8859-1"?> También se pueden añadir caracteres ASCII con la expresión &#65; siendo el 65 el código del carácter.
La presentación de páginas HTML con contenido XML es una de los usos más extendidos de XML, pero también pueden usarse para el intercambio de datos entre máquinas de forma que no hayan problemas de formato, ya que XML es un estándar basado en formato de texto, ideal para el manejo de información en Internet. Este intercambio de información se hace normalmente usando entornos de programación Java o Microsoft. El uso de XML para presentación de datos HTML usando XSL es el caso que hemos estado viendo durante los capítulos anteriores. XML proporciona los datos y la plantilla XSL le aplica una transformación para obtener una página HTML. Este proceso se hacía en el cliente. Microsoft Internet Explorer 5.0 contiene el parser MSXML que permite acceder a documentos XML y aplicarle transformaciones XSL. Netscape Navigator no tiene soporte XML hasta la versión 6.0. Usando Java, el acceso a datos del documento XML y posible transformación por XSL se realiza en el servidor. Sun posee una librería de clases (JAXP) de libre distribución que proporciona todas estas funciones. Aunque también existen otras librerías de libre distribución creadas por terceras partes. Estas clases pueden ser usadas tanto en JSP como en clases Java. En entornos Microsoft, el objeto COM MSXML permite el acceso a documentos XML ya sea en el cliente con el IE (que ya contiene el MSXML) o en el servidor con ASP o Visual Basic.
JAXP es el conjunto de clases que Sun pone a disposición del que lo necesite que permite el manejo de documentos XML, soportando los estándares de XML y XSL definidos por el W3C. Sun permite además la descarga de otras utilidades que hacen uso de XML, como JAXM (Java API for XML Messaging) que permite el intercambio de mensajes XML usando el protocolo SOAP (Simple Object Access Protocol). Todas estas aplicaciones se pueden descargar a la vez con el Java XML Pack. Los paquetes que comienzan con org.w3c.dom están bajo licencia del W3C, y el resto están bajo licencia de Apache ( http://xml.apache.org ). El código fuente también está disponible. La instalación tan solo consiste en descomprimir el archivo zip y añadir al classpath los archivos jar del parser (crimson.jar) y del procesador XSLT (xalan.jar).
JAXP contiene clases y métodos que permiten no sólo la lectura de datos de un documento XML, sino también la modificación de sus elementos, atributos, aplicación de hojas de estilos XSLT,... Aquí se muestra las partes más importantes de un código que quisiera acceder a un documento XML almacenado en un archivo, usando JAXP. Al comienzo, deben importarse las clases necesarias: las clases de JAVAXP, las excepciones para el control de posibles errores (por ejemplo, que no se encuentre un determinado nodo)
Primero se declara la variable donde se almacenará el documento XML ( document ). Se declara estática para que pueda ser accedida desde cualquier método de la clase y, una vez cargado el XML, no se pierda su valor. Al ser estática, debe declararse fuera del método main(). Se instancia la clase DocumentBuilderFactory que nos devolverá un parser. Con el método newDocumentBuilder () obtenemos el parser (variable builder ). Después se le pasa un objeto File al método parse, con el archivo del xml, y devuelve el documento. Después pueden usarse los métodos tradicionales para el acceso al documento, considerando que el método document.getDocumentElement() devuelve el elemento raíz.
La ayuda para estos objetos se puede encontrar en el fichero comprimido que contiene las clases de JAXP. Para la clase Text, el método que más se usa es getNodeValue(), heredado de Node y que devuelve el valor del texto.
La expresión document.getDocumentElement().getChildNodes() obtendrá la siguiente lista: 0. Elemento Text 1. Elemento Nodo cliente 2. Elemento Text 3. Elemento Nodo cliente 4. Elemento Text Esto es debido a que es posible insertar texto entre dos elementos cualesquiera. Aunque estos textos estén vacíos, el método getChildNodes() los devuelve como hijos. Los índices comienzan por 0. Para obtener el valor de un Element, hay que obtener sus hijos de tipo Text.
Instalación de JDK. Comprobar la versión del JDK instalado con el comando: java –version Si es inferior a la 1.1.8, descargar una versión posterior e instalarla. Instalación de JAXP. Descomprimir el archivo zip en un directorio del disco duro (por ej. C:\\Jaxp) y añadir al classpath los archivos jar del parser (crimson.jar) y del procesador XSLT (xalan.jar). Instalación de un servidor Web Java. Cualquier servidor web puede servir. Un ejemplo es el iPlanet Web Server FastTrack Edition, servidor gratuito que puede ser descargado de la web de iplanet. Recordemos que iplanet es el nombre con el que se conoce a la unión de Netscape y Sun. Antes Sun mantenía su JavaWeb Server, pero tras esta unión se ha dejado de mejorar esta herramienta, que se ha quedado en la versión 2.
El objetivo de esta práctica es la creación de una clase java que acceda a un documento XML almacenado en un archivo y obtenga sus datos. Se debe instalar el JDK antes de realizarla. También deben instalarse las clases de JAXP. Ejercicio 1.1 Al ejecutar la clase debe mostrar el nombre del primer cliente. Ejercicio 1.2 Se deben insertar las líneas necesarias explicadas en las páginas anteriores en el sitio correspondiente para que el archivo xml sea leído con la línea document = builder.parse(xmlFile); Ejercicio 1.3 Para hacer este ejercicio se deberá mirar la API de las clases de JAXP, que está en el directorio docs/api dentro del directorio de instalación de la librería JAXP. Hay que tener cuidado con la función getChildNodes(), porque devuelve una lista de nodos de los hijos, además de insertar nodos de Texto entre ellos. Así, si tenemos los tags <clientes> <cliente></cliente> <cliente></cliente> <clientes>
Aquí se muestra un ejemplo que obtiene un documento XML de datos y una plantilla XSLT de dos archivos xml y xsl respectivamente. El programa mostrará por la salida (System.out) el resultado de aplicarle la plantilla XSLT al documento XML. Para aplicarle una plantilla XSLT a un documento XML, hay que añadirle estos includes a la clase Java. El Transformer es el procesador XSLT encargado de hacer esa transformación.
Aquí se explica el significado de cada línea de código: Al igual que en el ejemplo anterior, se declara el documento donde se guardarán los datos del XML. Se instancia el la clase DocumentBuilderFactory que es la que creará el parser. Se crean dos objetos de tipo File, stylesheet guardará el fichero xsl y datafile el fichero que contenga el documento xml. Se crea el parser (variable builder ) llamando al método newDocumentBuilder () del objeto factory . Se obtiene el documento del xml de datos con la función parse del objeto builder . Se instancia la clase TransformerFactory , que es la que creará el procesador XSLT (objeto Transformer ). Se crea el objeto stylesource , que guarda el origen de la plantilla XSLT. En este caso, el origen es el archivo que contiene el fichero xsl ( stylesheet ). Se crea el procesador XSLT (objeto transformer ) usando el objeto tFactory de tipo TransformerFactory . Se declara un objeto DOMSource , que especifica el origen del documento XML de datos. En este caso es el documento obtenido anteriormente ( document ). Se especifica a dónde se mandará el resultado de la transformación. En este caso es System.out. Si se quiere mandar a un fichero, habría que pasarle un objeto de tipo FileWriter al constructor del StreamResult . Por ejemplo: StreamResult result = new StreamResult( new FileWriter("salida.htm") ); Ejecutar la transformación llamando al método transform del transformer . El primer parámetro es el origen de los datos ( source ) y el segundo es la salida del resultado ( result ). Recordemos que el transformer ya está asociado a una hoja de estilos.
El objetivo de esta práctica es la aplicación de una plantilla XSL a un documento XML estando ambos almacenados en archivos. Ejercicio 2.1 El resultado será una página web que puede ser abierta en cualquier browser.
Para guardar un documento XML en un archivo o en otra salida se pueden usar los mismos objetos ya usados en el ejemplo anterior. Pero ahora, el transformer lo construiremos sin argumento (sin indicarle la hoja de estilos XSLT), de forma que no hará ninguna transformación. En el resultado se pasará un objeto FileWriter con el archivo de salida.
El objetivo de esta práctica es la modificación de un documento XML y posterior almacenamiento de las modificaciones. Ejercicio 3.1 Habrá que hacer uso de la api de JAXP para saber los métodos necesarios. Tras compilar la clase y ejecutarla, se abrirá el archivo clientes.xml en el notepad para comprobar que se ha insertado el dni en el segundo cliente.
Existen otros parsers creados por terceras partes, también de libre distribución, que pueden ser usados y están disponibles en Internet.
Para la realización de este ejercicio se deberá instalar algún servidor web que soporte jsp, como JavaWebServer o iPlanet Web Server.
MSXML es un objeto COM que incluye un parser XML y un procesador XSLT. Este objeto es usado por las aplicaciones Microsoft, su navegador IE, sus sistemas operativos y el servidor IIS (Internet Information Server). Está incluido en el Internet Explorer, aunque también se pueden descargar las últimas versiones desde la web de Microsoft ( http://msdn.microsoft.com/xml ). Microsoft permite que se puedan instalar nuevas versiones del objeto sin tener que pisar versiones anteriores. Por ejemplo, la librería msxml4.dll contiene la versión 4 del parser, pero no pisa la versión 3 contenida en msxml3.dll. Para seleccionar qué versión del objeto se desea utilizar se ha creado la aplicación xmlinst.exe. La versión que trae el Internet Explorer es la más antigua. Ésta se introdujo cuando la especificación XSL no era más que un borrador, por lo que no soporta algunas características avanzadas, como las funciones o las operaciones aritméticas. Para usar estas características se debe instalar la versión 3.0 o superior y ejecutar xmlinst.exe para que se use la nueva versión instalada.
Las funciones Load y LoadXML del objeto DOMDocument sirven, respectivamente, para cargar un documento XML desde un archivo XML o desde una cadena. Ambos devuelven true si el documento se ha cargado correctamente, y false si el documento no es válido.
Este ejemplo muestra como obtener un documento XML de un archivo y aplicarle una hoja de estilos XSL. Primero se declaran dos objetos DOMDocument , uno para el documento XML ( domXml ) y otro para el documento XSL ( domXsl ). La variable result será una cadena que guardará el resultado de la transformación. Después se crean los documentos domXml y domXsl . Luego se cargan los documentos desde sus respectivos archivos. Por último, se realiza la transformación llamando al método transformNode del documento y pasándole como parámetro la plantilla XSL. El resultado es una cadena que, en su caso, contendrá el código de la página HTML.
Para la realización de este ejercicio se deberá instalar un servidor web que soporte asp, como IIS o Personal Web Server.