El DTD que hemos definido hasta ahora esta bien para usarlo con el analizador sin validaci�n. Dice d�nde se espera el texto y d�nde no, que es a todo lo que el analizador sin validaci�n le va a prestar atenci�n. Pero para usarlo con el analizador con validaci�n, el DTD necesita especificar los atributos v�lidos para los diferentes elementos. Haremos esto en esta p�gina, despu�s de definir una entidad interna y una entidad externa que podamos referenciar en nuestro fichero XML.
�Definir Atributos en el DTD
Empecemos definiendo los atributos para los elementos de la presentaci�n de diapositivas.
|
Nota:
El XML escrito en esta secci�n est� en slideshow1b.dtd. |
A�adimos el texto en negrita de abajo para definir los atibutos del elemento slideshow.
<!ELEMENT slideshow (slide+)>
<!ATTLIST slideshow
title CDATA #REQUIRED
date CDATA #IMPLIED
author CDATA "unknown"
>
<!ELEMENT slide (title, item*)>
La etiqueta DTD ATTLIST empieza la serie de definici�n de atributos. El nombre que sigue a ATTLIST especifica el elemento para el que se est�n definiendo atributos. En este caso, el elemento es slideshow.
Cada atributo est� definido por una serie de tres valores separados por espacios. Las comas u otros separadores no est�n permitidos. El primer elemento de cada l�nea es el nombre del atributo: title, date, o author, en este caso. El segundo elemento indica el tipo de dato: CDATA son datos de tipo caracter -- datos sin analizar. La siguiente tabla representa las opciones v�lidas para el tipo de atributo.
| Tipo de Atributo | Especifica... |
|---|---|
| (valor1 | valor2 | ...) | Una lista de valores separados por barras verticales. (ejemplo abajo) |
| CDATA | "Datos caracter sin analizar". (Para gente normal, una cadena de texto.) |
| ID | Un nombre que no comparte otro ID de atributo. |
| IDREF | Una referencia a un ID definido en alg�n lugar del documento. |
| IDREFS | Una lista separada por espacios que contiene una o m�s referencias ID. |
| ENTITY | El nombre de una entidad definida en el DTD. |
| ENTITIES | Una lista de entidades separada por espacios. |
| NMTOKEN | Un nombre v�lido XML compuesto por letras, n�meros, guiones, subrayados y dos puntos. |
| NMTOKENS | Una lista de nombres separados por espacios. |
| NOTATION | El nombre de una notaci�n DTD especificada, que describe un formato de datos no XML, como aquellos usados para ficheros de imagenes.* |
| * Esta es una especificaci�n r�pidamente obsoleta que se explicar� en dellate al final de esta secci�n. |
|---|
Cuando el tipo de atributo consiste en una lista entre par�ntesis de opciones separadas por una barra vertical, el atributo debe usar uno de los valores especificados. Por ejemplo, si a�adimos el texto en negrita de abajo al DTD.
<!ELEMENT slide (title, item*)>
<!ATTLIST slide
type (tech | exec | all) #IMPLIED
>
<!ELEMENT title (#PCDATA)>
<!ELEMENT item (#PCDATA | item)* >
Esta especificaci�n dice que el atributo type de los elementos slide deben ser un type="tech", type="exec", o type="all". No se acepta ning�n otro valor. (Los editores XML que se preocupan del DTD pueden usar dichos especificadores para presentar una lista desplegable de opciones.)
La �ltima entrada en la especificaci�n del atributo determina el valor por defecto, si existe, y dice si el atibuto es requerido o no. La siguiente tabla muestra las posibles opciones.
| Especificaci�n | Especifica... |
|---|---|
| #REQUIRED | El valor del atributo se debe especificar en el documento. |
| #IMPLIED | El valor necesario no ser� especificado en el documento. Si no es as�, la aplicaci�n tendr� un valor por defecto para usarlo. |
| "Valor por Defecto" | El valor por defecto a usar, si no se especifica un valor en el documento. |
| #FIXED"valorFijo" | El valor a usar. Si el documento especifica un valor, debe ser el mismo. |
�Definir Entidades en el DTD
Hasta ahora hemos visto entidades predefinidas como & y hemos visto que un atributo puede referenciar una entidad. Es hora de aprender a definir entiades por nosotros mismos.
|
Nota:
El XML definido aqu� est� en slideSample06.xml. Y la salida est� en Echo09-06.log. |
A�adimos el texto en negrita de abajo a la etiqueta DOCTYPE de nuestro fichero XML:
<!DOCTYPE slideshow SYSTEM "slideshow1.dtd" [ <!ENTITY product "WonderWidget"> <!ENTITY products "WonderWidgets"> ]>
El nombre de etiqueta ENTITY dice que estamos definiendo una entidad. Luego viene el nombre de la entidad y su definici�n. En este caso, estamos definiendo una entidad llamada "product" que tomara el espacio para el nombre del producto. M�s adelante cuando cambie el nombre del producto, s�lo tendremos que cambiar el nombre en un lugar, y todas nuestras slides reflejar�n el nuevo valor.
La �ltima parte es la cadena de sustituci�n que reemplazar� el nombre de la entidad siempre que sea referenciada en el documento XML. La cadena de sustituci�n se define entre comillas, que no se incluyen cuando el texto se inserta en el documento.
S�lo por buenas maneras, hemos definido dos versiones, una singular y otra plural, para que cuando los plurales sean irregulares podamos sustituirlos correctamente.
Ahora que tenemos las entidades definidas, el siguiente paso es referenciarlas en la aplicaci�n. Realizamos los cambios en negrita de abajo para hacer esto.
<slideshow
title="WonderWidget&product; Slide Show"
... <!-- TITLE SLIDE -->
<slide type="all">
<title>Wake up to WonderWidgets&products;!</title>
</slide>
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
<itdestacar>Why <destacar>WonderWidgets&products;</destacar> are great</itdestacar>
<item/>
<itdestacar>Who <destacar>buys</destacar> WonderWidgets&products;</itdestacar>
</slide>
Los puntos a observar aqu� son que las entidades que definimos son referenciadas con la misma s�ntaxis (&nombreEntidad;) que usamos para las entidades predefinidas, y que la entidad se puede referenciar en un valor de atributo y como contenido de un elemento.
�Mostrar las Referencias de Entidades
Cuando ejecutamos el programa Echo sobre esta versi�n del fichero, podemos ver esta clase de cosas:
ELEMENT: <title> CHARS: Wake up to CHARS: WonderWidgets CHARS: ! END_ELM: </title>
Observamos que la existencia de referencias de entidades generan una llamada extra al m�todo characters, y que el texto que vemos es el resultado de la sustituci�n.
�Entidades �tiles Adicionales
Aqu� hay otros tres ejemplos de definiciones de entidades que podr�an ser �tiles cuando escribimos documentos XML.
<!ENTITY ldquo "“"> <!-- Left Double Quote --> <!ENTITY rdquo "”"> <!-- Right Double Quote --> <!ENTITY trade "™"> <!-- Trademark Symbol (TM) --> <!ENTITY rtrade "®"> <!-- Registered Trademark (R) --> <!ENTITY copyr "©"> <!-- Copyright Symbol -->
�Referenciar Entidades Externas
Tambi�n podemos usar identificadores SYSTEM o PUBLIC con el nombre de la entidad que est� definida en un fichero externo.
|
Nota:
El XML definido aqu� est� en slideSample07.xml y en copyright.xml. La salida est� en Echo09-07.log. |
Para referenciar una entidad externa, a�adimos el texto en negrita de abajo a la sentencia DOCTYPE de nuestro documento XML:
<!DOCTYPE slideshow SYSTEM "slideshow.dtd" [ <!ENTITY product "WonderWidget"> <!ENTITY products "WonderWidgets"> <!ENTITY copyright SYSTEM "copyright.xml"> ]>
Esta definici�n referencia un mensaje de copyright contenido en un fichero llamado copyright.xml. Creamos el fichero, y ponemos algo interesante en �l, quiz�s algo como esto:
<!-- A SAMPLE copyright --> This is the standard copyright message that our lawyers make us put everywhere so we don't have to shell out a million bucks every time someone spills hot coffee in their lap...
Finalmente, a�adimos el texto en negrita de abajo a nuestro fichero slideSample.xml para referenciar la entidad externa:
<!-- TITLE SLIDE --> ... </slide> <!-- COPYRIGHT SLIDE --> <slide type="all"> <itdestacar>©right;</itdestacar> </slide>
Tambi�n podr�amos usar una declaraci�n de entidad externa para acceder a un servlet que produce la fecha actual usando una definici�n parecida a esta:
<!ENTITY currentDate SYSTEM
"http://www.example.com/servlet/CurrentDate?fmt=dd-MMM-yyyy">
Entonces podr�amos referenciar dicha entidad de la misma forma que cualquier otra:
Today's date is ¤tDate;.
�Mostrar la Entidad Externa
Cuando ejecutamos el programa Echo sobre nuestra ultima versi�n del fichero XML, podemos ver:
...
END_ELM: </slide>
ELEMENT: <slide
ATTR: type "all"
>
ELEMENT: <itdestacar>
CHARS:
This is the standard copyright message that our lawyers
make us put everywhere so we don't have to shell out a
million bucks every time someone spills hot coffee in their
lap...
END_ELM: </itdestacar>
END_ELM: </slide>
...
Observa que la nueva l�nea que sigue al comentario en el fichero es mostrada como un caracter, pero que el propio comentario es ignorado. Esta es la raz�n de que el mensaje de copyright parezca empezar en la siguiente l�nea despu�s de la etiqueta CHARS:, en lugar de empezar directamente despu�s de la etiqueta -- el primer caracter mostrado es realmente la nueva l�nea que sigue al comentario.
�Sumarizar las Entidades
Una entidad que es referencia en el contenido del documento, tanto si es interna como externa, es conocida como entidad general. Una entidad que contiene especificaciones DTD que est�n referenciadas desde dentro del DTD es conocida como una entidad de par�metro.
Una entidad que contiene XML (texto y marcas), y que por lo tanto es analizada, es conocida como una entidad analizada. Una entidad que contiene datos binarios (como im�genes) es conocida como una entidad sin analizar. (Pero como es natural, debe ser externa).