DTD: Definición de Tipo de
DocumentoUna DTD es un documento que define la estructura de un documento XML: los elementos, atributos, entidades, notaciones, etc, que pueden aparecer, el orden y el número de veces que pueden aparecer, cuáles pueden ser hijos de cuáles, etc. El procesador XML utiliza la DTD para verificar si un documento es válido, es decir, si el documento cumple las reglas del DTD.
Volver al principio de la página
La DTD que debe utilizar el procesador XML para validar el documento XML se indica mediante la etiqueta DOCTYPE. La DTD puede estar incluida en el propio documento, ser un documento externo o combinarse ambas.
<!DOCTYPE nombre [ ... declaraciones ... ]>
<!DOCTYPE nombre SYSTEM "uri">
Se puede combinar una DTD externa con una DTD interna, con la siguiente sintaxis:
<!DOCTYPE nombre SYSTEM "uri" [ ... declaraciones ... ]>
<!DOCTYPE nombre PUBLIC "fpi" "uri">
Se puede combinar una DTD externa con una DTD interna, con la siguiente sintaxis:
<!DOCTYPE nombre PUBLIC "fpi" "uri" [ ... declaraciones ... ]>
En todos estos casos:
Volver al principio de la página
Las DTDs describen la estructura de los documentos XML mediante declaraciones. Hay cuatro tipos de declaraciones:
Una entidad consiste en un nombre y su valor (son similares a las constantes en los lenguajes de programación). Con algunas excepciones, el procesador XML sustituye las referencias a entidades por sus valores antes de procesar el documento. Una vez definida la entidad, se puede utilizar en el documento escribiendo una referencia a la entidad, que empieza con el caracter "&", sigue con el nombre de la entidad y termina con ";". (es decir, &nombreEntidad;)
Las entidades pueden ser internas o externas y tanto unas como otras pueden ser generales o paramétricas.
Las declaraciones de entidades internas (generales) siguen la siguiente sintaxis:
<!ENTITY nombreEntidad "valorEntidad">
En las declaraciones de entidades externas (generales) se distinguen dos casos:
La entidad puede ser una entidad de sistema, con la siguiente sintaxis:
<!ENTITY nombreEntidad SYSTEM "uri">
o puede ser una entidad pública, con la siguiente sintaxis:
<!ENTITY nombreEntidad PUBLIC "fpi" "uri">
La entidad puede ser una entidad de sistema, con la siguiente sintaxis:
<!ENTITY nombreEntidad SYSTEM "uri" NDATA tipo>
o puede ser una entidad pública, con la siguiente sintaxis:
<!ENTITY nombreEntidad PUBLIC "fpi" "uri" NDATA tipo>
En todos estos casos:
Las declaraciones de entidades paramétricas siguen la mismas sintaxis que las generales, pero llevan el caracter "%" antes del nombre de la entidad. Por ejemplo:
<!ENTITY % nombreEntidad "valorEntidad">
<!ENTITY % nombreEntidad SYSTEM "uri">
<!ENTITY % nombreEntidad SYSTEM "uri" NDATA tipo>
La diferencia entre entidades generales y paramétricas es que las entidades paramétricas se sustituyen por su valor en todo el documento (incluso en la propia declaración de tipo de documento) mientras que las generales no se sustituyen en la declaración de tipo de documento.
Volver al principio de la página
Las notaciones se usan en XML para definir las entidades externas que no va a analizar en procesador XML (aunque sí lo hará la aplicación que trate un documento). Para hacer referencia estas entidades no se utiliza la notación habitual (&nombreEntidad;), sino que se utiliza el nombre de la entidad directamente.
Volver al principio de la página
Las declaraciones de los elementos siguen la siguiente sintaxis:
<!ELEMENT nombreElemento (contenido)>
en la que "nombreElemento" es el nombre del elemento, y "(contenido)" una expresión que describe el contenido del elemento.
Para definir el contenido del elemento se pueden utilizar los términos EMPTY, (#PCDATA) o ANY o escribir expresiones más complejas:
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo EMPTY> ]> |
|
|
<ejemplo></ejemplo> |
|
<ejemplo /> |
|
<ejemplo>Esto es un ejemplo</ejemplo> <!-- No es correcto porque contiene texto --> |
|
<ejemplo><a></a></ejemplo> <!-- No es correcto porque contiene un elemento <a> --> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo (#PCDATA)> ]> |
|
|
<ejemplo /> |
|
<ejemplo>Esto es un ejemplo</ejemplo> |
|
<ejemplo><a></a></ejemplo> <!-- No es correcto porque contiene un elemento <a> --> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo ANY> ]> |
|
|
<ejemplo /> |
|
<ejemplo>Esto es un ejemplo</ejemplo> |
|
<ejemplo><a></a></ejemplo> |
Para escribir expresiones más complejas, se pueden utilizar los conectores y modificadores siguientes:
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo (a, b)> <!ELEMENT a EMPTY> <!ELEMENT b EMPTY> ]> |
|
|
<ejemplo><a /><b /></ejemplo> |
|
<ejemplo><a /><b /><c /></ejemplo> <!-- No es correcto porque contiene un elemento <c /> --> |
|
<ejemplo><a /></ejemplo> <!-- No es correcto porque falta el elemento <b /> --> |
|
<ejemplo><b /><a /></ejemplo> <!-- No es correcto porque el orden no es correcto --> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo (a | b)> <!ELEMENT a EMPTY> <!ELEMENT b EMPTY> ]> |
|
|
<ejemplo><a /></ejemplo> |
|
<ejemplo><b /></ejemplo> |
|
<ejemplo><a /><b /></ejemplo> <!-- No es correcto porque están los dos elementos --> |
|
<ejemplo></ejemplo> <!-- No es correcto porque no hay ningún elemento --> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo (a, b?)> <!ELEMENT a EMPTY> <!ELEMENT b EMPTY> ]> |
|
|
<ejemplo><a /></ejemplo> |
|
<ejemplo><a /><b /></ejemplo> |
|
<ejemplo><b /></ejemplo> <!-- No es correcto porque falta el elemento <a /> --> |
|
<ejemplo><b /><b /></ejemplo> <!-- No es correcto porque el elemento <b /> aparece dos veces --> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo (a*, b)> <!ELEMENT a EMPTY> <!ELEMENT b EMPTY> ]> |
|
|
<ejemplo><b /></ejemplo> |
|
<ejemplo><a /><b /></ejemplo> |
|
<ejemplo><a /><a /><b /></ejemplo> |
|
<ejemplo><b /><a /></ejemplo> <!-- No es correcto porque el elemento <a /> aparece después de <b /> --> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo (a+, b)> <!ELEMENT a EMPTY> <!ELEMENT b EMPTY> ]> |
|
|
<ejemplo><a /><b /></ejemplo> |
|
<ejemplo><a /><a /><b /></ejemplo> |
|
<ejemplo><b /></ejemplo> <!-- No es correcto porque falta el elemento <a /> --> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo (a, (a|b))> <!ELEMENT a EMPTY> <!ELEMENT b EMPTY> ]> |
|
|
<ejemplo><a /><a /></ejemplo> |
|
<ejemplo><a /><b /></ejemplo> |
|
<ejemplo><a /></ejemplo> <!-- No es correcto porque falta el elemento <a /> o <b /> --> |
Volver al principio de la página
Una declaración de atributos sigue la siguiente sintaxis:
<!ATTLIST nombreElemento nombreAtributo tipoAtributo valorInicialAtributo >
en la que:
Para definir varios atributos de un mismo elemento, se puede utilizar una o varias declaraciones de atributos. Los siguientes ejemplos son equivalentes:
<!ATTLIST nombreElemento nombreAtributo1 tipoAtributo1 valorInicialAtributo1> <!ATTLIST nombreElemento nombreAtributo2 tipoAtributo2 valorInicialAtributo2>
<!ATTLIST nombreElemento nombreAtributo1 tipoAtributo1 valorInicialAtributo1 nombreAtributo2 tipoAtributo2 valorInicialAtributo2 >
Los tipos de atributos son los siguientes:
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo EMPTY> <!ATTLIST ejemplo color CDATA #REQUIRED> ]> |
|
|
<ejemplo></ejemplo> <!-- No es correcto porque falta el atributo "color" --> |
|
<ejemplo color=""></ejemplo> |
|
<ejemplo color="amarillo"></ejemplo> |
|
<ejemplo color="azul marino #000080"></ejemplo> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo EMPTY> <!ATTLIST ejemplo color NMTOKEN #REQUIRED> ]> |
|
|
<ejemplo color=""></ejemplo> |
|
<ejemplo color="azul-marino"></ejemplo> |
|
<ejemplo color="1"></ejemplo> |
|
<ejemplo color="azul marino"></ejemplo> <!-- No es correcto porque hay un espacio en blanco --> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo EMPTY> <!ATTLIST ejemplo color NMTOKENS #REQUIRED> ]> |
|
|
<ejemplo color=""></ejemplo> |
|
<ejemplo color="1"></ejemplo> |
|
<ejemplo color="azul marino"></ejemplo> |
|
<ejemplo color="2*2"></ejemplo> <!-- No es correcto porque hay un asterisco --> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo EMPTY> <!ATTLIST ejemplo color (azul|blanco|rojo) #REQUIRED> ]> |
|
|
<ejemplo color=""></ejemplo> |
|
<ejemplo color="azul"></ejemplo> |
|
<ejemplo color="verde"></ejemplo> <!-- No es correcto porque "verde" no está en la lista de valores --> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo (libro*)> <!ELEMENT libro (#PCDATA) > <!ATTLIST libro codigo ID #REQUIRED> ]> |
|
|
<ejemplo> <libro codigo="L1">Poema de Gilgamesh</libro> <libro codigo="L2">Los preceptos de Ptah-Hotep</libro> </ejemplo> |
|
<ejemplo> <libro codigo="1">Poema de Gilgamesh</libro> <!-- No es correcto porque el valor de un atributo de tipo ID no puede empezar con un número --> <libro codigo="L2">Los preceptos de Ptah-Hotep</libro> </ejemplo> |
|
<ejemplo> <libro codigo="L1">Poema de Gilgamesh</libro> <libro codigo="L1">Los preceptos de Ptah-Hotep</libro> <!-- No es correcto porque el valor "L1" ya se ha utilizado --> </ejemplo> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo ((libro|prestamo)*)> <!ELEMENT libro (#PCDATA) > <!ATTLIST libro codigo ID #REQUIRED> <!ELEMENT prestamo (#PCDATA) > <!ATTLIST prestamo libro IDREF #REQUIRED> ]> |
|
|
<ejemplo> <libro codigo="L1">Poema de Gilgamesh</libro> <prestamo libro="L1">Numa Nigerio</prestamo> </ejemplo> |
|
<ejemplo> <libro codigo="L1">Poema de Gilgamesh</libro> <prestamo libro="L2">Numa Nigerio</prestamo> <!-- No es correcto porque el valor "L2" no es ID de ningún elemento --> </ejemplo> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo ((libro|prestamo)*)> <!ELEMENT libro (#PCDATA) > <!ATTLIST libro codigo ID #REQUIRED> <!ELEMENT prestamo (#PCDATA) > <!ATTLIST prestamo libro IDREFS #REQUIRED> ]> |
|
|
<ejemplo> <libro codigo="L1">Poema de Gilgamesh</libro> <libro codigo="L2">Los preceptos de Ptah-Hotep</libro> <prestamo libro="L1 L2">Numa Nigerio</prestamo> </ejemplo> |
|
<ejemplo> <libro codigo="L1">Poema de Gilgamesh</libro> <libro codigo="L2">Los preceptos de Ptah-Hotep</libro> <prestamo libro="L3">Numa Nigerio</prestamo> <!-- No es correcto porque el valor "L3" no es ID de ningún elemento --> </ejemplo> |
Los valores iniciales de los atributos son los siguientes:
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo EMPTY> <!ATTLIST ejemplo color CDATA #REQUIRED> ]> |
|
|
<ejemplo></ejemplo> <!-- No es correcto porque falta el atributo "color" --> |
|
<ejemplo color=""></ejemplo> |
|
<ejemplo color="amarillo"></ejemplo> |
|
<ejemplo color="azul marino #000080"></ejemplo> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo EMPTY> <!ATTLIST ejemplo color CDATA #IMPLIED> ]> |
|
|
<ejemplo></ejemplo> |
|
<ejemplo color=""></ejemplo> |
|
<ejemplo color="amarillo"></ejemplo> |
|
<ejemplo color="azul marino #000080"></ejemplo> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo EMPTY> <!ATTLIST ejemplo color CDATA #FIXED "verde"> ]> |
|
|
<ejemplo></ejemplo> |
|
<ejemplo color=""></ejemplo> <!-- No es correcto porque el atributo "color" no tiene el valor "verde" --> |
|
<ejemplo color="amarillo"></ejemplo> <!-- No es correcto porque el atributo "color" no tiene el valor "verde" --> |
|
<ejemplo color="verde"></ejemplo> |
<!DOCTYPE ejemplo [ <!ELEMENT ejemplo EMPTY> <!ATTLIST ejemplo color CDATA "verde"> ]> |
|
|
<ejemplo></ejemplo> |
|
<ejemplo color=""></ejemplo> |
|
<ejemplo color="amarillo"></ejemplo> |
|
<ejemplo color="verde"></ejemplo> |
Volver al principio de la página
Esta página forma parte del curso "XML: Lenguaje de Marcas Extensible" disponible en http://www.mclibre.org
Esta obra está bajo una licencia de Creative
Commons.