EXPLICAR HERRAMIENTAS COMO JBUILDE, VISUAL STUDIO.NET,XMLEditPro para crear XML.

DTD XML Chema,etc.
Indice:

Hojas de EstiloCSS Formato conXLS LenguajeXPATH Manual DTDManual Lo Que Falta B.Datos_ASP_XML XMLyJavaScript

mi

XML

Nota: En este color poco Importante. XML junto con otras siglas hablan de otra manera de gestionar la información por medio de la informática. A los que ya somos viejos ,en esto, nos recuerda a un fichero de texto secuencial formateado. Pero va mucho mas allá. Esta tecnología además de guardar información nos permite:  Almacenar la información con un formato determinado  Verificar que el documento esta correctamente construido  Verificar que los datos contenidos en el fichero son correctos respecto a un esquema predefinido por medio de un DDT o Esquema XML.  Recorrer un documento para acceder a los datos del fichero de forma secuencial o aleatoria.  Transformación de los datos. Por ejemplo generar un documento HTML a partir de un documento XML.  Y mucho mas ............. Esquema de un fichero XML. Cabecera Todos los documentos XML deben comenzar con un encabezado, que en su forma más simple se presenta como: <?xml ?>
Ahora bien, este codigo no será aceptado por ningún procesador de XML, ya que se requiere siempre la identificación de la versión de XML a la cual pertenece el documento. Para ello, agregamos el atributo version. <?xml version="1.0" ?> Como vemos, un atributo se define escribiendo el nombre de la variable (en este caso 'version'), un signo igual = y el valor de la variable, entre comillas simples o dobles

El encabezado puede tener otros dos atributos, los cuales por lo general son omitidos. El primero es encoding, el cual determina el tipo de codificación del documento, importante para la interpretación de los caracteres según la lengua, lo cual es especialmente importante en lenguajes como el japonés. Los conjuntos más utilizados para el lenguaje español son el ISO-8859-1 y el UTF-8. El segundo atributo es standalone, el cual indica si se necesita un documento externo (DTD o XML Schema) para definir la estructura del documento; puede adoptar los valores yes o no . Tendrá valor “yes” cuando utilicemos una DTD intena y “no” cuando utilicemos una DRD conntenida en un fichero externo.
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>

Si bien el encabezado puede contener más objetos, para la comprensión cabal de éstos es necesario entender, primero, cual es la composición del cuerpo de un documento XML. Por tanto, la descripción de los elementos faltantes se realizará en secciones posteriores

1

Ejemplo de cabecera: <?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?> Cuerpo Dentro del detalle también se puede incluir un elemento de tipo DOCTYPE <!DOCTYPE libro SYSTEM "libro.dtd" > que se utiliza para asegurar que el documento XML este bien construido.

El cuerpo de un documento XML está formado por el contenido en sí del documento, el cual se divide en texto y marcado. El marcado, a su vez, se divide en elementos, atributos, comentarios, referencia a entidades e instrucciones de proceso. A continuación, presentamos un ejemplo típico de cuerpo XML Cuerpo XML
Ejemplo <libro> <titulo>Mi libro</libro> <prefacio /> <capitulos> <capitulo id="cap_1"> <titulo>Capitulo 1</titulo> </capitulo> <capitulo id="cap_2"> <titulo>Capitulo 2</titulo> </capitulo> </capitulos> </libro>

Elementos
Los elementos son los objetos esenciales de un documento XML. Los elementos pueden contener otros tipos de objetos, incluyendo a otros elementos. Como vemos en el ejemplo, los elementos se definen con dos etiquetas (tags), la primera señalando el inicio del elemento, con la nomenclatura <libro> y la segunda señalando el término, de la forma </libro> o <capitulos> y </capitulos> Un elemento válido también es <prefacio /> Si bien en HTML se puede omitir la etiqueta de cierre, en XML eso no es posible. Si se desea señalar que un elemento está vacío, se puede utilizar la forma abreviada <nombre />. Además, es importante mantener la correcta anidación de los elementos, o sea, que la etiqueta de cierre de un elemento no se encuentre después del cierre del elemento que lo contiene.

2

Por último, es necesario destacar que un documento XML debe poseer un elemento, el cual es denominado raíz, que contenga a todos los otros. En el ejemplo este elemento es <libro> ..... </libro>. Ejemplo 2.2. Uso correcto e incorrecto del elemento raíz Uso correcto
<?xml version="1.0" ?> <libro> <titulo>Este es el titulo</titulo> </libro>

Uso incorrecto
<?xml version="1.0" ?> <libro> <titulo>Este es el titulo</titulo> </libro> <libro> <titulo>Este es el titulo del segundo libro</titulo> </libro>

Atributos
Los elementos son la unidad básica del XML y es posible utilizar sólo este tipo de objetos para definir un documento, pero si tenemos una situación como la siguiente
<inventario> <item> <tipo>computador</tipo> <id>50</id> <marca>HP</marca> <modelo>5100</modelo> <descripcion>Descripcion HP 5100</descripcion> </item> <item> <tipo>computador</tipo> <id>60</id> <marca>HP</marca> <modelo>6100</modelo> <descripcion>Descripcion HP 6100</descripcion> </item> </inventario> Salida en IE:
<?xml version="1.0" ?> - <inventario> - <item> <tipo>computador</tipo> <id>50</id> <marca>HP</marca> <modelo>5100</modelo> <descripcion>Descripcion HP 5100</descripcion> </item> - <item> <tipo>computador</tipo> <id>60</id>

3

<marca>HP</marca> <modelo>6100</modelo> <descripcion>Descripcion HP 6100</descripcion> </item> </inventario>

es bastante obvio que los elementos tipo o id son carácteristicas del item, más que objetos o entes propiamente tales. Para este y otros casos, W3C definió los atributos, que son objetos que definen las propiedades de un elemento dado. El formato de un atributo es
nombre_atributo = "valor_atributo"

, permitiéndose el uso de comillas simples o dobles alrededor del valor del atributo. Nuestro código anterior quedaría, entonces, del siguiente modo:
<inventario> <item tipo="computador" id="50" marcar="HP" modelo="5100"> Descripcion HP 5100 </item> <item tipo="computador" id="60" marcar="HP" modelo="6100"> Descripcion HP 6100 </item> </inventario> Se visualizará con IE como:
<?xml version="1.0" ?> - <inventario> <item tipo="computador" id="50" marcar="HP" modelo="5100">Descripcion HP 5100</item> <item tipo="computador" id="60" marcar="HP" modelo="6100">Descripcion HP 6100</item> </inventario>

Comentarios
Muchas veces, especialmente si el código crece mucho, es necesario colocar algún tipo de aviso dentro del documento para recordar para que se servía un determinado elemento, o para documentar la falta de un datos, etc. Para esos casos, se pueden agregar comentarios dentro del código, los cuales no serán considerados por el procesador de XML. Este objeto tiene la estructura
<!-- Aquí va el comentario -->

Ejemplo 2.3. Uso de comentarios
<libro> <!-- Debo agregar el codigo ISDN, porque aun no lo encuentro --> <isdn></isdn> <!--- y también debo cambiar el nombre.... --> <nombre>Nombre Falso</nombre> </libro>

4

Texto y entidades
Cómo se habrá percatado por los ejemplos anteriores, dentro de los elementos se puede incluir o no texto. Es importante considerar que a diferencia de HTML, se considera relevante todo carácter de espacio que se utilice. Por ejemplo:
<item>Nombre</item>

es considerado distinto a <item> Nombre </item> y el procesador de XML debe tomar en cuenta ese hecho, para eliminar los espacios o los saltos de línea, si es necesario. Otro factor a considerar es que, dependiendo del procesador y de la codificación utilizada, existen ciertos carácteres que no pueden ser ingresados tal cual, como los signos <, & >. Para ello, existen dos alternativas: Referencia a Entidades Las referencias a entidades son objetos que representan a otros. Poseen la estructura:
&nombre_entidad;

Por ejemplo, el signo < es representado por la entidad &lt;. Existen 5 entidades predefinidas en XML, existiendo la posibilidad por parte del usuario de crear las que considere necesarias. Entidad Reemplaza a Nombre &lt; < Menos que &gt; > Mayor que Herramientas como &amp; & Ampersand Studio Net, &apos; ' Comilla simple Visual XMLEditPro v2.0 y otras &quot; " Comilla doble nos van a ser de gran ayuda a la hora de crear los archivos xml, aunque lo mas normal es que los generemos de forma dinámica mediante aplicaciones construidas en Java o .NET ,pero eso vendrá mas tarde. Veamos un par de ejemplos de código xml validado a partir de DTD utilizando un programa escrito en VBSCRIPT. Dos formas de hacer lo mismo: Programa que valida los datos programado con VBScript
WScript.Echo "Hola" Set DocXML = WScript.CreateObject("Microsoft.XMLDOM") DocXML.validateOnParse=true if Not DocXML.Load("libro.xml") then Msgbox "Hay erores" & DocXML.url else Msgbox "El documento" & DocXML.url & " es correcto"

5

end if Grabar el código en un fichero con la extensión .vbs y hacer doble clic sobre el fichero. BUSCAR UNA HERRAMIENTA PARECIDA PARA xsd (XML SHEMA)

