Documentos XML bien formados En los Unidades anteriores ya hemos visto de forma generalizada que una de las características que diferencian al XML del SGML es la posibilidad de no utilizar DTD. En una DTD definimos cómo va a ser un tipo de documento; es decir, definimos los elementos, atributos y entidades que lo van a formar, cómo se estructuran y relacionan. Por tanto, si en la elaboración de nuestros documentos XML no utilizamos ninguna, el parser no puede proporcionarnos información sobre la validez de ese documento; dicho de otro modo, no nos puede indicar que los elementos y atributos que utilizamos son los correctos y si encuentran en el orden adecuado.simplemente nos indicará si ese documento está bien formado o no, es decir, si respeta las reglas sintácticas del lenguaje XML. Según la especificación, un objeto de texto es un documento XML bien formado si: Tomado como un todo, cumple la regla denominada "document". Respeta todas las restricciones de buena formación dadas en la especificación. Cada una de las entidades analizadas que se referencia directa o indirectamente en el documento está bien formada. A lo largo de los próximas dos unidades vamos a estudiar con más detalle esta definición, de manera que tengamos claro cómo tiene que ser un documento de texto para ser aceptado por un parser como un documento XML bien formado. La regla "document" Cumplir la regla "document" antes mencionada significa: 1. Que contiene uno o más elementos. 2. Hay exactamente un elemento, llamado raíz, o un elemento documento del cual ninguna parte aparece en el contenido de ningún otro elemento. 3. Para el resto de elementos, si la etiqueta de comienzo está en el contenido de algún otro elemento, la etiqueta de fin está en el contenido del mismo elemento. Es decir, los elementos delimitados por etiquetas de principio y final se anidan de forma adecuada mutuamente. El siguiente ejemplo no es un documento XML bien formado, Mi primer documento XML ya que no contiene ningún elemento y, por tanto, está incumpliendo la regla número 1. En cambio, <p>mi primer documento XML</p>
sí que lo es, al contener al menos el elemento "p". La principal razón por la que el procesador comprueba los elementos es para determinar si el documento tiene estructura de datos que pueda extraer. Un documento que carece de elementos no tiene estructura de datos. Un documento con al menos un elemento tiene estructura de datos. En cambio, <p>mi primer documento XML</p> <p>mi primer documento XML</p> no es un documento XML bien formado al incumplir la regla número 2, según la cual sólo puede existir un único elemento raíz. Aunque escrito de la siguiente manera sí que es correcto, <documento> <p>mi primer documento XML</p> <p>mi primer documento XML</p> </documento> al convertirse el elemento "documento" en el elemento raíz, ser único y no formar parte del contenido de ningún otro elemento. En cambio, el siguiente ejemplo, <documento> <p>mi primer <destacar>documento XML</p></destacar> <p>mi primer documento XML</p> </documento> es incorrecto al incumplir la regla 3, ya que la etiqueta inicio del elemento "destacar" está dentro del contenido del elemento "p", pero su etiqueta final está fuera. La forma correcta sería la siguiente: <documento> <p>mi primer <destacar>documento XML</destacar></p> <p>mi primer documento XML</p> </documento> Ejercicio: Documento XML que incumple la regla Document Para practicar, vamos a realizar varios ejercicios durante el curso. En este, deberéis indicar qué partes de la regla "document" incumple el siguiente documento: <libro> <titulo>el Quijote</titulo> <libro>
<titulo>el Lazarillo de Tormes</titulo> <autor>anonimo <libro></autor> <libro> Solución: Incumple las reglas 2 y 3. La regla 2 porque el elemento raíz libro existe más de una vez. La regla 3 porque el elemento autor empieza dentro del elemento libro pero en cambio termina fuera. Sintaxis correcta y restricciones de buena formación Además de las reglas anteriormente mencionadas, para escribir documentos XML bien formados tenemos que conocer perfectamente la sintaxis del lenguaje XML y algunas restricciones que la especificación impone. Es como en cualquier lenguaje tenemos que conocer la sintaxis de cómo se escriben los elementos, atributos y entidades, y,si las incumplimos, el "parser" nos dará un error de mala formación. Algunas de estas reglas ya las hemos visto en el capítulo anterior: cómo se escriben las etiquetas de inicio y final, cómo se escriben las etiquetas de elementos vacios, cómo tenemos que escribir los atributos etc. y es evidente que si no seguimos estas reglas el parser nos dará error. En el siguiente ejemplo: Documento XML mal formado. Miscelánea de errores, <?xml version="1.0"?> <documento> <p>mi Primer <destacar importancia=1>documento XML</destacar></p] <p>comienza con la etiqueta <documento></p> <p>a continuacion colocamos un elemento sin contenido</p> <imagen fichero="imagen.gif"> </documento> nos encontramos con cuatro errores: El valor del atributo "importancia" no está entrecomillado. En HTML es posible no entrecomillar el valor de los atributos, pero en XML es obligatorio. Tendríamos que haber escrito:...<destacar importancia="1">documento XML</destacar>... La etiqueta final, del elemento "p", está mal cerrada. En lugar del carácter "]", tendríamos que poner el símbolo mayor que ">".
<p>mi Primer <destacar importancia=1>documento XML</destacar></p> Estamos utilizando el símbolo menor que "<" sin que forme parte de la definición de una etiqueta. Al ser un carácter reservado, tendríamos que escribirlo como la entidad predefinida <. <p>comienza con la etiqueta <documento></p> Estamos escribiendo el elemento vacío "imagen" de forma incorrecta. Al ser un elemento sin contenido tendríamos que haberlo escrito con una etiqueta de elemento vacío: <imagen fichero="imagen.gif"/> o también de la siguiente manera: <imagen fichero="imagen.gif"></imagen> Ambas son correctas, aunque es recomendable la primera. Por tanto, el ejemplo anterior bien escrito: Documento XML bien formado <?xml version="1.0"?> <documento> <p>mi Primer <destacar importancia="1">documento XML</destacar></p> <p>comienza con la etiqueta <documento></p> <p>a continuacion colocamos un elemento sin contenido</p> <imagen fichero="imagen.gif"/> </documento> Otras reglas que debemos tener en cuenta son: El XML es sensible a la utilización de mayúsculas y minúsculas. En el siguiente ejemplo: <p>mi primer documento XML</p> <P>Mi primer documento XML</P> los elementos "p" y "P" son diferentes. Hay que tener mucho cuidado con esta regla, ya que su incumplimiento es habitual y suele ser la causa de la mayor parte de los errores. Es recomendable antes de empezar a escribir un documento XML establecer un criterio al respecto. El nombre de la etiqueta de inicio y final debe ser el mismo.
El siguiente ejemplo es incorrecto <p>mi primer documento XML</P> ya que al hacer diferencia entre mayúsculas y minúsculas, el parser no entiende ambas etiquetas como del mismo elemento. Ningún nombre de atributo puede aparecer más de una vez en la misma etiqueta de inicio o de elemento vacío. El siguiente ejemplo es incorrecto:...<destacar importancia="1" importancia="2">documento XML</destacar>... Un consejo; si utilizais el bloc de notas recordad que para que funcione todo el tinglado debeis guardar los ficheros con extensión ".xml". El bloc de notas procurará por todos los medios que los ficheros se guarden con extensión ".txt". Para conseguir que guarde el fichero con la extensión que deseamos, cuando tengamos la ventana de diálogo escogeremos en el desplegable "Todos los ficheros (*.*)" y pondremos el nombre del fichero con la extensión entre comillas dobles en el campo correspondiente. Ejercicio: Documento XML no valido Reescribir el siguiente ejemplo para que sea un documento XML bien formado. <?xml version="1.0"?> <libros> <libro id="quijote"> <titulo>el Quijote</titulo> <autor nombre=cervantes nombre=cervantes> <descripcion>es el m<ejor libro de cervantes.</descripcion> </libro] </Libros> Solución: Aprovecharemos este ejercicio para ver que el IE5 es una estupenda herramienta para comprobar que nuestros documentos son documentos XML bien formados. Por ejemplo, si abrimos el enunciado de este ejercicio observaremos cómo nos va indicando de forma muy clara los errores que tiene. En primer lugar, nos indica que el valor del atributo nombre no está entrecomillado.
En segundo lugar, nos indica que se produce un error por tener duplicado el nombre del atributo nombre. En tercer lugar, ya nos indica un error que no resulta tan claro, aunque nos debe resultar fácil adivinar que se produce porque estamos utilizando el símbolo menor que "<" sin que forme parte de la definición de una etiqueta. Al ser un carácter reservado, tendriamos que escribirlo como la entidad predefinida <..Las Entidades Todavía no hemos hablado mucho de las entidades,pero, como veremos más adelante, resultan muy importantes en la elaboración y mantenimiento eficiente de nuestros documentos XML. Una de sus funcionalidades es la de permitirnos elaborar un documento XML en "trozos"; es decir, tendremos un único documento XML, pero éste físicamente se encontrará dividido en varios ficheros. Por el momento no vamos a profundizar más en este aspecto, pero lo que hay que tener en cuenta es que para el parser se trata de un único documento XML y que, por tanto, sus diferentes partes, aún encontrándose en ficheros distintos, deben verificar las reglas de buena formación descritas anteriormente. Documentos XML válidos. Las DTD Un documento XML válido es un objeto de texto que,además de ser un documento XML bien formado, sigue las reglas de una DTD específica. Pero veamos qué es exactamente una DTD.. Que es una DTD? Una DTD (Document Type Definition) es un conjunto de reglas para definir un documento XML y etiquetarlo adecuadamente. En una DTD definimos los "componentes" de un documento XML y cómo se relacionan y estructuran.
Es importante tener en cuenta que una DTD no es más que una interpretación de un texto. Si tenemos un conjunto de documentos de texto que queremos convertir en documentos XML, en primer lugar debemos abstraer y generalizar los elementos de que se componen y cómo están estructurados. La declaración práctica de estos elementos y las reglas que los componen será la DTD de ese tipo de documentos. Evidentemente, esta abstracción y la forma de implementarla depende del autor que la elabore y,por tanto, es subjetiva, por lo que es posible que para un mismo documento se elaboren diferentes DTD. La siguiente porción de texto es una DTD: Ejemplo de DTD para HTML simple <!ELEMENT mihtml (c1 parrafo)*> <!ELEMENT c1 (#PCDATA)> <!ELEMENT parrafo (#PCDATA negrita)*> <!ELEMENT negrita (#PCDATA)> Como podemos observar, en la práctica no es más que un conjunto de declaraciones. Cada declaración empieza con la cadena "<!" y termina con la cadena "mayor que" ">". A continuación del símbolo de admiración viene una de las palabras reservadas del XML para especificar el tipo de objeto que se quiere definir, seguido del nombre del objeto declarado y los parámetros asociados. <!objeto_declarado nombre_de_objeto parametros_asociados> El XML soporta cinco tipos de declaraciones: DOCTYPE ELEMENT ATTLIST ENTITY NOTATION de las cuales DOCTYPE, ELEMENT y ATTLIST serán estudiadas con más detalle en esta unidad. Declarando la DTD Las declaraciones que forman la DTD pueden estar definidas en los siguientes lugares: Dentro del propio documento XML. En algún fichero externo que luego referenciamos desde el documento XML. Aunque esto no significa que se tengan que definir en su totalidad en alguno de estos lugares. Las declaraciones que la forman puede estar en parte en el fichero externo y en parte en el propio documento XML. Por tanto, hay que tener cuidado y no considerar simplemente como DTD el fichero externo, sino el conjunto de todas las declaraciones DTD, tanto las externas como las internas.
La declaración de una DTD empieza con la declaración DOCTYPE seguida del nombre de un elemento, que debe corresponder con el que definamos en la DTD, como el elemento raíz (Elemento documento). <!DOCTYPE nombre_de_tipo_de_documento... En nuestro ejemplo tendría el siguiente aspecto: <!DOCTYPE mihtml... A partir de aquí, dependiendo de si las declaraciones de la DTD, son exclusivamente internas, externas o mixtas, cambiará lo que tenemos que colocar en los puntos suspensivos. La DTD en el interior del documento XML En el caso de que las declaraciones de la DTD sean exclusivamente interiores, la declaración DOCTYPE tiene el siguiente aspecto: <!DOCTYPE nombre_de_tipo_de_documento [declaracions que forman la DTD]> quedando en nuestro ejemplo de la siguiente manera: <?xml version="1.0"?> <!DOCTYPE mihtml [ <!ELEMENT mihtml (c1 parrafo)*> <!ELEMENT c1 (#PCDATA)> <!ELEMENT parrafo (#PCDATA negrita)*> <!ELEMENT negrita (#PCDATA)> ]> <mithml>... </mithml> es decir, a la expresión de partida abrimos un corchete '[' realizamos las declaraciones, en las que definimos elementos, atributos, entidades, etc., y cerramos la declaración con la expresión "]>". No es demasiado frecuente que una DTD sea declarada en su totalidad dentro del documento XML La DTD exterior al documento XML En este caso, el conjunto de las declaraciones DTD irán en un fichero externo, por lo que parece normal que a la declaración DOCTYPE tendremos que indicarle de alguna manera donde se encuentra este fichero. Esto se realiza añadiendo a la expresión inicial las palabras clave SYSTEM o PUBLIC. En el caso de que sea "SYSTEM",a continuacion indicamos el identificador de sistema, que no es más que una URI (Indenficador Universal de Recursos, una forma ampliada del URL) donde se encuentra el fichero que contiene la DTD. Suponiendo que hemos guardado las declaraciones de la DTD en un fichero mihtml.dtd que se encuentra en el mismo directorio que el fichero XML,la declaración tendría el siguiente aspecto:
<!DOCTYPE mihtml SYSTEM "mihtml.dtd"> <mihtml>... </mihtml> En el caso de utilizar PUBLIC estaremos indicando que, además del identificador de sistema, identificamos la DTD con un identificador público (unívoco). <!DOCTYPE mihtml PUBLIC "-//Joaquin Bravo//DTD HTML Ciberaula//EN" "mihtml.dtd"> <mihtml>... </mihtml> De esta manera el procesador XML ya se encargará de convertir dicho identificador en un URI. Esta equivalencia posiblemente se obtenga en un fichero que suele denominarse "catalógo de entidades" que es donde se establece tal relación. En el caso de que no se pueda establecer esta relación utilizará el identificador de sistema. Cabe destacar que esta última característica depende mucho de las aplicaciones XML que utilicemos y debemos tener en cuenta qué formato de catálogos maneja y si los maneja. La ventaja de trabajar con DTD declaradas en ficheros externos es evidente, si tenemos en cuenta que esa misma DTD puede ser utilizada para múltiples documentos XML. La modificación de esta DTD sólo implicaría realizar modificaciones en un único fichero y no en todos los documentos XML que la utilizan. La DTD con declaraciones interiores y exteriores Es posiblemente la forma más habitual de trabajar con las DTD. En la declaración externa de la DTD se definen los elementos, atributos y entidades que formarán ese tipo de documento, y en la declaración interna se definen algunas características propias de ese documento que no van a aparecer en otros del mismo tipo. La forma de indicarlo en la declaración DOCTYPE es una mezcla de las formas anteriores. Se define como una DTD externa, pero en lugar de cerrar con el símbolo mayor que ">" abrimos el símbolo "[" para poder definir declaraciones de DTD internas y cerramos con la expresión "]>". Por ejemplo, esta forma de trabajar es muy utilizada para la declaración de entidades (en un capítulo posterior se estudia en detalle el tema de las entidades) particulares de ese documento. Imaginemos que estamos escribiendo un documento XML en el que una cadena de texto se repite constantemente y queremos evitarnos el tener que escribirla cada vez. Este problema lo podemos solucionar de la siguiente manera: <!DOCTYPE mihtml SYSTEM "mihtml.dtd" [ <!ENTITY texto "En un lugar de la mancha" ]> <mihtml> <p>&texto;</p>
<p>&texto;</p> <p>&texto;</p> <p>&texto;</p> </mihtml> También se puede utilizar para añadir nuevos elementos, listas de atributos, etc.. Imaginemos que queremos añadir texto en cursiva dentro del elemento parrafo en un documento XML basado en nuestra mihtml, y sólo queremos que funcione en este documento. Y lo haremos creando un nuevo elemento que denominamos cursiva <!DOCTYPE mihtml SYSTEM "mihtml.dtd" [ <!ELEMENT parrafo (#PCDATA negrita cursiva)*> <!ELEMENT cursiva (#PCDATA)> ]> <mihtml> <parrafo>texto en <cursiva>cursiva</cursiva></parrafo> </mihtml> Evidentemente, hemos tenido que redefinir el elemento parrafo para que en su contenido contemple el elemento cursiva. Hay que tener en cuenta que se procesan antes las declaraciones internas que las externas. Definición de los elementos El XML no tiene elementos predefinidos. Cuando nos ponemos a escribir un documento XML, no disponemos del H1, A o del IMG del HTML. Podemos utilizar nuestros propios elementos, los cuales se definen en la DTD. Esto lo realizamos mediante la declaración ELEMENT cuya sintaxis es la siguiente: <!ELEMENT nombre_elemento (especificacion del contenido)> Especificación del contenido En esta parte de la declaración indicamos cúal va a ser el contenido de ese elemento. Como ya hemos visto en capítulos anteriores tenemos cuatro posibilidades: Que no tenga contenido. Que esté formado sólo por texto. Que esté formado únicamente por elementos. Que tenga un contenido mixto de texto y elementos. Sin contenido Esto se determina colocando la palabra clave EMPTY en la declaración del contenido. Son elementos
que no tienen contenido y su valor suele estar determinado por los atributos. Es el caso de los elementos IMG, HR, BR, etc., del HTML. Si a nuestro ejemplo de minihtml queremos añadirle la posibilidad de trabajar con imágenes, como un elemento sin contenido cuyas propiedades especificaremos en los atributos, y que éstas puedan aparecer en cualquier lugar del documento, tendremos que añadir las siguientes declaraciones: <!ELEMENT mihtml (c1 parrafo imagen)*>... <!ELEMENT imagen EMPTY> Luego en el XML lo tendremos que escribir de la siguiente manera: <imagen...atributos... /> Contenido formado sólo por texto Esto lo conseguimos colocando la palabra clave #PCDATA en la espeficicación del contenido. De esta manera estamos indicando que dentro de ese elemento no puede haber ningún otro elemento y que, por tanto, sólo nos encontraremos texto. En nuestro ejemplo es el caso del elemento negrita. <!ELEMENT negrita (#PCDATA)> Este elemento en XML se escribirá:...<negrita>texto</negrita>... Contenido formado sólo por elementos En este caso en la especificación del contenido sólo debemos indicar los nombres (identificadores genéricos) de otros elementos. Posiblemente éstos estén relacionados mediante los indicadores de aparición y conectores de grupo que explicamos más adelante. En nuestro ejemplo es el caso del elemento mihtml en cuya declaración indicamos que estará formado por los elementos: c1, para e imagen. <!ELEMENT mihtml (c1 parrafo imagen)*> Este elemento en XML se escribirá por ejemplo: <mihtml> <parrafo>...</parrafo> <parrafo>...</parrafo> </mihtml> Contenido mixto También es posible combinar los dos últimos casos y declarar la especificación de contenido, de manera que un elemento tenga texto y otros elementos. En nuestro ejemplo es el caso del elemento para, que puede estar formado de texto y de elementos
negrita. <!ELEMENT parrafo (#PCDATA negrita)*> Como podemos observar, no tenemos más que combinar la palabra clave #PCDATA con los nombres de los elementos que contendra. Este elemento en XML se escribirá por ejemplo: <parrafo>esto es un <negrita>parrafo</negrita></parrafo> o <parrafo>esto es un parrafo</parrafo> Posiblemente, el nombre de contenido mixto no sea el más adecuado, ya que como vemos en el ejemplo el modelo de contenido mixto no significa que siempre deban incluirse tanto elementos como texto. También es posible indicar que un elemento puede contener cualquier elemento o carácter. Esto se consigue mediante la palabra clave ANY. Es muy poco utilizado, aunque puede ser muy útil durante el proceso de creación de una DTD cuando todavía no tenemos muy claro cuál será el contenido de un elemento. Conectores de grupo El modelo de contenido puede contener más de un elemento y,por tanto, se necesita información adicional que especifica el orden en el que aparecen. Para ello utilizamos los contectores de grupo. En el XML hay dos posibles conectores de grupo:, indica que deben aparecer en ese orden. indica que sólo uno de los componentes puede aparecer. Si nos fijamos en nuestro ejemplo, utilizamos esencialmente el conector mediante el cual indicamos que el autor del documento XML puede elegir entre un elemento u otro. Por ejemplo, en: <!ELEMENT mihtml (c1 parrafo imagen)*> estamos indicando que dentro del elemento mihtml el autor puede poner o el elemento c1, o el elemento parrafo, o el elemento imagen. Es decir, que los siguientes ejemplos son todos válidos. <mihtml> <parrafo>...</parrafo> </mihtml> <mihtml> <c1>...</c1> </mihtml>
<mihtml> <imagen/> </mihtml> Otro tema es el indicador,* que nos indica que ese modelo de contenido se puede repetir y que, por tanto, esos tres elementos pueden aparecer tantas veces como quieran. En cambio el conector "," establece una secuencia que debe seguirse. Imaginemos que en nuestro pequeño HTML queremos incluir la posibilidad de tener listas ordenadas y que éstas puedan estar ordenadas. Si al elemento lista ordenada lo identificamos mediante el elemento lo y a sus entradas "items" mediante el elemento item, su declaración en la DTD quedaría de la siguiente manera: <!ELEMENT lo (item, (lo item)*)> <!ELEMENT item (#PCDATA)> Mediante el conector,, estamos indicando que dentro de un lo en primer lugar debe haber un item y que luego puede venir otro "item" o empezar otra lista. Un texto XML que se ajuste a esta definición podría ser: <lo> <item>texto</item> <item>texto</item> <lo> <item>texto</item> <item>texto</item> </lo> </lo> Indicadores de aparición Se utilizan para indicar cuántas veces puede aparecer el elemento referenciado en el modelo de contenido. Hay tres indicadores de aparición: + Indica que puede haber una o más apariciones del elemento.? Indica que puede haber a lo más una o ninguna aparición del elemento. * Indica que el elemento puede estar ausente, una o más veces. Como ya hemos explicado, dentro del elemento mihtm, los elementos c1, parrafo o elemento imagen pueden aparecer en el orden que quieran, pero tantas veces como quieran, o incluso ninguna. Esta última característica la indicamos mediante el indicador *. Pero imaginemos que queremos que el primer elemento de una lista ordenada no sea siempre el elemento item, sino que queremos permitir que sea lo. En tal caso podríamos definir el elemento de la siguiente manera: <!ELEMENT lo (item?, (lo item)*)> Donde con item? estamos indicando que puede aparecer 0 o 1 veces y que, por tanto, el siguiente ejemplo es válido.
<lo> <lo> <item>texto</item> <item>texto</item> </lo> </lo> Aunque en este caso conseguiríamos el mismo efecto definiendo el elemento de la siguiente manera: <!ELEMENT lo (lo item)*>.añadiendo atributos a los elementos Del mismo modo que los elementos, los atributos se declaran en la DTD utilizando una sintaxis bastante similar. En este caso se realiza mediante el término ATTLIST, que en el comienzo de una declaración indica que es una especificación de una lista de atributos. <!ATTLIST nombre_elemento nombre_atributo tipo valor_defecto> Como podemos observar, la primera muestra indica el elemento sobre el cual se van a definir los atributos y, a continuación, viene una tripla de datos en los que indicamos: El nombre del atributo El tipo Y su valor por defecto. Esta tripla se puede repetir tantas veces como queramos dentro de la declaración, es decir, podemos declarar una lista de atributos, de ahí su nombre. Un ejemplo de definición de atributos para nuestro elemento imagen podría ser: <!ATTLIST imagen direccion CDATA #REQUIRED alineacion (izquierda, centrada, derecha) "izquierda"> Tipo Una utilidad importante de los atributos es que mediante el tipo podemos hacer cumplir al elemento obligaciones léxicas o semánticas. Las obligaciones léxicas son por ejemplo "este atributo debe contener sólo números" y las semánticas son "este atributo debe contener el nombre de una entidad declarada". Evidentemente estas obligaciones son muy útiles, ya que nos permiten garantizar la integridad de algunos de los valores de los atributos, pero la verdad es que son bastante limitadas y en muchas ocasiones insuficientes. Los tipos de atributos pueden ser: CDATA NMTOKEN NMTOKENS
ENUMERADOS NOTATION ID IDREF IDREFS ENTITY ENTITYS En teoria las posibilidades son muchas, aunque luego en la práctica sin duda alguna los más utilizados son los CDATA y el ID. CDATA Es el tipo de atributo más sencillo.mediante su utilización estamos indicando que el valor del atributo debe ser de tipo carácter. Es, por tanto, de todos los tipos el que menos obliga. Al especificar el atributo direccion de nuestro elemento imagen: <!ATTLIST imagen direccion CDATA #REQUIRED... estamos indicando que el valor del atributo dirección puede llevar cualquier tipo de carácter. ID Mediante este tipo de atributo identificamos de forma unívoca un elemento del documento XML. Su valor debe ser único en el documento. Imaginemos que queremos identificar de forma unívoca los elementos c1, de manera que luego sean fácilmente identificables y referenciables. Esto lo tendríamos que indicar: <!ATTLIST c1 id ID #REQUIRED... IDREF Está estrechamente ligado al tipo de atributo ID, y mediante su utilización estamos indicando que hacemos referencia al valor de algún atributo ID. NMTOKEN Estos atributos se parecen en parte a los atributos CDATA. La principal diferencia es que sólo aceptan lo caracteres. ENUMERADOS Ofrecen al usuario la posibilidad de elegir entre un número reducido de valores. Es el caso, por ejemplo, del atributo alineacion en el elemento imagen: <!ATTLIST imagen
... alineacion (izquierda, centrada, derecha) "izquierda"> Donde estamos indicando que los únicos valores permitidos para el atributo alineacion son: izquierda, centrada y derecha. Valor por defecto La última parte de la especificación sirve para indicar al parser cómo debe interpretar la ausencia de atributo. Ya hemos visto que en este lugar podemos indicar, el valor que puede tener por defecto. Pero en el caso de que esto no sea así,indicamos al parser cómo debe interpretar la ausencia de atributo con las siguientes palabras reservadas: #REQUIREDestamos indicando que es obligatorio colocar un valor en el atributo. #IMPLIED, indicamos que el valor para ese atributo es opcional, puede tener o no tener. #FIXED, estamos fijando el valor del atributo y el documento no será válida si a ese atributo le damos un valor diferente al especificado. Escribiendo nuestras propias DTD Vamos a escribir unas DTD complejas que nos servirán de ejemplo para futuros desarrollos. Cada una se corresponderá con un tipo de documento, de los que distinguiremos cuatro, por lo que trabajaremos con cuatro DTD diferentes. Tres las elaboraremos nosotros: articulo.dtd bookmark.dtd novedades.dtd y una cuarta, que nos permitirá escribir las FAQs; utilizaremos la QAML.dtd, que ya está desarrollada. En la próxima unidad empezaremos describiendo en detalle el proceso de elaboración de una DTD para escribir artículos y, en los siguientes, explicaremos de forma más breve el resto de las DTD. DTD de artículos En la elaboración de una DTD podemos diferenciar tres pasos: El proceso de abstracción de los elementos que forman un tipo de documento y las relaciones que existen entre ellos. Plasmación de este proceso de abstracción en una DTD. Validación de la DTD y verificación práctica de que se ajusta a nuestras necesidades. Estructura lógica del tipo de documento artículo
La primera parte es sin duda alguna la más complicada y posiblemente la más importante. Es el momento en el cual vamos a estructurar la información que luego representaremos mediante una DTD. No es un problema de conocer el XML o de saber las DTD. Es sobretodo una cuestión de tener clara la información con la que vamos a trabajar, qué elementos la componen,qué características tienen y cómo vamos a organizarla. Un artículo a un nivel general está formado por dos partes bien diferenciadas: el contenido del artículo y la metainformación sobre el artículo. La metainformación no es más que la información relativa al contenido del documento, como su título, autor, tamaño del archivo, fecha de creación, historial de los cambios, palabras clave, y demás información asociada. En nuestro caso vamos a utilizar: título autor palabras clave resumen En esta parte podríamos poner mucha más información, toda la que creamos que nos puede hacer falta. Toda esta información nos puede resultar útil, por ejemplo,para la búsqueda y gestión de estos documentos. En la parte de contenido tendremos que identificar los elementos que nos permitan representar esos contenidos. Si tomamos como ejemplo este tutorial, que puede considerarse como una generalización de nuestro documento artículo, observamos que la información está organizada en bloques de texto (párrafos, listas, tablas) e imágenes. Y que además estos bloques están organizados estructuralmente en capítulos y subcapítulos Esta estructura para nuestros artículos será igual: representaremos la información mediante elementos párrafos, listas, imágenes, etc. y la organizaremos en subcapitulo1es y subsubcapitulo1es. En nuestro caso utilizaremos exactamente los siguientes elementos: párrafos
listas, tanto ordenadas como desordenadas imágenes código, ya que nuestros artículos (al menos en el ejemplo que desarrollamos) serán sobre temas informáticos. Y estructuralmente toda la información anterior podrá estar organizada en subcapitulo1es. También debemos tener en cuenta qué elementos pueden existir dentro de esos bloques de texto. Podríamos querer destacar parte del contenido del texto, porque es el nombre de una función o el nombre de un autor; podríamos querer poner referencias a otro documentos u otros direcciones, etc. En nuestro caso, utilizaremos exactamente los siguientes: Un elemento mediante el cual destacaremos parte del contenido Enlaces Hasta el momento ya hemos visto qué elementos pueden formar nuestro documento artículo y cómo
están organizados. Pero nos falta por ver un detalle muy importante: que propiedades tienen. Por ejemplo, tenemos el elemento imagen mediante el cual nos será posible incluir imágenes en nuestro artículo. Algunas propiedades posibles son: el fichero en el que se encuentra la imagen, qué dimensiones tendrá, cuál será su tamaño, etc. Nuestro ejemplo será sencillo, y los únicos elementos que tendrán propiedades serán los elementos enlace e imagen. El enlace tendrá una propiedad mediante la cual indicaremos la ubicación del recurso destino y otra mediante la cual describiremos el recurso. La imagen tendrá una propiedad mediante la cual indicaremos la ubicación del fichero que la contiene y otra mediante la cual describiremos el recurso. Representación en una DTD de esta estructura lógica Ya tenemos una representación abstracta de la estructura de un tipo de documento artículo y,por tanto,ya estamos en condiciones de escribir una DTD que represente dicha estructura. Lo primero es elegir el nombre del elemento raíz, que denominaremos articulo. Por tanto, el documento XML tendrá el siguiente aspecto: <articulo>... </articulo> y en nuestra DTD: <!ELEMENT articulo (metainfo, cuerpo)> donde indicaremos que está formado por los elementos metainfo y cuerpo obligatorios y en ese orden. El elemento metainfo estará formado por los elementos titulo, autor, pclave, y resumen. <!ELEMENT metainfo (titulo, autor, pclaves?, resumen?)> Donde indicaremos que los elementos pclaves y resumen son optativos. El contenido del elemento titulo sólo puede ser texto: <!ELEMENT titulo (#PCDATA)> El contenido del elemento autor serán los elementos nombre, email, url. De esta manera permitimos incluir más información sobre el autor del artículo, <!ELEMENT autor (nombre, email?, url?)>
aunque solo es obligatorio el elemento nombre. El contenido de estos tres elementos es simplemente texto: <!ELEMENT nombre (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ELEMENT url (#PCDATA)> El elemento pclaves, que no es obligatorio, tiene como contenido sólo texto: <!ELEMENT pclaves (#PCDATA)> Y el elemento resumen, que tampoco es obligatorio, está formado sólo por texto: <!ELEMENT resumen (#PCDATA)> A continuación pasamos a describir los elementos del elemento contenido, que identificaremos mediante la etiqueta cuerpo. El elemento cuerpo empezará por un elemento titulo seguido de subcapitulo1es, aunque puede ser que el autor comience el artículo por alguno de los elementos que hemos englobado como bloques de texto e imágenes. <!ELEMENT cuerpo (titulo, (para imagen lds lo codigo)*,subcapitulo1*)> Mediante el elemento para representaremos los párrafos. <!ELEMENT para (#PCDATA destacar enlace)*> Su contenido, además de texto, es el elemento destacar y enlace. Y el elemento imagen: <!ELEMENT imagen EMPTY> <!ATTLIST imagen direccion CDATA #REQUIRED> descripcion CDATA #REQUIRED> Será un elemento vacio. Sus características están determinadas en el valor de sus atributos: direccion, donde indicaremos la localización del fichero que contiene la imagen. Es obligatorio. descripcion, donde escribiremos una descripción de la imagen. Es obligatorio. Mediante el elemento lds indicamos las listas desordenadas las cuales pueden estar formadas por los elementos de entrada de lista o por otras listas: <!ELEMENT lds (il, (il lds lo)*)>
Y el elemento lo indicará listas ordenadas: <!ELMENT lo (il, (il lds lo)*)> Mediante el elemento il indicamos los elementos que forman la lista, y cuyo contenido es el siguiente: <!ELEMENT il (#PCDATA destacar enlace)*> Mediante el elemento codigo indicamos que lo que vamos a escribir es código. <!ELEMENT codigo (#PCDATA)> Su contenido sólo es texto. El artículo podrá estar dividido en subcapitulo1es. Vamos a limitar las subcapitulo1es posibles a dos niveles. Las de primer nivel las identificaremos mediante el elemento subcapitulo1 y las de segundo nivel mediante el elemento subcapitulo11. Aunque esta estructuración no es obligatoria. <!ELEMENT cuerpo (titulo, (para imagen lds lo codigo)*,subcapitulo1*)> <!ELEMENT subcapitulo1 (titulo, (para imagen lds lo codigo)*, subcapitulo11*)> <!ELEMENT subcapitulo11 (titulo, (para imagen lds lo codigo)*)> Las subcapitulo1es deben comenzar por el elemento titulo y van a estar identificadas de forma unívoca por un atributo id. <!ATTLIST subcapitulo1 id ID #REQUIRED> <!ELEMENT subcapitulo11 (titulo, (para imagen lds lo codigo)*)> <!ATTLIST subcapitulo11 id ID #REQUIRED Hay que tener claro que cuanto más identificados tengamos los elementos y más información tengamos sobre cada uno,mejor;.más acciones podremos realizar posteriormente sobre el documento. En nuestro caso,por sencillez, sólo identificaremos mediante un atributo de tipo ID las subcapitulo1es. Pero en los próximos capítulos, que veremos la DTD para escribirlas FAQS, o la DTD del WML,comprobaremos quw como todos los elementos están identificados mediante el atributo de ID. Y, por último, sólo nos faltan definir los elementos en línea que como ya hemos visto aparecen en los elementos para y il. Mediante el elemento destacar, resaltaremos texto. <!ELEMENT destacar (#PCDATA)>
Su contenido sólo puede ser texto. Mediante el elemento enlace podremos hacer referencia a un recurso externo. <!ELEMENT enlace (#PCDATA)> Su contenido sólo puede ser texto y será precisamente el ancla del enlace. Sus atributos coinciden con las del elemento imagen, teniendo la misma funcionalidad. <!ATTLIST imagen direccion CDATA #REQUIRED> descripcion CDATA #REQUIRED> DTD de bookmarks En este apartado vamos a escribir una DTD que nos permitirá estructurar y mantener en formato XML nuestras direcciones preferidas. Para hacernos una idea de los elementos que nos permiten definir una dirección podemos dar una vuelta por algunos de los buscadores más conocidos y observar qué información suelen presentar sobre una dirección. Si por ejemplo visitamos Altavista, observaremos que al presentarnos una dirección nos ofrece la siguiente información: Por tanto, una dirección la podríamos representar mediante los siguientes elementos: Título de la dirección URL de la dirección Descripción Idioma del contenido de la dirección. A los cuales nosotros añadiremos también un elemento valoración, que nos permitirá indicar nuestro criterio sobre una dirección. Un borrador de documento XML, mediante el cual representamos una dirección, podría ser: <direccion> <titulo>...</titulo>
<url>...</url> <descripcion>...</descripcion> <idioma>...</idioma> <valoracion>...</valoracion> </direccion> Y ordenándolo un poco: <direccion idioma="" valoracion=""> <titulo>...</titulo> <url>...</url> <descripcion>...</descripcion> </direccion> Ejercicio: Escribir DTD para el elemento direccion. Escribir una pequeña DTD que se ajuste al XML anterior. Teniendo en cuenta que: El contenido de los elementos titulo, url y descripcion: Sólo pueden ser texto. Tienen que aparecer en ese orden. Y el único elemento no obligatorio es la descripción. Los atributo idioma son obligatorios. El atributo valoracion sólo puede tener valores entre 1 y 5 y por defecto su valor es 1. El atributo idioma sólo puede tener los valores esp y ing. Solución: La solución es: <!ELEMENT direccion (titulo, url, descripcion?)> <!ATTLIST direccion valoracion (1 2 3 4 5) "1" idioma (esp ing) #REQUIRED> <!ELEMENT titulo (#PCDATA)> <!ELEMENT url (#PCDATA)> <!ELEMENT descripcion (#PCDATA)> Ahora lo que nos falta es crear unos elementos que nos permitan agrupar las direcciones en grupos (al estilo de las carpetas de Windows), de manera que las podamos tener ordenadas en conjuntos y subconjuntos. Es decir, de una forma similar a ésta: <bookmark> <titulo>mis direcciones favoritas</titulo> <descripcion>direcciones favoritas.</descripicion>...direcciones... <grupo id="deporte">
<titulo>deportes</titulo>...direcciones... <grupo id="futbol"> <titulo>futbol</titulo>...direcciones... </grupo> </grupo>...direcciones <bookmark> Ejercicio: Escribir la DTD de bookmarks Ampliar la mini DTD que hemos escrito para una dirección, de manera que nos permita agrupar las direcciones en grupos y subgrupos al estilo del Explorador de Windows. Solución: El elemento raíz se llamara bookmark y está formado por los siguiente elementos: Un elemento metainfo al estilo de la DTD de artículos. Por un elemento titulo. Por un elemento descripcion optativo que sólo puede aparecer una vez. Y a continuación aparecerán direcciones o grupos de direcciones. Las carpetas se llamarán grupo y podran contener otros elementos grupo y por supuesto direcciones. Cada grupo tendrá un atributo id que lo identifique de forma unívoca. Su primer elemento es el elemento titulo. Luego puede estar formado indistamente por direcciones o grupos de direcciones. Como mínimo, en el caso de que no tenga otro grupo, deberá tener al menos una dirección. Ésta sería la DTD: <!ELEMENT bookmark (metainfo,titulo,descripcion?,(direccion grupo)+)> <!--...Aqui va desarrollado el elemento metainfo... --> <!ELEMENT descripcion (#PCDATA)> <!ELEMENT grupo (titulo,(direccion grupo)+)> <!ATTLIST grupo id ID #REQUIRED> <!ELEMENT direccion (titulo, url, descripcion?)> <!ATTLIST direccion valoracion (1 2 3 4 5) "1" idioma (esp ing) #REQUIRED> <!ELEMENT url (#PCDATA)> DTD completa
Mínimo XML para la DTD de bookmarks Escribir el documento XML mínimo que se ajuste a la DTD para "bookmarks". Solución: Sólo tenemos que fijarnos en los elementos de la DTD que sean obligatorios. <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE bookmark SYSTEM "bookmark.dtd"> <bookmark> <metainfo> <titulo>mis direcciones favoritas</titulo> <autor> <nombre>joaquin Bravo Montero</nombre> </autor> </metainfo> <titulo>mis direcciones favoritas</titulo> <direccion idioma="esp"> <titulo>programacion en castellano</titulo> <url>http://www.programacion.net</url> </direccion> </bookmark> NOTA: Visualizar el documento XML, por ejemplo en el IE5 y observar qué pasa con el atributo valoracion. minimobookmark.xml Bookmark en XML sobre el tema seleccionado. Escribir en XML un documento bookmark sobre el tema seleccionado. Solución: En el bookmark se recogen interesantes direcciones sobre WML y WAP. La DTD de novedades Mediante esta DTD crearemos los documentos XML en los que registraremos las novedades que se vayan produciendo en nuestro web. En cada novedad indicaremos: El título de la novedad La url La fecha Y una breve descripción Ejercicio: DTD para las novedades
Escribir una DTD que nos permita escribir en un documento XML las novedades que se produzcan en nuestro web. Solución: Una DTD para escribir novedades podría ser perfectamente: <!ELEMENT novedades (novedad+)> <!ELEMENT novedad (titulo, url, descripcion?)> <!ATTLIST novedad fecha CDATA #REQUIRED> <!ELEMENT titulo (#PCDATA)> <!ELEMENT url (#PCDATA)> <!ELEMENT descripcion (#PCDATA)> novedades.dtd Ejercicio: Documento XML de novedades Escribir un documento XML que se ajuste a la DTD de novedades. Solución: Este es el documento XML de novedades de mi web sobre WML DTD. Entidades Hasta el momento hemos asociado un documento XML con un único fichero, pero esto no tiene porque ser así. El XML nos permite organizar el contenido de un documento XML de forma mucho más flexible. Por ejemplo,si tenemos un libro en formato XML éste no tiene porque incluirse en un único fichero;si queremos, cada capítulo puede estar en un fichero. Lo que permite esta flexibilidad se denomina entidad. Una entidad es una unidad de almacenamiento que puede contener cualquier cosa: desde una cadena de caracteres hasta un fichero,un gráfico,y que,por tanto,nos permite dividir el documento XML en varios objetos de almacenamiento.después la aplicación XML que tenga que trabajar con ese documento XML tratará ese conjunto de objetos como un único objeto XML. Las ventajas que las entidades nos proporcionan son evidentes: Facilita la creación y el mantenimiento de documentos XML, al permitirnos trabajar sobre partes de éstos. Permite que varias personas trabajen sobre diferentes partes de un documento XML. Reusabilidad. Estas entidades pueden ser utilizadas en otros documentos XML. etc.
.DTD. Entidades Todas las declaraciones de entidades,independientemente del tipo que sean, utilizan la misma sintaxis: <!ENTITY nombre "contenido"> donde nombre es el identificador de la entidad y el contenido es su contenido o una referencia a éste..tipos de Entidades Debido a que las entidades XML pueden hacer tantas cosas, existen muchas variedades de entidades. Esto no significa que existan siete u ocho tipos diferentes con nombre sencillos. Existen tres propiedades que definen el tipo: Dependiendo de si la entidad debe ser analizada o no por el parser, una entidad se puede clasificar como analizada o no analizada. Dependiendo de si el contenido de la entidad es interno o externo es decir de si su contenido aparece en la declaración o no, la entidad se puede clasificar como interna o externa. Dependiendo de si se utiliza en la DTD o en el documento se clasifica como paramétrica o general. Pero las entidades pueden pertenecer a varios de estos tipos y, por ejemplo, tener una entidad general interna analizada. Las posiblidades de combinación son, por tanto ocho, pero tres de ellas imposibles, por lo que el número de entidades posible es cinco. Entidad general interna analizada. Entidad general externa analizada. Entidad general externa no analizada. Entidad parámetro interna. Entidad parámetro externo. En principio puede parecer un poco complicado, pero veamos cada caso por separado con algunos ejemplos concretos y vereis que en el fondo todo es muy sencillo..entidad general interna analizada. Son las más sencillas de todas y son básicamente abreviaturas totalmente definidas en la sección de declaración de tipo de documento.
En este ejemplo, <?xml version="1.0"?> <!DOCTYPE ejemplo [ <!ENTITY nomclub "Club de Usuarios de Internet"> ]> <ejemplo> En el &nomclub; realizamos cursos sobre Internet. </ejemplo> declaramos la entidad nomclub en la línea: <!ENTITY nomclub "Club de Usuarios de Internet"> y luego la utilizamos colocando el nombre de la entidad entre los símbolos & y ; La consecuencia de su utilización es que cuando el parser lea el documento cambiará la llamada a la entidad &nomclub; Esta entidad es: General al ser definida en un documento XML. Interna al aparecer su contenido en la declaración. Este tipo de entidades es muy utilizado también cuando es necesario emplear algún carácter que el juego de caracteres que hemos definido en el atributo encoding de la declaración XML no soporta. Por ejemplo, si quisiéramos colocar el símbolo del copyright podriamos hacerlo de la siguiente mamera: <?xml version="1.0"?> <!DOCTYPE ejemplo [ <!ENTITY copy " "> ]> <ejemplo> Ciberaula. </ejemplo>.entidad general externa analizada En este caso la declaración no lleva implícito el contenido de la entidad. Lleva un identificador externo que indicará a la aplicación XML dónde se encuentra el contenido de la entidad. Este identificador externo es la palabra SYSTEM seguida de la dirección (URI) donde se encuentra el recurso. <?xml version="1.0"?> <!DOCTYPE libro [ <!ENTITY capitulo1 SYSTEM "capitulo1.xml">
]> <libro> &capitulo1; </libro> En este ejemplo, si el contenido del documento capitulo1.xml es: <?xml version="1.0"?> <capitulo> <para>este es el primer capitulo</para> </capitulo> Las posibilidades de esta forma de trabajar son enormes, ya que: Esta misma entidad podría ser utilizada desde múltiples documentos XML. Permite que diferentes autores desarrollen diferentes partes de un documento XML de forma independiente,no teniéndose que preocupar del conjunto del documento XML. Ejercicio: Reescritura de XML Volver a escribir el XML de bookmarks,de manera que cada dirección sea una entidad externa. Ejercicio: Tenemos que definir cada direccion en un fichero XML y luego en la declaración XML indicar dónde se encuentran estos ficheros. En el ejemplo sobre direcciones de WML y WAP, el fichero XML quedaría de la siguiente manera: <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE bookmark SYSTEM "bookmark.dtd" [ <!-- Metainformacion --> <!ENTITY meta SYSTEM "wapdev_meta.xml"> <!-- Direcciones --> <!ENTITY wapfacil SYSTEM "wapdev/wapfacil.xml"> <!ENTITY wmlclub SYSTEM "wapdev/wmlclub.xml"> <!ENTITY asphtml SYSTEM "wapdev/asphtml.xml"> <!ENTITY cestacompra SYSTEM "wapdev/cestacompra.xml"> ]> <bookmark> &meta; <titulo>información general sobre WAP</titulo> <descripcion>recopilación de direcciones sobre WAP y WML.</descripcion> <grupo id="doc-portales"> <titulo>tutoriales</titulo> &wapfacil; &wmlclub;
</grupo> <grupo id="articulos"> <titulo>artículos</titulo> &asphtml; &cestacompra; </grupo> Los nuevos ficheros XML con las direcciones han sido creados en el subdirectorio wapdev. Fijaros que también se ha definido fuera el elemento metainfo Hay que destacar que para el parser de XML sigue siendo una única entidad. Fijaros como el IE5 lo muestra completo..entidad parámetro Como ya hemos dicho,las entidades XML se clasifican según puedan usarse en una DTD o en el documento. Las entidades que sólo pueden utilizarse en la DTD se denominan entidades parametro. Están diseñadas para contener listas de atributos y modelos de contenido. Nos ayudarán a organizar y agilizar la creación de las DTD, y hacerla más eficiente y consistente. Si nos fijamos en la DTD de artículos existen,elementos con un modelo de contenido idéntico en su totalidad o parte de éste. Por ejemplo los elementos cuerpo, seccion y seccion1 <!ELEMENT cuerpo (titulo, (para imagen lds lo codigo)*,seccion*)> <!ELEMENT seccion (titulo, (para imagen lds lo codigo)*, seccion1*)> <!ATTLIST seccion id ID #REQUIRED> <!ELEMENT seccion1 (titulo, (para imagen lds lo codigo)*)> tienen en común. (para imagen lds lo codigo)* Lo que nos permiten las entidades paramétrícas es definir este modelo de contenido como una entidad y luego hacer referencia a ella tantas veces como sea necesario. De esta manera si necesitamos modificar estos elementos, tendremos que hacerlo sólo una vez, en un único lugar, y no tener que ir elemento por elemento realizando la modificación. Las entidades paramétricas tienen un identificador especial en su declaración que las diferencia de las generales. Este indicador es el símbolo de tanto por ciento (%), y se usa precediendo al nombre. <!ENTITY % nombre "contenido">
También cambia la forma de referenciarla. En lugar de colocar el nombre entre el & y ; se coloca entre % y el ;. Por tanto, en nuestro ejemplo podemos crear la siguiente entidad paramétrica: <!ENTITY % bloques "para imagen lds lo codigo"> y describir el modelo de contenidos de los elementos cuerpo, seccion y seccion1 de la siguiente manera: <!ELEMENT cuerpo (titulo, (%bloques;)+,seccion*)> <!ELEMENT seccion (titulo, (%bloques;)+, seccion1*)> <!ATTLIST seccion id ID #REQUIRED> <!ELEMENT seccion1 (titulo, (%bloques;)+)> Esto también lo podemos hacer con listas de atributos. Por ejemplo, los elementos imagen y enlace tienen los mismos atributos. <!ATTLIST imagen direccion CDATA #REQUIRED descripcion CDATA #REQUIRED> Por tanto, podríamos definir esta lista de atributos dentro de una entidad paramétrica. Ejercicio: Reescribir la DTD de artículos utilizando entidades. Reescribir la DTD de artículos redefiniendo modelos de contenidos y listas de atributos iguales como entidades paramétricas. Solución: Creamos una entidad bloques para declarar el modelo de contenido que se repite en los elementos cuerpo, seccion y seccion1. <!ENTITY % bloques "para imagen lds lo codigo"> Creamos una entidad enlinea para declarar el modelo de contenido que se repite en los elementos para y il. <!ENTITY % enlinea "enlace destacar"> Y creamos una entidad att.elementos.enlace para declarar la lista de atributos que se repite en los elementos enlace e imagen. <!ENTITY % att.elementos.enlace " direccion CDATA #REQUIRED descripcion CDATA #REQUIRED">
Por tanto, la declaración de estos elementos quedará de la siguiente manera: <!ELEMENT cuerpo (titulo, (%bloques;)+,seccion*)> <!ELEMENT seccion (titulo, (%bloques;)+, seccion1*)> <!ELEMENT seccion1 (titulo, (%bloques;)+)> <!ELEMENT para (#PCDATA %enlinea;)*> <!ELEMENT il (#PCDATA %enlinea;)*> <!ATTLIST imagen %att.elementos.enlace;> <!ATTLIST enlace %att.elementos.enlace;> DTD completa Hasta el momento sólo hemos visto entidades paramétricas internas, pero también pueden ser externas. Esto nos permitirá crear las DTD entidades que podamos utilizar en varias DTD sin necesidad de reescribirlas. Por ejemplo, la DTD de artículos y de bookmark tienen en común el elemento metainfo. Entonces podemos definir su modelo de contenido como una entidad paramétrica externa, de manera que sólo tengamos que referenciarla desde ambas DTD en lugar de tener que declarar todo el elemento en ambas. Ejercicio: Definir una entidad paramétrica externa Redefinir el elemento metainfo en la DTD de artículos y bookmark como entidad paramétrica externa. Solución: Creamos un archivo metainformación. metainfo.dtd en el que declaramos los elementos que describen la <!ELEMENT metainfo (titulo, autor, pclaves?, resumen?)> <!ELEMENT titulo (#PCDATA)> <!ELEMENT autor (nombre, email?, url?)> <!ELEMENT nombre (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ELEMENT pclaves (#PCDATA)> <!ELEMENT resumen (#PCDATA)> Y luego en la DTD de artículos y bookmark borramos las declaraciones de estos elementos y declaramos una entidad paramétrica externa de la siguiente manera: <!ENTITY % metainfo SYSTEM "metainfo.dtd"> %metainfo;
DTD existentes Hay infinidad de vocabularios XML, y muchos de ellos son el resultado del trabajo de los mejores técnicos de algunas de las mayores compañías del mercado, como Microsoft, Oracle, IBM, etc. Estas organizaciones disponen de una gran cantidad de recursos y la motivación suficiente para crear vocabularios de calidad y bien diseñados. Por lo tanto tiene sentido prestar atención a los mecanismos que utilizan para poner en marcha sus propias DTD. Sobre todo prestaremos atención a la QAML.dtd, una DTD escrita por Rick Jelliffe del Centro de Computación de la Academia Sinica de Taipei en Taiwan y que utilizaremos para escribir una FAQ de ejemplo..otras DTDs Sólo estudiaremos unas cuantas DTDs, pero serán más que suficientes para ver cómo el uso de los vocabularios XML se está generalizando en todos los campos de la informática. Pero esto sólo es la punta del iceberg: hay mucho más y habrá mucho más; aunque tampoco es una cuestión de cantidad. Una de las bases del éxito del XML será que algunas de estas DTD se estandarice y su uso se generalice. Para estar al día sobre los vocabularios XML que existen y los que aparecerán os recomiendo que visitéis las siguientes direcciones: SHEMA.NET mantenida por James Tauber XML.ORG DTD.COM