con DTD externa
<?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?> <!DOCTYPE libro SYSTEM "libro.dtd" > <libro> <titulo>Mi libro</titulo> <prefacio/> <capitulos> <capitulo id="cap_1"> <titulo>Capitulo 1</titulo> </capitulo> <capitulo id="cap_2"> <titulo>Capitulo 2</titulo> </capitulo> </capitulos> </libro> DTD grabada en un fichero libro.DTD <?xml version="1.0" encoding="iso-8859-1" ?> <!ELEMENT capitulo ( titulo ) > <!ATTLIST capitulo id NMTOKEN #REQUIRED > <!ELEMENT titulo ( #PCDATA ) > <!ELEMENT libro ( titulo, prefacio, capitulos ) > <!ELEMENT prefacio EMPTY > <!ELEMENT capitulos ( capitulo+ ) >

con DTD interna
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> <!DOCTYPE libro [ <!ELEMENT capitulo ( titulo ) > <!ATTLIST capitulo id NMTOKEN #REQUIRED > <!ELEMENT titulo ( #PCDATA ) > <!ELEMENT libro ( titulo, prefacio, capitulos ) > <!ELEMENT prefacio EMPTY > <!ELEMENT capitulos ( capitulo+ ) > ]> <libro> <titulo>Mi libro</titulo> <prefacio/> <capitulos> <capitulo id="cap_1"> <titulo>Capitulo 1</titulo> </capitulo> <capitulo id="cap_2"> <titulo>Capitulo 2</titulo> </capitulo> </capitulos> </libro> Como vemos construir un documento XML es fácil. Para ver que su estructura esta correctamente formad bastará con visualizarlo con Internet Explorer que generará un error en caso de no ser así. Peri para validar los datos tendremos que generar ficheros de validación. Podemos utilizar dos técnicas DTD o XSD(XML Shema). Para cualquiera de estas contamos con herramientas como Jbulder X(genera DTD a partir de XML), Eclipse y NetBeans 4.1 generan tanto DTD como XSD. Y como

6

herramienta de Microsoft generar DTD y XSD.

Visual

Studio

.net

también

nos

permite

Por lo tanto crearemos un fichero XML básico y con una de estas herramientas generaremos el fichero DTD o XSD. Ejemplo de un fiero XMl y XSD

Fichero net.xml
<?xml version="1.0" encoding="UTF-8"?> <biblioteca xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='file:/D:/curso2005_2006/trabajoConXML/n et.xsd'> <estanteria n="1"> <libro> <titulo>t1</titulo> <autor>a1</autor> </libro> <libro> <titulo>t2</titulo> <autor>a2</autor> <autor1>a2</autor1> <autor1>a2</autor1> </libro> </estanteria> <estanteria n="2"> <libro> <titulo>t21</titulo> <autor>a21</autor> </libro> <libro> <titulo>t22</titulo> <autor>a22</autor> </libro> </estanteria> </biblioteca>

Fichero net.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > <xs:element name="biblioteca"> <xs:complexType> <xs:sequence> <xs:element name="estanteria" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="libro" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="titulo" type="xs:string" minOccurs="0" /> <xs:element name="autor" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="n" form="unqualified" type="xs:string" /> </xs:complexType> </xs:element> </xs:sequence> 7

</xs:complexType> </xs:element> </xs:schema> Resumiendo: El fichero XML contiene los datos. DTD y XSD son ficheros que contienen un diccionario de datos a partir de los cuales podremos validar la información contenida en un fichero XML. Saltar a manual DTD Manual

Como dar formato a documentos XML
La información contenida en un documento/fichero xml es bastante fácil de entender para cualquier persona y utilizando DOM, Xpath y otras tecnologías también es de fácil acceso utilizando la informática. La pega esta a la hora de presentar los datos, en pantalla o un informe impreso, ya que habrá que separarlos de la etiquetas que los definen. Para ello tendremos que transformarlos en otro formato como pudieran ser HTML y PDF. Para obtener HTML podemos utilizar o bien hojas de estilo o XSL.

Comencemos por las Hojas de Estilo . Se supone que ya las hemos estudiado por lo que nos basaremos en un ejemplo de cómo utilizarlas con XML. Fichero xml que utiliza css:
<?xml version="1.0" encoding="UTF-8" ?>

<! -- A este fichero le vamos a crear un formato de salida mediante la hoja de estilos contenida en el fichero estilo.css. Lo que indicamos con la siguiente intrucción -- > <?xml-stylesheet type="text/css" href="estilo.css" ?>

<actividades> <cuaderno> <fecha>2005103</fecha> <evaluacion>1</evaluacion> <tema>Configuración del Aula de trabajo</tema> <descripcion>Actividades de Tutoría.:FCTNormas básicas de comportamientoActividades de Evaluación para la asignatura.</descripcion> </cuaderno> <cuaderno> <fecha>2005104</fecha> <evaluacion>1</evaluacion> <tema>Configuración del Aula de trabajo</tema> <descripcion>Creación de particiones en los ordenadores e instalación de los distintos sistema operativos necesarios para el desarrollo de los dos módulos que se van a impartir en el aula.Instalación de utilidades. Paquete ofimático</descripcion> </cuaderno> <cuaderno> <fecha>2005105</fecha> <evaluacion>1</evaluacion> <tema>Configuración del Aula de trabajo</tema> <descripcion>Seguimos con la instalación.</descripcion> </cuaderno> <cuaderno> <fecha>2005106</fecha> <evaluacion>1</evaluacion>

8

<tema>Java</tema> <descripcion>Descarga por Internet del entorno de desarrollo JAVA e instalación del mismo en los ordenadores. También se instalan algunos programas para el desarrollo de programas JAVA como PCGRASP y BLUEJExplicación de los conceptos básicos de Java.ClasesHerenciaComposiciónPolimorfismoCampos MiembroTipos PrimitivosConstructoresProcedimientos y funcionesPasos de parámetrosProcedimientos staticFunción main()</descripcion> </cuaderno> <cuaderno> <fecha>2005107</fecha> <evaluacion>1</evaluacion> <tema>Java</tema> <descripcion>Se realizan ejemplos por parte del profesor sobre cada uno de los apartados tratados en la exposición teórica ejecutándoles en el ordenador.Se les propone a los alumnos trabajos para realizar en casa durante el fin de semana.</descripcion> </cuaderno> <cuaderno> <fecha>2005108</fecha> <evaluacion>1</evaluacion> <tema>Java</tema> <descripcion>Sabado</descripcion> </cuaderno> </actividades>

Fichero estilo.css. <?xml-stylesheet href="#style" type="text/css" ?> <actividades> <cuaderno id="style"> nada {} fecha{FONT-FAMILY: Georgia ;FONT-SIZE: 16 Pt ; display: block} evaluacion{ display: block; color: blue} tema{ FONT-FAMILY: Arial Black ;color:green ;display: block} descripcion { FONT-FAMILY: Arial Narrow ;FONT-SIZE: 10 Pt ;display: block} </cuaderno> </actividades> El resultado obtenido al visualizarlo con Internet Explorer es:

9

Vemos como afortunadamente un conocimiento que ya poseíamos nos va a servir para dar formato a documentos HTML y XML. Veamos ahora XSL.

Formato con XSL.
Css no permite ejecutar operaciones lógicas como if, bucles , etc que nos permitan seleccionar que parte de los datos queremos imprimir o visualizar. XSL consiste el la obtención de un documento HTML, XHTML, texto plano ,otro documento XML , etc mediante la utilización del lenguaje XSLT. La utilización de XSL también es conocida como hoja de estilo , ya que en cierto modo tiene la misma funcionalidad que CSS. Veamos como trabaja este lenguaje. Lo primero para poder acceder a un determinado dato se ha de crear una plantilla (template)que lo identifique. Ejemplo: Fichero xml <titulo> Aprendiendo XML </titutulo> <titulo> Aprendiendo XSL </titutulo> <titulo> Aprendiendo CSS </titutulo> Fichero xsl <xsl:template match=“titulo”> <h2> <xsl:value-of/> </h2> </xsl:template> Cuando por medio del navegador visualicemos el fichero xml utilizando el firchero xsl obtendremos el siguiente código html: <h2> Aprendiendo XML </h2> <h2> Aprendiendo XSL </h2> <h2> Aprendiendo CSS </h2> Utilizamos <xsl:template match=“titulo”> para obtener y dar formatos a todos los datos identificados por la plantilla que hemos creado a partir de la etiqueta <titulo>. <xsl:value-of/> obtiene los datos de las etiquetas xml y las genera dentro del documento HTML en la posición indicada dentro de la plantillas. Como vemos combinamos código del lenguaje XSLT y código HTML (aunque podría ser otro, como el necesario para generar PDFs). Veamos ahora como indicar en un fichero XML que vamos a utilizar un fichero XSL para generar la presentación de sus datos. Ejemplo:
<?xml version="1.0" encoding="UTF-8" ?>

<?xml-stylesheet type="text/xsl" href="cuadernoxx.xsl"?>
<actividades> <cuaderno> <fecha>2005103</fecha> <evaluacion>1</evaluacion> <tema>Configuración del Aula de trabajo</tema> <descripcion>Actividades de Tutoría.:FCTNormas básicas de</descripcion> </cuaderno> <cuaderno> <fecha>2005104</fecha> <evaluacion>1</evaluacion> <tema>Configuración del Aula de trabajo</tema>

10

<descripcion>Creación de particiones en los ordenadores </descripcion> </cuaderno> <cuaderno> <fecha>2005105</fecha> <evaluacion>1</evaluacion> <tema>Configuración del Aula de trabajo</tema> <descripcion>Seguimos con la instalación.</descripcion> </cuaderno> <cuaderno> <fecha>2005106</fecha> <evaluacion>1</evaluacion> <tema>Java</tema> <descripcion>Descarga por Internet del entorno de desarrollo</descripcion> </cuaderno> <cuaderno> <fecha>2005107</fecha> <evaluacion>1</evaluacion> <tema>Java</tema> <descripcion>Se realizan ejemplos por parte del profesor </descripcion> </cuaderno> <cuaderno> <fecha>2005108</fecha> <evaluacion>1</evaluacion> <tema>Java</tema> <descripcion>Sabado</descripcion> </cuaderno> </actividades>

Veamos ahora el fichero XSL utilizado:
<?xml version="1.0" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <body background="file:///D:\vstudio\WindowsApplication3\fondo.jpg"> <h1 align="center">Cuaderno de Actividades</h1> <h2 align="center" style="background-color:orange">Diseño y Realización de Servicios de Presentación en Entornos Gráficos</h2> <table border="1>" width="100%"><tr> <td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: Georgia" bgColor="#00cc00" width="100">Fecha</td> <td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: Georgia" bgColor="#00cc00">Eval.</td> <td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: Georgia" bgColor="#00cc00">Tema</td> <td width="60%" align="center" style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: Georgia" bgColor="#00cc00">Actividad</td></tr> <xsl:apply-templates select="actividades" /> </table> </body> </xsl:template> <xsl:template match="actividades"> <xsl:for-each select="cuaderno"> <tr> <td><xsl:value-of select='fecha' /></td> <td><xsl:value-of select='evaluacion' /></td> <td><xsl:value-of select='tema' /></td> <td><xsl:value-of select='descripcion' /></td> </tr> </xsl:for-each> </xsl:template>

11

</xsl:stylesheet>

El documento XML se visualiza como:

Saquemos del código las instrucciones XSLT
<?xml version="1.0" ?>

Un fichero XSL también es un fichero XML que ha de estar bien formado. Lo indicamos con esta instrucción.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

Define que es un fichero de tipo Hoja de Estilo XSL
<xsl:template match="/">

Crear una plantilla que identifica el comienzo del documento que se va a generar. Esta plantilla se ejecuta de forma automática . En ella podemos incluir código HTML o de otro tipo y también nos sirve para ejecutar otra plantilla.
Aqui añadimos el codigo HTML para la cabecera del documento (body , …) <xsl:apply-templates select="actividades" /> Más código html </xsl:template>

Ejecuta la plantilla actividades Final de una plantilla.

<xsl:template match="actividades"> <xsl:for-each select="cuaderno">

Crea la plantilla correspondiente a la etiqueta actividades del fichero xml. Bucle que recorrerá todas las etiquetas identificadas como cuaderno.

<tr> <td><xsl:value-of select='fecha' /></td>

Obtiene el dato fecha de la etiqueta fecha que esta contenida en la etiqueta cuaderno y lo inserta dentro de una celda del codigo HTML <table>.
<td><xsl:value-of select='evaluacion' /></td> <td><xsl:value-of select='tema' /></td> <td><xsl:value-of select='descripcion' /></td> </tr> </xsl:for-each>

12

</xsl:template>

Final del bucle <xsl:for-each select="cuaderno"> Final de la plantilla inicial del documento. <xsl:template match="/"> Final del documento XSL.

</xsl:stylesheet>

También se pueden combinar hojas de estilo CSS y XSLT . Veamos un ejemplo: Fichero XML
<?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="cuaderno_css.xsl"?> <actividades> <cuaderno> <fecha>2005103</fecha> <evaluacion>1</evaluacion> <tema>Configuración del Aula de trabajo</tema> <descripcion>Actividades de Tutoría.:FCTNormas básicas de comportamientoActividades de Evaluación para la asignatura.</descripcion> </cuaderno> <cuaderno> <fecha>2005104</fecha> <evaluacion>1</evaluacion> <tema>Configuración del Aula de trabajo</tema> <descripcion>Creación de particiones en los ordenadores e instalación de los distintos sistema operativos necesarios para el desarrollo de los dos módulos que se van a impartir en el aula.Instalación de utilidades. Paquete ofimático</descripcion> </cuaderno> </actividades> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <style> .f{FONT-FAMILY: Georgia ;FONT-SIZE: 16 Pt ; display: block} .e{ display: block; color: blue} .t{ FONT-FAMILY: Arial Black ;color:green ;display: block} .d{ FONT-FAMILY: Arial Narrow ;FONT-SIZE: 10 Pt ;display: block} </style> <body background="file:///D:\vstudio\WindowsApplication3\fondo.jpg"> <h1 align="center">Cuaderno de Actividades</h1> <h2 align="center" style="background-color:orange">Diseño y Realización de Servicios de Presentación en Entornos Gráficos</h2> <table border="1>" width="100%"> <tr> <td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: Georgia" bgColor="#00cc00" width="100">Fecha</td> <td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: Georgia" bgColor="#00cc00">Eval.</td> <td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: Georgia" bgColor="#00cc00">Tema</td> <td width="60%" align="center" style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: Georgia" bgColor="#00cc00">Actividad</td> </tr> <xsl:apply-templates select="actividades" /> </table> </body> </xsl:template>

Fichero XSL

13

<xsl:template match="actividades"> <xsl:for-each select="cuaderno"> <!-- order-by="fecha"> --> <tr> <td style="FONT-WEIGHT: bold"><xsl:value-of select='fecha' /></td> <td><p class="e"/><xsl:value-of select='evaluacion' /></td> <td class='t'><xsl:value-of select='tema' /></td> <td class="d"><xsl:value-of select='descripcion' /></td> </tr> </xsl:for-each> </xsl:template> </xsl:stylesheet>

El documento XML se visualiza como

: Vamos a realizar un estudio más detallado de XSLT. Creación de plantillas: Para crear una plantilla <xsl:template match=”elemento/elemetos”> La plantilla identifica a una parte del documento sobre la que se va actuar. Para indicar esa parte se utiliza otro lenguaje conocido como XPATH que ya conoceremos. Su forma mas simple será el nombre de un elemento como <xsl:template match="actividades">. La instrucción indica la <xsl:template match="/"> raíz (inicio) del documento. La platilla raíz se ejecuta de forma automática y desde esta podremos ejecutar el resto de las plantillas que creemos por medio de la instrucción <xsl:apply-templates select="actividades" /> . Indicamos la plantilla o elementos(indicados mediante XPATH) sobre los que va actuará. Para obtener un dato de un elemento utilizamos la instrucción :  Obtiene el dato contenido en el elemento indicado . En este caso obtiene todos los datos contenidos en el elemento Descripción. <p><xsl:value-of select='/Apuntes/Tema/Descripcion' /></p> 0  Obtiene el dato contenido en el elemento en el que en ese momento estemos posicionados. Por ejemplo al ejecutar un bucle. <p><xsl:value-of select='.'/></p> Bucles: Para crear un bucle utilizaremos la siguiente instrucción. El ejemplo recorre todos los elementos que formen parte de la estructura del árbol indicado /Apuntes/Tema <xsl:for-each select="/Apuntes/Tema" > <p><xsl:value-of select='.' /></p> </xsl:for-each>

14

Bucle que ordenada: xml

<?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="ordenar.xsl"?> <Agenda> <Persona Nombre="Pepe" Apellidos="Lopez"> <Direccion>C/La Huerta s/n</Direccion> <Telefono>1234567</Telefono> <Cp>09400</Cp> </Persona> <Persona Nombre="Alvaro" Apellidos="Anton"> <Direccion>C/Las Amapolas, 19</Direccion> <Telefono>43545</Telefono> <Cp>09500</Cp> </Persona> <Persona Nombre="Luis" Apellidos="Suarez"> <Direccion>Avda. Principal 10 , 2. S</Direccion> <Telefono>345345</Telefono> <Cp>09200</Cp> </Persona> <Persona Nombre="Antonio" Apellidos="Gomez"> <Direccion>Pza. Mediterraneo ,14 3. I</Direccion> <Telefono>1234567</Telefono> <Cp>09400</Cp> </Persona> </Agenda>

xsl.

<?xml version="1.0" ?> <xsl:stylesheet version ="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- Nos situamos en el Nodo Raiz --> <xsl:template match="/"> <body> <h1 align="Center"> Agenda </h1> <xsl:apply-templates select="Agenda" /> </body> </xsl:template> <xsl:template match="Agenda"> <xsl:for-each select ="Persona"> <xsl:sort select ="@Nombre" order ="ascending"/> <p><xsl:value-of select='@Nombre' /></p> <p><xsl:value-of select='Direccion' /></p> <p><xsl:value-of select='Telefono' /></p> </xsl:for-each> </xsl:template> </xsl:stylesheet>

Condiciones Con if <xsl:if test='Cp="09400"'> <h1><xsl:value-of select='@Apellidos' /></h1></xsl:if> Con chose <xsl:choose> <xsl:when test ='Cp="09400"' > <p><xsl:value-of select='@Nombre' /> <b><xsl:value-of select='@Apellidos' /></b></p> </xsl:when> <xsl:otherwise > <p><b><xsl:value-of select='@Apellidos' /> </b> <xsl:value-of select='@Nombre' /></p>

15

</xsl:otherwise> </xsl:choose> XPATH

Es un lenguaje que nos va a permitir localizar los componentes específicos de un documento XML a partir de la creación de una estructura en árbol. Una vez obtenida dicha estructura se podría realizar funciones a modo de bases de datos documentales ya que nos permitirá realizar operaciones de búsqueda, obtener los fragmentos de información que deseemos y finalmente obtener el formato de presentación deseado transformando el documento XML en un documento de otro tipo (HTML,..). Para acceder a un elemento tendremos que indicar la trayectoria de búsqueda . La trayectoria puede ser absoluta y comienza en el nodo raíz / o relativa que carece de este nodo raíz. Ejemplo partiendo del siguiente documento XML: <?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="apuntes.xsl"?> <Apuntes> <Tema> <Descripcion> XML es una tecno....</Descripcion> <Ejemplos> Apuntes XML.. </Ejemplos> <Ejercicios> Crea ... <E1> Utilizando XML </E1> <E2> Para .. </E2> </Ejercicios> </Tema> <Tema>XPATH <Descripcion> XPATH es una tecno....</Descripcion> <Ejemplos> Apuntes XPATH.. </Ejemplos> <Ejercicios> Crea ... <E1> A partir de XPATH.. </E1> <E2> Para .. </E2> </Ejercicios> </Tema> </Apuntes> Absoluta para el elemento E2 /Apuntes/Tema/Ejercicios/E2 Relativa para E1 suponiendo que estamos en el elemento Tema Ejercicios/E1 Cuando seleccionamos el elemento E1 no seleccionamos uno de ellos sino todos los que estén contenidos en el documento XML <E1> Utilizando XML </E1> <E1> A partir de XPATH.. </E1> Para recorrer todos ellos utilizamos <xsl:for-each select=" /Apuntes/Tema/Ejercicios"> <tr> <td><xsl:value-of select='E2' /></td> 16

</tr> </xsl:for-each> También lo podemos hacer utilizando templates de la siguiente forma: <?xml version="1.0" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:apply-templates select="Apuntes" /> </xsl:template> <xsl:template match="Apuntes"> <xsl:for-each select="//E1 "> <p><xsl:value-of select='.' /></p> </xsl:for-each> </xsl:template> </xsl:stylesheet> Si queremos los elementos E1 y E2utilizamos la orden: <xsl:for-each select="//E1 | //E2"> Si queremos elementos Descripción, E1 y E2utilizamos la orden: <xsl:for-each select=" //Descripcion | //E1 | //E2 "> Por medio de la barra vamos bajando por el árbol y accediendo a los distintos elementos o construyendo los distintos templates . Pero también podemos acceder a un determinado grupo de elementos sin necesidad de especificar todo el camino de búsqueda utilizando las 2 barras //. Ejemplo: <xsl:template match="/"> <xsl:for-each select="//E1 | //E2" > <p><xsl:value-of select='.' /></p> </xsl:for-each> </xsl:template> Nos situamos en la raíz por medio de un template y recorremos todos los ejemplos E1 y E2 sin indicar el camino completo de la estructura.

Ejemplo con muchas opciones
<?xml version="1.0" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<!-- Nos situamos en el Nodo Raiz --> <xsl:template match="/"> <body> <p>_____________________</p> <!-- Obtenemos toda la Informacion del arbol(Todo el Documento) --> <p><xsl:value-of select='.' /></p> <p>_____________________</p> <!-- Obtenemos toda la Informacion del arbol/Apuntes(Todo el Documento) --> <p><xsl:value-of select='/Apuntes/.' /></p>

17

<p>_____________________</p> <!-- Obtenemos toda la Informacion del primer tema --> <p><xsl:value-of select='/Apuntes/Tema' /></p> <p>_____________________</p> <!-- Obtenemos toda la Informacion de todos los temas --> <xsl:for-each select="/Apuntes/Tema" > <p><xsl:value-of select='.' /></p> </xsl:for-each> <p>_____________________</p> <!-- Obtenemos la descripcion del primer tema --> <p><xsl:value-of select='/Apuntes/Tema/Descripcion' /></p> <p>_____________________</p> <!-- Obtenemos todos los elementos del tema cuya Descripcion cumple una condicion --> <p><xsl:value-of select='/Apuntes/Tema[Descripcion="XPATH es una tecno...."]' /></p> <p>_____________________</p> <!-- Obtenemos los elementos Descripcion y Ejemplos del tema cuya Descripcion cumple una condicion --> <p><xsl:value-of select='/Apuntes/Tema[Descripcion="XPATH es una tecno...."]/Descripcion' /></p> <p><xsl:value-of select='/Apuntes/Tema[Descripcion="XPATH es una tecno...."]/Ejemplos' /></p> <p>_____________________</p> <!-- Por medio de volvemos al raiz del elemento en el que estamos En este ejemplo volvemos a la raiz y seleccionamos el otro Tema por la descripcion y visualizamos todos sus elementos. En la siguiente intruccion visualizamos los Ejetcicios --> <p><xsl:value-of select='/Apuntes/Tema[Descripcion="XML es una tecno...."]/../Tema' /></p> <p><xsl:value-of select='/Apuntes/Tema[Descripcion="XML es una tecno...."]/../Tema/Ejercicios' /></p> <p>_____________________</p> <!-- Visualizamos los ejercicos de forma individual--> <xsl:for-each select='/Apuntes/Tema[Descripcion="XML es una tecno...."]/Ejercicios/*' > <p><xsl:value-of select='.' /></p> </xsl:for-each> <p>_____________________</p> <!-- Obtener todos los elementos de un nodo (En este caso Ejercicios) esten donde esten dentro del arbol --> <xsl:for-each select='//Ejercicios' > <p><xsl:value-of select='.'/></p> </xsl:for-each> <xsl:for-each select='//E1 |//E2' > <p><xsl:value-of select='.'/></p> </xsl:for-each> 18

<p>_____________________</p> <!-- Obtener todos los atributos esten donde esten dentro del arbol --> <xsl:for-each select='/Apuntes//@*' > <p><xsl:value-of select='.'/></p> </xsl:for-each> <p>_____________________</p> <!-- Obtener los elementos principales situados debajo del elemento Tema.La siguiente instruccion obtiene la siguiente informacion:
XML es una tecno.... Apuntes XML.. Crea ... Utilizando XML Para XML.. XPATH es una tecno.... Apuntes XPATH..

-->

Crea ... A partir de XPATH.. Para XPATH..

<xsl:for-each select='/Apuntes/Tema/*' > <p><xsl:value-of select='.'/></p> </xsl:for-each> <p>_____________________</p> <!-- Y la siguiente nos devuelve: --> <xsl:for-each select='/Apuntes/*' > <p><xsl:value-of select='.'/></p> </xsl:for-each> <p>_____________________</p> <!-- El siguiente codigo no obtiene elementos obtiene solamente el texto de los elementos. De esta forma a partir del arbol:
<Ejercicios> Realiza los Siguientes Ejercicios de XML <E1> Utilizando XML </E1> <E2> Para XML.. </E2> </Ejercicios> XML es una tecno.... Apuntes XML.. Crea ... Utilizando XML Para XML.. XPATH es una tecno.... Apuntes XPATH.. Crea ... A partir de XPATH.. Para XPATH..

Obtiene el texo (en este caso sera:Realiza los Siguientes Ejercicios de XML) y no los elementos (nodos).La ejecucion nos devuelve :
Realiza los Siguientes Ejercicios de XML Realiza los Siguientes Ejercicios de XPATH

_____________________ --> <xsl:for-each select='//Ejercicios/text()' > <p><xsl:value-of select='.'/></p> </xsl:for-each> <p>_____________________</p> <!-****************************************************************************** PREDICADOS (Busqueda , Seleccion de elementos con Condiciones )

19

______________________________________________________________________________ Ejemplos Sencillos: --> <p><xsl:value-of select='/Apuntes/Tema[0]'/></p> <p><xsl:value-of select='/Apuntes/Tema[0]/Ejercicios'/></p> <p><xsl:value-of select='/Apuntes/Tema[0]/Ejercicios/E1'/></p> <p>_____________________</p> <!-- Selecionar el ultimo elemeto . En este caso el ultimo Tema Para que funcione hay que definir la siguiente version y tipo de documento en la cabecera <xsl:stylesheet version ="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> --> <p><xsl:value-of select='/Apuntes/Tema[last()]/Descripcion'/></p> El anterior al ultimo. <p><xsl:value-of select='/Apuntes/Tema[last()-1]/Descripcion'/></p> <p>_____________________</p> <!-- Muestra elemeto el elemento indicado en posicion. En este caso el 1 Tema/Descripción Para que funcione hay que definir la siguiente version y tipo de documento <xsl:stylesheet version ="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> --> <p><xsl:value-of select='/Apuntes/Tema[position()=1]/Descripcion'/></p> <p>_____________________</p> <!--<p><xsl:value-of select='id("Para XPATH..")'/></p> --> NO FUNCIONA ESTA OPCION id() Funciona pero hay que trabajarlo mas <p>_____________________</p> </body> </xsl:template> </xsl:stylesheet> <!-Documento xml empleado en los ejemplos anteriores ***************************************************

<?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="apuntes.xsl"?> <Apuntes> <Tema Titilo="XML"> <Descripcion> XML es una tecno....</Descripcion> <Ejemplos> Apuntes XML.. </Ejemplos> <Ejercicios> Realiza los Siguientes Ejercicios de XML <E1> Utilizando XML </E1> <E2> Para XML.. </E2> </Ejercicios> </Tema> <Tema Titilo="XPATH"> <Descripcion> XPATH es una tecno....</Descripcion> <Ejemplos> Apuntes XPATH.. </Ejemplos> <Ejercicios> Realiza los Siguientes Ejercicios de XPATH <E1> A partir de XPATH.. </E1> <E2> Para XPATH.. </E2> </Ejercicios> </Tema> </Apuntes>

20

--> Veámoslo con ejemplos: Fichero xml empleado:

Trabajo con Variables en XPATH

<?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="ordenar.xsl"?> <Agenda> <Persona Nombre="Pepe" Apellidos="Lopez" Edad="34"> <Direccion>C/La Huerta s/n</Direccion> <Telefono>1234567</Telefono> <Cp>09400</Cp> </Persona> <Persona Nombre="Alvaro" Apellidos="Anton" Edad="18"> <Direccion>C/Las Amapolas, 19</Direccion> <Telefono>43545</Telefono> <Cp>09500</Cp> </Persona> <Persona Nombre="Luis" Apellidos="Suarez" Edad="48"> <Direccion>Avda. Principal 10 , 2. S</Direccion> <Telefono>345345</Telefono> <Cp>09200</Cp> </Persona> <Persona Nombre="Antonio" Apellidos="Gomez" Edad="44"> <Direccion>Pza. Mediterraneo ,14 3. I</Direccion> <Telefono>1234567</Telefono> <Cp>09400</Cp> </Persona> </Agenda>

Fichero xsl empleado:

<?xml version="1.0" ?> <!-- <xsl:stylesheet version ="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">--> <xsl:stylesheet version ="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- Nos situamos en el Nodo Raiz --> <xsl:template match="/"> <body> <h1 align="Center"> Agenda </h1> <xsl:apply-templates select="Agenda" /> </body> </xsl:template> <xsl:template match="Agenda"> <xsl:for-each select ="Persona"> <xsl:sort select ="@Nombre" order ="ascending"/> <p><xsl:value-of select='@Nombre' /></p> <p><xsl:value-of select='Direccion' /></p> <p><xsl:value-of select='Telefono' /></p> <xsl:if test='Cp="09400"'> <h1><xsl:value-of select='@Apellidos' /></h1></xsl:if> <xsl:choose> <xsl:when test ='Cp="09400"' > <p><xsl:value-of select='@Nombre' /> <b><xsl:value-of select='@Apellidos' /></b></p> </xsl:when> <xsl:otherwise > <p><b><xsl:value-of select='@Apellidos' /> </b> <xsl:value-of select='@Nombre' /></p> </xsl:otherwise> </xsl:choose> </xsl:for-each>

21

<!-- ************************ Trabajo CON VARIABLES _________________________ --> Define una variable y le asigna un dato

<xsl:variable name="EdadMedia" select ='sum(/Agenda/Persona/@Edad)' />
Visualiza una variable

<p><b>Suma Edades : </b><xsl:value-of select ='$EdadMedia' /></p>
Define una variable y le asigna un dato

<xsl:variable name="NumeroPersonas" select ='count(//Persona/@Edad)' />
Visualiza una variable <p><b>N.Personas : </b><xsl:value-of select ='$NumeroPersonas' /></p> Operar con variables:

<p><b>Edade Media : </b><xsl:value-of select ='number($EdadMedia) div number($NumeroPersonas)' /></p>
</xsl:template> </xsl:stylesheet>

Relación de Funciones disponibles en XPATH  Nodo o last() o position() o count(nodo elemento) o id(objeto) o name(nodo elemento)  Cadena o string(objeto ) Devuelve una cadena o concat(string, string,string) Concatena una o mas cadenas o strats-with(string, string) Devuelve true si el primer string empieza con el segundo. o contains(string, string) Devuelve true si la segunda cadena esta contenida en la primera o substring-before(string, string) devuelve otra string con la parte de la primera cadena que aparece delante de lo que contiene la segunda o substring-before(string, string) devuelve otra string con la parte de la primera cadena que aparece al final de lo que contiene la segunda o substring(string,number n ,number n1) devuelve otra string con la parte de la primera cadena que comienza en n el nº de caracteres indicados en n1. o String-length(string) devuelve el nº de caracteres de la cadena o Normalize-espace(string) devuelve un string sin espacios al comienzo y al final de la misma.  Booleanas o bolean(objeto) devuelve false si es 0 y true en caso contrario o not(bolean) devuelve lo contrario del valor utilizado en la función. o true() devuelve trae o false() devuelve false  Numéricas o number(objeto) convierte en un número

22

o sum(nodo) suma el valor de las cadenas numéricas contenidas en los nodos del árbol seleccionados . o floor(number) devuelve el número entero más grande que no es mayor que el argumento. Ejemplo 3.14 devuelve 3. o ceiling(number) devuelve el número entero más pequeño que no es menor que el argumento. 3.14 devuelve 4. o round(number) Devuelve el número entero mas cercano al argumento. 3.14 devuelve 3. 3.52 devuelve 4. Relación de Operadores disponibles en XPATH -,+,*,div,mod,and,or,|,<,<=,>,>=,=,!=,$(referencia de variable) Generar PDF

23

MANUAL DTD(http://php.apsique.com/xml/introduccion)
Documentos XML válidos: uso de DTD

Si escribimos un documento XML con las reglas expuestas en las dos secciones anteriores sin cometer errores, estaremos en presencia de un documento bien formado. Ahora bien, generalmente esto no basta para crear una aplicación, ya que debemos limitar en mayor o menor medida el tipo de datos a ingresar. Por ejemplo, si tenemos una aplicación de guía teléfonica, un marcado como el siguiente sería, por decir lo menos, inútil
<?xml version="1.0" ?> <directorio> <persona> <nombre>Juan</nombre> <apellido_paterno>Perez</apellido_paterno> <apellido_paterno>Salgado</apellido_paterno> <apellido_paterno>Muñoz</apellido_paterno> <color_pelo>Negro</color_pelo> <persona><nombre>Segunda personalidad</nombre></persona> </persona> </directorio>

Como se puede observar, si bien el documento está bien formado, ya que el marcado está escrito correctamente, cuenta sólo con un elemento raíz y contiene carácteres presentes en la codificación pre-establecida, presenta evidentes errores lógicos. Es evidente que no existen personas con más dos apellidos y que una persona no puede estar contenida dentro de otra ni es una característica de ella. Debe existir alguna forma de especificar restricciones sintácticas al marcado para definir su estructura, o sea, que objetos se aceptarán en el documento, en que cantidad y en que orden. El documento que se encarga de realizar esta especificación se llama Documento de Definición de Tipo (DTD, por sus sigla en inglés). Esta descripción permite que cada XML porte una descripción de su propia estructura. Además, grupos independientes pueden acordar el uso de un DTD común para intercambiar datos y verificar que los documentos propios como ajenos tengan la estructura adecuada, o sea, sean válidos. Con lo expuesto anteriormente, es tiempo de definir los conceptos de documento válidos y documento bien formado. Documento bien formado Es aquel que responde a las características de un documento XML tal como la especifica la recomendación W3C, no existiendo limitaciones sobre el número o tipo de contenidos. Esto implica, entre otras cosas:

24

• •

Ocupar sólo carácteres aceptados por la codificación del documento, la cual fue definida en el atributo encoding del encabezado La estructura de elementos es estrictamente jerárquica: existe sólo un elemento raíz y todos los tags están correctamente anidados, no existiendo superposiciones de elementos. Los nombres de elementos están compuestos por letras, números y los signos -_.:, siendo importante la presencia o no de caracteres con mayúscula. Los valores de los atributos van cerrados entre comillas simples o dobles

Documento válido Es aquel que, estando bien formado, respeta las restricciones establecidas por una definición externa, correspondienta ésta a un documento DTD o XML Schema, en cuanto a los elementos y atributos aceptados, su cantidad y en el orden en el cual pueden aparecer.

Elemento DOCTYPE
Como vimos, un documento válido debe debe hacer a una definición del tipo, cantidad y orden de los contenidos considerados pertinentes. Si bien existen dos especificaciones para realizar esta labor, DTD y XML Schema, explicaremos el uso de la primera de estas forma, ya que es la más antigua y común. La referencia de un DTD se realiza por medio del elemento DOCTYPE, el cual ubica en el encabezado del documento, a continuación de la instrucción <?XML ?>. Dependiendo de la ubicación del DTD, el elemento DOCTYPE adoptará dos formas Referencia externa La definición del documento DTD se encuentra en un archivo distinto al XML. Ejemplo 2.5. Referencia externa a DTD
<?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?> <!DOCTYPE libro SYSTEM "libro.dtd" > <libro />

Como vemos, después de <DOCTYPE se incluye el nombre del elemento raiz (libro, en nuestro caso), el término SYSTEM, que indica que se debe acceder a un archivo local o remoto, y el nombre del archivo, que en este caso es libro.dtd Referencia interna La definición del DTD se encuentra dentro del mismo documento. Ejemplo 2.6. Referencia interna a DTD
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>

25

<!DOCTYPE libro [ <!ELEMENT libro EMPTY > ]> <libro />

En este ejemplo, después de <DOCTYPE se incluye el nombre del elemento raiz (libro) y se ubica el texto del DTD entre corchetes ([ y ]) En la sección sobre el encabezado del documento XML, se nombró la existencia del atributo standalone. Con los datos anteriormente expuestos, es fácil entender que un standalone = "yes" quiere decir que el documento no tiene un DTD o este se incluye directamente en el encabezado. La referencia externa, en cambio, determina un valor de
standalone = "no"

Estructura de un documento DTD
La forma en la cual se puede organizar un documento DTD es bastante libre. Es conveniente, eso sí, seguir el orden en el cual deben presentarse los objetos en el documento XML, definiendo primero los objetos que aparecen primero y/o que pueden ser incluidos en varios otros elementos, con sus respectivos atributos, para luego definir el resto de los elementos

Elementos
La definición de los elementos presenta la siguiente sintaxis básica
<!ELEMENT nombre-elemento categoría>

o
<!ELEMENT nombre-elemento (contenido-elemento)>

La primera nomenclatura se utiliza para asignar a un elemento una de las categorías genéricas (ANY o (EMPTY) . La segunda, cuando se quiere definir de forma exacta el tipo y orden de elementos que puede incluir el elemento en cuestión Sintaxis básica para definir elementos en DTD ANY Indica que el elemento puede contener cualquier tipo de contenido
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE cualquier_cosa [ <!ELEMENT cualquier_cosa ANY > <!ELEMENT parrafo ANY > ]> <cualquier_cosa> <parrafo>Esto es un parrafo</parrafo> Fuera de parrafo </cualquier_cosa>

26

EMPTY Indica que el elemento no puede contener nada, o que es lo mismo, que es un elemento vacío
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE vacio [ <!ELEMENT vacio EMPTY > ]> <vacio />

Secuencia de elementos Se define cual va a ser el orden y número de elementos permitidos. No se puede agregar otro contenido, aparte del definido.
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE secuencia [ <!ELEMENT secuencia (primero,segundo,tercero) > <!ELEMENT primero EMPTY> <!ELEMENT segundo EMPTY> <!ELEMENT tercero EMPTY> ]> <secuencia> <primero /> <segundo /> <tercero /> </secuencia>

Datos de carácter El elemento sólo contiene datos de carácter, y no elementos en su interior. Se representa por la expresión #PCDATA
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE solo_texto [ <!ELEMENT solo_texto (#PCDATA) > ]> <solo_texto> Este elemento sólo permite ingresar texto, nada más. </solo_texto>

Sintaxis para definir orden y cantidad de elementos en un DTD Un sólo elemento
<!ELEMENT nota (mensaje)>

El elemento mensaje debe presentarse una vez dentro del elemento nota Dos o más elementos en una secuencia definida
<!ELEMENT persona (nombres, apellido_paterno, apellido_materno)>

El elemento persona debe contener los elementos nombres, apellido_paterno y apellido_materno, en ese mismo orden Presencia de una o más apariciones del mismo elemento

27

<!ELEMENT jauria (perro+)>

El elemento jauría debe contener uno o más elementos perro Presencia de cero o más apariciones del mismo elemento
<!ELEMENT persona (hijo*)>

El elemento hijo puede presentarse 0, 1 o más veces dentro del elemento persona. Presencia de cero o una aparición del mismo elemento
<!ELEMENT persona (apendice?)>

El elemento apendice puede estar 1 vez o no estar dentro del elemento persona Presencia de elementos alternativos
<!ELEMENT vivienda (casa|departamento|mediagua)>

El elemento vivienda puede contener uno de los siguientes elementos: casa,departamento o mediagua. Presencia de contenido mezclado
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE mensaje[ <!ELEMENT mensaje (#PCDATA|negrita|cursiva)*> <!ELEMENT negrita (#PCDATA|cursiva)* > <!ELEMENT cursiva (#PCDATA) > ]> <mensaje> Este texto contiene texto libre, <negrita>negritas</negrita>, <cursiva>cursiva</cursiva> y <negrita><cursiva>ambos</cursiva></negrita> </mensaje>

Se puede tener datos de carácter y elementos mezclados dentro de un elemento padre, pero en la definición deben señalarse como elementos alternativos (uso de |), y en modo * (0 o más elementos aceptados). Uso de paréntesis
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE libro[ <!ELEMENT libro ((titulo?,titulo_breve?)?, introduccion?, (capitulo|seccion)*, glosario?) > <!ELEMENT titulo ANY > <!ELEMENT titulo_breve ANY > <!ELEMENT introduccion ANY > <!ELEMENT seccion ANY > <!ELEMENT capitulo ANY > <!ELEMENT glosario ANY > ]> <libro> <titulo></titulo> <titulo_breve></titulo_breve>

28

<capitulo /> <seccion /> <seccion /> <capitulo /> <capitulo /> <glosario> </glosario> </libro>

Se pueden agrupar distintas expresiones entre paréntesis, para lograr detallados ajustes de orden y cantidad. En el ejemplo, tenemos que existe una definición basada en orden de 4 elementos, siendo el primero y el tercero agrupaciones. En la primera agrupación, vemos que se puede tener 0 o 1 titulo y a continuación 0 o 1 titulo_breve, y todo esto puede o no estar antes de la introduccion. En la tercera agrupación, se ha establecido que se pueden tener 0 o más elementos de capitulo o seccion entre la introducción y el glosario.

Atributos
Los atributos de los elementos son declarados a través de una instrucción ATTLIST
<!ATTLIST nombre-elemento nombre-atributo tipo-atributo valor-preestablecido>

Tabla 2.2. Tipo de atributo para ATTLIST Valor CDATA Atributos enumerados (en1|en2|..) ID IDREF IDREFS NMTOKEN NMTOKENS ENTITY ENTITIES NOTATION xml: Explicación El valor contiene datos de carácter. El valor del atributo corresponde a algunos de los enumerados en la lista El valor debe ser un ID único El valor debe corresponder a un ID ya existente El valor es una lista ID ya existententes, separados por espacios El valor es un nombre XML válido El valor es una lista de nombre XML válidos, separados por espacios El valor es una entidad El valor es una lista de entidades, separadas por espacios El valor es el nombre de una notación El valor es un valor predefinido de xml

Tabla 2.3. Valores por defecto para ATTLIST

29

Valor Explicación valor El valor por defecto para el atributo #REQUIRED El atributo debe ser incluido en el elemento #IMPLIED El atributo no debe ser incluido El valor del atributo es fijo. No tiene mucha utilidad, excepto #FIXED valor cuando se altera una DTD para fijar un valor que antes era variable. Por ejemplo, si tenemos el elemento persona, podemos incluir el atributo nacionalidad. Si quisiesemos aceptar cualquier valor literal para esta variable, y fuese obligatario incluirla, su definición sería
<!ATTLIST persona nacionalidad CDATA #REQUIRED >

Si sólo aceptaramos personas de nacionalidad chilena y argentina, siendo mayor el número de chilenos, podríamos definir el atributo con una enumeración, dejando como valor por defecto 'chilena'
<!ATTLIST persona nacionalidad (chilena|argentina) "chilena" >

Cómo realizar una explicación de cada posibilidad sería bastante tedioso, así que a continuación se presentará un ejemplo comentado, que muestra las formas más usuales de definir atributos. Este ejemplo introduce, además, el uso de un DTD externo para validad un documento XML. Ejemplo 2.7. Uso de ATTLIST
catalogo.dtd <!ELEMENT catalogo (categoria|libro|autor)+ > <!ELEMENT categoria (#PCDATA) > <!ELEMENT autor (#PCDATA) > <!ELEMENT libro EMPTY > <!ATTLIST categoria categoria_id ID #REQUIRED > <!ATTLIST autor id ID #REQUIRED > <!ATTLIST autor iniciales CDATA #IMPLIED> <!ATTLIST libro id ID #REQUIRED > <!ATTLIST libro categoria_id IDREFS "general" > <!ATTLIST libro id IDREF #IMPLIED > <!ATTLIST libro estado (intacto|dañado|robado|prestado) "intacto">

Tipo de atributo: ID. El valor de este atributo para el documento debe ser único. Tipo de atributo: CDATA. Se puede ingresar cualquier dato de carácter, o sea, texto que no sea marcado Tipo de atributo: IDREF. El valor del atributo debe corresponder un ID ya especificado. Tipo de atributo: IDREFS. El valor del atributo debe corresponder a uno o más IDs ya especificados, separados por espacios.

30

Tipo de atributo: enumeración. El valor del atributo debe corresponder a alguno de los especificados en la lista. Valor por defecto: #REQUIRED. Se requiere ingresar un valor para el atributo Valor por defecto: #IMPLIED. No se requiere ingresar un valor para el atributo Valor por defecto específico. Si no se ingresa un valor, se utiliza el asignado
catalogo.xml <?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?> <!DOCTYPE catalogo SYSTEM "catalogo.dtd" > <catalogo> <categoria id="general">General</categoria> <categoria id="referencia">Libros de referencia</categoria> <categoria id="circulación">Libros en circulación</categoria> <autor id="autor1">Autor 1</autor> <autor id="autor2" iniciales="a2">Autor 2</autor> <libro id="libro1"/> <libro id="libro2" categoria_id="general referencia"/> <libro id="libro3" estado ="prestado" /> </catalogo>

Sugerencia
Si se necesita definir más de un atributo para un mismo elemento, se puede utilizar la misma sintaxis
<!ATTLIST nombre-elemento nombre-atributo tipo-atributo valorpreestablecido nombre-atributo tipo-atributo valorpresetablecido ...>

Por ejemplo
<!ATTLIST libro id ID #REQUIRED isdn CDATA #IMPLIED >

Entidades
El último tipo de objeto a definir dentro de un DTD son las entidades, que como ya hemos señalado en la sección “Texto y entidades” nos permiten representar carácteres no posibles de incluir como texto o cualquier otro tipo de texto. La sintaxis de definición de una entidad es bastante simple, siendo
<!ENTITY identificador "valor" >

El uso más importante de las entidades, aparte de permitir la representación de caracteres, es la de incluir texto o marcado de manera estándar. Cuando se realiza una 31

referencia a una entidad, el procesador la reemplaza de forma literal por el contenido asignado como valor, el cual puede incluir marcado. Por ejemplo, en HTML existe la etiqueta <a>, que con el atributo href nos permite hacer un link a una página. Por ejemplo:
<a href='http://www.google.cl'>Google</a>

Crea un link con el texto 'Google', dirigido a http://www.google.cl. Puede darse el caso que necesitemos ocupar repetidamente esa estructura en nuestro texto. Para evitar el trabajo de escribirlo una y otra vez, es posible crear una entidad &google;, que funcione como abreviatura de la expresión completa. Su DTD sería:
<!ENTITY google "<a href='http://www.google.cl'>Google</a>">

Entonces, si tenemos en nuestro texto
A continuación tendremos un link a google: &google;

El procesador reemplazará la entidad por su definición y obtendremos:
A continuación tendremos un link a google: <a href='http://www.google.cl'>Google</a>

Una variante de lo anterior es incluir el contenido de un archivo completo a través de la entidad. La sintaxis para ellos es:
<!ENTITY identificador SYSTEM "nombre_archivo" >

Por ejemplo, podemos dividir el contenido el contenido de un libro en tres archivos xml (capitulo_1.xml,capitulo_2.xml,capitulo_3.xml) e incluirlos dentro del archivo principal, definiendo tres entidades.
<?xml version="1.0" ?> <!DOCTYPE libro [ <!ENTITY capitulo_1 SYSTEM "capitulo1.xml" > <!ENTITY capitulo_2 SYSTEM "capitulo1.xml" > <!ENTITY capitulo_3 SYSTEM "capitulo1.xml" > ]> <libro> &capitulo_1; &capitulo_2; &capitulo_3; </libro>

Por último, es posible utilizar las entidades para ahorrar trabajo en la creación del DTD. Por ejemplo, si tenemos un atributo que es común a muchas entidades, es posible crear una entidad que la represente. La sintaxis es bastante similar a la de una entidad común
<!ENTITY % identificador "valor" >

32

Por ejemplo, hemos visto en varios ejemplos que los identificadores obligatorios se crean siempre como ID #REQUIRED. Entonces, podemos resumir la definición del DTD realizada en el ejemplo de uso de attlist usando entidades y el formato abreviado de definición de atributos. Ejemplo 2.8. Uso de entidades para definir atributos
<!ELEMENT catalogo (categoria|libro|autor)+ > <!ELEMENT categoria (#PCDATA) > <!ELEMENT autor (#PCDATA) > <!ELEMENT libro EMPTY > <!ENTITY % IdRequerido "id ID #REQUIRED" > <!ATTLIST categoria %IdRequerido; > <!ATTLIST autor %IdRequerido; iniciales CDATA #IMPLIED> <!ATTLIST libro %IdRequerido; categoria_id IDREFS "general" autor_id IDREF #IMPLIED estado (intacto|dañado|robado|prestado) "intacto">

Final Manual //http://php.apsique.com/xml/introduccion/ Lo Que Falta     Esquemas XML Enlazar documentos XML. XML Base y Xlink Consultas en XML:Xquery Manejo de documentos XML:DOM.

Comencemos a sacarle partido a todas estas tecnologías. Para ello vamos a crear una aplicación WEB en ASP.net con la siguiente funcionalidad: Una página web que visualice un mapa con una señal en las calles en las que halla coches mal aparcados. . Página de inicio en HTML con un menú de opciones - Carga de infracciones - Visualizar mapa.

33

Codigo ASP del menú: Public Class WebForm1 Inherits System.Web.UI.Page #Region " Código generado por el Diseñador de Web Forms " 'El Diseñador de Web Forms requiere esta llamada. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() End Sub 'NOTA: el Diseñador de Web Forms necesita la siguiente declaración del marcador de posición. 'No se debe eliminar o mover. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 'CODEGEN: el Diseñador de Web Forms requiere esta llamada de método 'No la modifique con el editor de código. InitializeComponent() End Sub #End Region Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Introducir aquí el código de usuario para inicializar la página End Sub End Class

. Página ASP de registro de las infracciones

34

Codigo asp. Imports System.Xml Imports System.Data Imports System Imports System.IO Public Class WebForm2 Inherits System.Web.UI.Page #Region " Código generado por el Diseñador de Web Forms " 'El Diseñador de Web Forms requiere esta llamada. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() End Sub Protected WithEvents Label1 As System.Web.UI.WebControls.Label Protected WithEvents Label2 As System.Web.UI.WebControls.Label Protected WithEvents Label3 As System.Web.UI.WebControls.Label Protected WithEvents GrabarInfraccion As System.Web.UI.WebControls.Button Protected WithEvents NuevaInfraccion As System.Web.UI.WebControls.Button ' Protected WithEvents datos As System.Web.UI.WebControls.DataGrid Protected WithEvents errores As System.Web.UI.WebControls.TextBox Protected WithEvents ctcalle As System.Web.UI.WebControls.TextBox Protected WithEvents ctTipoInfraccion As System.Web.UI.WebControls.TextBox Protected WithEvents ctMatricula As System.Web.UI.WebControls.TextBox Protected WithEvents Anterior As System.Web.UI.WebControls.Button Protected WithEvents Siguiente As System.Web.UI.WebControls.Button Protected WithEvents control As System.Web.UI.WebControls.TextBox Protected WithEvents Button1 As System.Web.UI.WebControls.Button Protected WithEvents Label4 As System.Web.UI.WebControls.Label Protected WithEvents esNuevo As System.Web.UI.WebControls.TextBox

35

Protected WithEvents Label5 As System.Web.UI.WebControls.Label Protected WithEvents Label6 As System.Web.UI.WebControls.Label Protected WithEvents listaCalles As System.Web.UI.WebControls.DropDownList Protected WithEvents SeleccionCalle As System.Web.UI.WebControls.Button Protected WithEvents Label7 As System.Web.UI.WebControls.Label Protected WithEvents Label8 As System.Web.UI.WebControls.Label Protected WithEvents ctposicionY As System.Web.UI.WebControls.TextBox Protected WithEvents ctposicionX As System.Web.UI.WebControls.TextBox 'NOTA: el Diseñador de Web Forms necesita la siguiente declaración del marcador de posición. 'No se debe eliminar o mover. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 'CODEGEN: el Diseñador de Web Forms requiere esta llamada de método 'No la modifique con el editor de código. InitializeComponent() End Sub #End Region Dim iCiclo As Integer Dim nfCiclo As Integer Dim posicion As Integer Dim nuevo As Boolean Dim grabado As Boolean Dim yaestaba As Boolean ' Tablainfracciones Private Private Private Private Private calle As New DataColumn tipoInfraccion As New DataColumn matricula As New DataColumn posicionx As New DataColumn posiciony As New DataColumn

Dim infracciones As New DataTable("infracciones") Private clavePrimariaInfraccion(0) As DataColumn

Dim ds As New DataSet Dim Dim Dim Dim fila As DataRow filaYaestaba As DataRow i As Integer nf As Integer

36

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load grabado = False If File.Exists("D:\Inetpub\wwwroot\aparcamiento\infracciones.xml") Then ' MsgBox("EXISTE") Else Abrir_fichero() ' MsgBox("noEXISTE") creaDataset() End If nuevo = False End Sub Private Sub creaDataset() i = -1 nf = -1 iCiclo = -1 nfCiclo = -1

calle.DataType = System.Type.GetType("System.String") calle.MaxLength = 50 calle.Unique = False calle.ColumnName = "calle" tipoInfraccion.DataType = System.Type.GetType("System.String") tipoInfraccion.MaxLength = 70 tipoInfraccion.Unique = False tipoInfraccion.ColumnName = "tipoInfraccion" matricula.DataType = System.Type.GetType("System.String") matricula.Unique = True matricula.MaxLength = 15 matricula.ColumnName = "matricula" matricula.DataType = System.Type.GetType("System.String") matricula.Unique = False matricula.MaxLength = 4 matricula.ColumnName = "posicionx" matricula.DataType = System.Type.GetType("System.String") matricula.Unique = False matricula.MaxLength = 4 matricula.ColumnName = "posiciony" infracciones.Columns.Add(calle) infracciones.Columns.Add(tipoInfraccion) infracciones.Columns.Add(matricula) infracciones.Columns.Add(posicionx) infracciones.Columns.Add(posiciony) 'clavePrimariaInfraccion(0) = matricula 'infracciones.PrimaryKey = clavePrimariaInfraccion ds.Tables.Add(infracciones)

37

'

datos.DataSource = ds

End Sub Private Sub Abrir_fichero() Try nuevo = False ds.ReadXmlSchema("D:\Inetpub\wwwroot\aparcamiento\infracci ones.xml") ml") ds.ReadXml("D:\Inetpub\wwwroot\aparcamiento\infracciones.x ' datos.DataSource = ds 'MsgBox(ds.Tables.Count) 'MsgBox(ds.Tables(0).TableName) 'MsgBox(ds.Tables(0).Rows.Count()) ds.Tables(0).Clone() '////////////// matricula.DataType = System.Type.GetType("System.String") matricula.MaxLength = 15 matricula.Unique = True matricula.ColumnName = "matricula" 'ds.Tables(0).Columns.Add(cFecha) 'clavePrimariaInfraccion(0) = ds.Tables(0).Columns(2) 'ds.Tables(0).PrimaryKey = clavePrimariaInfraccion 'ds.Tables.Add(ds.Tables(0)) '//////////////// nf = ds.Tables(0).Rows.Count - 1 i = nf posicion = i 'infracciones = ds.Tables(0).Copy() 'datos.DataSource = ds.Tables(0).DefaultView ' datos.Visible = True ' datos.AllowSorting = True ctcalle.Text = ds.Tables(0).Rows(nf).Item(0) ctTipoInfraccion.Text = ds.Tables(0).Rows(nf).Item(1) ctMatricula.Text = ds.Tables(0).Rows(nf).Item(2) ctposicionX.Text = ds.Tables(0).Rows(nf).Item(3) ctposicionY.Text = ds.Tables(0).Rows(nf).Item(4) control.Text = nf

' Llenar listaCalles infracciones = ds.Tables(0) listaCalles.DataSource = infracciones listaCalles.DataTextField = "calle" listaCalles.DataValueField = "calle" listaCalles.DataBind() listaCalles.SelectedIndex = 0 Catch ex As Exception

38

errores.Text = "mal" & ex.StackTrace End Try End Sub Private Sub NuevaInfraccion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NuevaInfraccion.Click nuevo = True esNuevo.Text = True ctcalle.Text = "" ctTipoInfraccion.Text = "" ctposicionX.Text = "" ctposicionY.Text = "" ctMatricula.Text = "" End Sub Private Sub GrabarInfraccion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GrabarInfraccion.Click Dim nuevo As Boolean If Request.Form("esNuevo") = "" Then nuevo = False Else nuevo = Request.Form("esNuevo") End If Dim posicion As Integer posicion = Request.Form("control") Try If nuevo Then fila = ds.Tables(0).NewRow() If yaestaba = True Then fila = filaYaestaba End If End If If nuevo = False Then fila = ds.Tables(0).Rows(posicion) End If

fila("calle") = Request.Form("ctcalle") ' ctcalle.Text fila("tipoInfraccion") = Request.Form("ctTipoInfraccion") ' ctTipoInfraccion.Text fila("matricula") = Request.Form("ctMatricula") ' ctMatricula.Text fila("posicionX") = Request.Form("ctposicionX") fila("posiciony") = Request.Form("ctposicionY") If nuevo Then 'ds.Tables(0).Rows(posicion).Delete() ds.Tables(0).Rows.Add(fila)

39

End If ds.Tables(0).AcceptChanges() ' datos.DataSource = ds.Tables(0).DefaultView ds.AcceptChanges() ctcalle.Text = ds.Tables(0).Rows(0).Item(0) ctTipoInfraccion.Text = ds.Tables(0).Rows(0).Item(1) ctMatricula.Text = ds.Tables(0).Rows(0).Item(2) ctposicionX.Text = ds.Tables(0).Rows(0).Item(3) ctposicionY.Text = ds.Tables(0).Rows(0).Item(4) If nuevo Then i = i + 1 nf = nf + 1 End If Catch ex As Exception errores.Text = "Error grabacion" & vbCrLf & ex.Message & ex.StackTrace End Try Dim ficheroT As New System.IO.FileStream("D:\Inetpub\wwwroot\aparcamiento\infracciones.xml ", IO.FileMode.Create) ds.WriteXml(ficheroT, XmlWriteMode.WriteSchema) ficheroT.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles errores.TextChanged End Sub Private Sub Anterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Anterior.Click esNuevo.Text = False Dim ii As Integer Try ii = Request.Form("control") nuevo = If ii > i = Else i = End If False 0 Then ii - 1 0

control.Text = i posicion = i

40

ctcalle.Text = ds.Tables(0).Rows(i).Item(0) ctTipoInfraccion.Text = ds.Tables(0).Rows(i).Item(1) ctMatricula.Text = ds.Tables(0).Rows(i).Item(2) ctposicionX.Text = ds.Tables(0).Rows(i).Item(3) ctposicionY.Text = ds.Tables(0).Rows(i).Item(4) Catch ex As Exception errores.Text = "Anterior " End Try control.Text = i End Sub Private Sub Siguiente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Siguiente.Click esNuevo.Text = False Try nuevo = False Dim ii As Integer ii = Request.Form("Control") control.Text = ii ' If i < nf Then i = ii + 1 ' Else ' i = nf ' End If posicion = i ctcalle.Text = ds.Tables(0).Rows(i).Item(0) ctTipoInfraccion.Text = ds.Tables(0).Rows(i).Item(1) ctMatricula.Text = ds.Tables(0).Rows(i).Item(2) ctposicionX.Text = ds.Tables(0).Rows(i).Item(3) ctposicionY.Text = ds.Tables(0).Rows(i).Item(4) Catch errores.Text = "Siguiente" ' control.Text = ii End Try control.Text = i End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click control.Text = "" End Sub

Private Sub SeleccionCalle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SeleccionCalle.Click errores.Text = Request.Form("listaCalles") Dim j As Integer For j = 0 To ds.Tables(0).Rows.Count - 1 If ds.Tables(0).Rows(j).Item(0) = Request.Form("listaCalles").ToString Then ctcalle.Text = ds.Tables(0).Rows(j).Item(0) ctTipoInfraccion.Text = ds.Tables(0).Rows(j).Item(1) ctMatricula.Text = ds.Tables(0).Rows(j).Item(2)

41

Next End Sub End Class

ctposicionX.Text = ds.Tables(0).Rows(j).Item(3) ctposicionY.Text = ds.Tables(0).Rows(j).Item(4) End If

. Página html con JavaScript que visualiza las infracciones sobre en una imagen(mapa) fondo a partir de la información contenido en xml. Efectivamente desde JavaScript podemos leer un fichero xml utilizando DOM. Ejemplo:

Código JavaScript que genera el mapa de infracciones. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title></title> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> <xml id="writersXML" src="infracciones.xml"></xml> <script language="javascript"> function visualiza() { var myXml, escribirNodos,nodoLenguaje; var nodoPadre,nombreNodo, display; myXml=document.all("writersXML").XMLDocument; escribirNodos=myXml.getElementsByTagName("posicionx"); var lineasx = new Array(escribirNodos.length); for(var i=0;i<escribirNodos.length;i++) { //display +=escribirNodos.item(i).firstChild.nodeValue +"\n"; lineasx[i]=escribirNodos.item(i).firstChild.nodeValue; } escribirNodos=myXml.getElementsByTagName("posiciony");

42

; var lineasy = new Array(escribirNodos.length); for(var i=0;i<escribirNodos.length;i++) { lineasy[i]=escribirNodos.item(i).firstChild.nodeValue; } document.write("<html>") document.write("<body background='mapa.jpg'>") for(var i=0;i<escribirNodos.length;i++) { var instru="" instru="<img src='d:\\activo.jpg' style='position: absolute; left: "+lineasx[i] +"; top:"+lineasy[i]+";'></img> " document.write("<p>"+instru+"</p>"); //alert(instru); }

}

</script> </head> <!-- <body style="background-repeat:'no-repeat';background-position: center center;" background="d:\mapa.jpg" onload="visualiza()" > <body onload="visualiza()" > <img src="d:\mapa.jpg" style="position: absolute; left: 10pt; top: 10pt;"> --> <body onload="visualiza()" > </body> </html>

Fichero xml con la información.
<infracciones> <xs:schema id="infracciones" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemasmicrosoft-com:xml-msdata"> <xs:element name="infracciones" msdata:IsDataSet="true" msdata:Locale="es-ES"> <xs:complexType> <xs:choice maxOccurs="unbounded"> <xs:element name="infraccion"> <xs:complexType> <xs:sequence> <xs:element name="calle" type="xs:string" minOccurs="0" /> <xs:element name="tipoinfraccion" type="xs:string" minOccurs="0" /> <xs:element name="matricula" type="xs:string" minOccurs="0" /> <xs:element name="posicionx" type="xs:string" minOccurs="0" /> <xs:element name="posiciony" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice>

43

</xs:complexType> </xs:element> </xs:schema> <infraccion> <calle>C.Amapola</calle> <tipoinfraccion>1</tipoinfraccion> <matricula>bu-2783V</matricula> <posicionx>10</posicionx> <posiciony>10</posiciony> </infraccion> <infraccion> <calle>C.Ventisca</calle> <tipoinfraccion>2</tipoinfraccion> <matricula>bu-2783z</matricula> <posicionx>150</posicionx> <posiciony>150</posiciony> </infraccion> <infraccion> <calle>C.la huerta</calle> <tipoinfraccion>3</tipoinfraccion> <matricula>bu-2783x</matricula> <posicionx>200</posicionx> <posiciony>200</posiciony> </infraccion> <infraccion> <calle>C.Cebolletas 3</calle> <tipoinfraccion>4</tipoinfraccion> <matricula>bu-2783h</matricula> <posicionx>250</posicionx> <posiciony>250</posiciony> </infraccion> <infraccion> <calle>222222</calle> <tipoinfraccion>2222222222</tipoinfraccion> <matricula>22222</matricula> <posicionx>300</posicionx> <posiciony>300</posiciony> </infraccion> <infraccion> <calle>66666666</calle> <tipoinfraccion>666666</tipoinfraccion> <matricula>66666666666</matricula> <posicionx>350</posicionx> <posiciony>350</posiciony> </infraccion> </infracciones>

44

Sign up to vote on this title
UsefulNot useful