Un documento XML es válido si ha sido asociado a un documento de definición de tipos y si el documento cumple las restricciones expresadas en él. El documento de definición de tipos tiene que aparecer antes del primer elemento del documento. El nombre que sigue a DOCTYPE en el documento de definición de tipos debe ser el mismo que el nombre del elemento raíz.
Un documento puede contener únicamente el elemento raíz tutorial que contiene algún texto. :
<!ELEMENT tutorial (#PCDATA)>
Un documento válido que contiene algún texto.:
<!DOCTYPE tutorial SYSTEM "tutorial.dtd">
<tutorial>Este es un documento XML</tutorial>
Este documento también es válido.:
<!DOCTYPE tutorial SYSTEM "tutorial.dtd">
<tutorial/>
El elemento raíz no se adapta a la DTD dada.:
<!DOCTYPE tutorial SYSTEM "tutorial.dtd">
<text>Este es un documento XML</text>
Un tipo elemento puede contener otros elementos hijos. En este caso no podrá contener ningún texto sino tan solo elementos separados, opcionalmente, por espacios en blanco.
El elemento raíz XXX debe contener únicamente un elemento AAA seguido de otro elemento BBB. Los elementos AAA y BBB pueden contener texto pero no otros elementos:
<!ELEMENT XXX (AAA , BBB)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
Un documento válido que contiene algún texto:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA>Comienzo</AAA>
<BBB>Fin</BBB>
</XXX>
Este documento también es válido:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <AAA/> <BBB/> </XXX>
El elemento BBB no está:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <AAA/> ___ </XXX>
El elemento BBB debe seguir al elemento AAA:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <BBB/> <AAA/> </XXX>
El elemento raíz XXX sólo puede contener un elemento BBB:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <AAA/> <BBB/> <BBB/> </XXX>
El elemento raíz XXX no puede contener ningún texto.:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> Elements: <AAA/> <BBB/> </XXX>
Si el nombre de un elemento en una DTD va seguido por un asterisco [*], este elemento puede aparecer ninguna, una o varias veces.
El elemento raíz XXX puede contener ninguno, uno o varios elementos AAA seguido de exactamente un elemento BBB. El elemento BBB tiene que estar siempre presente.:
<!ELEMENT XXX (AAA* , BBB)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
Un documento válido:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <AAA/> <BBB/> </XXX>
Otro documento válido. El elemento AAA no es obligatorio.:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <BBB/> </XXX>
Más de un elemento AAA puede aparecer dentro del documento:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <BBB/> </XXX>
El elemento BBB no está:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> ___ </XXX>
El elemento BBB debe seguir al elemento AAA:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <BBB/> <AAA/> </XXX>
El elemento AAA no puede seguir a un elemento BBB:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <AAA/> <AAA/> <AAA/> <AAA/> <BBB/> <AAA/> <AAA/> </XXX>
Si el nombre de un elemento en una DTD está seguido por el caracter más [+], este elemento tiene que aparecer una o más veces.
El elemento raíz XXX debe contener uno o más elementos AAA seguidos de exactamente un elemento BBB. El elemento BBB tiene que estar siempre presente.:
<!ELEMENT XXX (AAA+ , BBB)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
Un documento válido:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <AAA/> <BBB/> </XXX>
Pueden aparecer varios elementos AAA en el documento:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <BBB/> </XXX>
Los elementos AAA y BBB no están:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> ___ ___ </XXX>
Al menos un elemento AAA tiene que estar presente.:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> ___<BBB/> </XXX>
El elemento BBB debe seguir al elemento AAA:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <BBB/> <AAA/> </XXX>
El elemento AAA no puede seguir al elemento BBB:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <AAA/> <AAA/> <AAA/> <AAA/> <BBB/> <AAA/> <AAA/> </XXX>
Si el nombre de un elemento en la DTD está seguido por un signo de interrogación [?], este elemento puede aparecer ninguna o una vez.
El elemento raíz XXX puede contener un elemento AAA seguido de exactamente un elemento BBB. El elemento BBB tiene que estar siempre presente.:
<!ELEMENT XXX (AAA? , BBB)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
Un documento válido:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <AAA/> <BBB/> </XXX>
El elemento AAA no es obligatorio:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <BBB/> </XXX>
El elemento BBB no está:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> ___ </XXX>
Como mucho sólo puede aparecer un elemento AAA dentro del documento:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <BBB/> </XXX>
El elemento BBB tiene que seguir al elemento AAA:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX> <BBB/> <AAA/> </XXX>
Este ejemplo usa una combinación de [ + * ?]
El elemento raíz XXX puede contener un elemento AAA seguido de uno o más elementos BBB. El elemento AAA puede contener un elemento CCC y varios elementos DDD. El elemento BBB tiene que contener, exactamente, un elemento CCC y un elemento DDD:
<!ELEMENT XXX (AAA? , BBB+)>
<!ELEMENT AAA (CCC? , DDD*)>
<!ELEMENT BBB (CCC , DDD)>
<!ELEMENT CCC (#PCDATA)>
<!ELEMENT DDD (#PCDATA)>
Un documento válido:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA>
<CCC/><DDD/>
</AAA>
<BBB>
<CCC/><DDD/>
</BBB>
</XXX>
Los elementos en AAA no son obligatorios:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA/>
<BBB>
<CCC/><DDD/>
</BBB>
</XXX>
El elemento AAA no puede ser omitido:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<BBB>
<CCC/><DDD/>
</BBB>
</XXX>
El elemento BBB tiene que contener elementos CCC y DDD:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA/>
<BBB/>
</XXX>
El elemento AAA puede contener como máximo un elemento CCC:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA>
<CCC/><CCC/>
<DDD/><DDD/>
</AAA>
<BBB>
<CCC/><DDD/>
</BBB>
</XXX>
Con el caracter [ | ] se puede seleccionar uno de entre varios elementos.
El elemento raíz XXX debe contener un elemento AAA seguido de un elemento BBB. El elemento AAA tiene que contener un elemento CCC seguido de un elemento DDD. El elemento BBB tiene que contener bien un elemento CCC o bien un elemento DDD:
<!ELEMENT XXX (AAA , BBB)>
<!ELEMENT AAA (CCC , DDD)>
<!ELEMENT BBB (CCC | DDD)>
<!ELEMENT CCC (#PCDATA)>
<!ELEMENT DDD (#PCDATA)>
Un documento válido:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA>
<CCC/> <DDD/>
</AAA>
<BBB>
<CCC/>
</BBB>
</XXX>
Otro documento válido:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA>
<CCC/> <DDD/>
</AAA>
<BBB>
<DDD/>
</BBB>
</XXX>
El elemento BBB puede contener un elemento CCC o bien DDD pero no ambos:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA>
<CCC/> <DDD/>
</AAA>
<BBB>
<CCC/> <DDD/>
</BBB>
</XXX>
El elemento BBB puede contener un elemento CCC o DDD pero no ambos:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA>
<CCC/> <DDD/>
</AAA>
<BBB>
<DDD/> <CCC/>
</BBB>
</XXX>
El texto puede ser intercalado con elementos.
El elemento AAA puede contener o bien BBB o CCC. Por otro lado el elemento BBB puede contener cualquier combinación de texto y elementos CCC.:
<!ELEMENT XXX (AAA+ , BBB+)>
<!ELEMENT AAA (BBB | CCC )>
<!ELEMENT BBB (#PCDATA | CCC )*>
<!ELEMENT CCC (#PCDATA)>
Un documento válido que explora varias posibilidades:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA>
<CCC>Exactamente un elemento.</CCC>
</AAA>
<AAA>
<BBB>
<CCC/>
<CCC/>
<CCC/>
</BBB>
</AAA>
<BBB/>
<BBB>
Esta es <CCC/> una combinacion <CCC/> de <CCC> elementos CCC </CCC> y texto <CCC/>.
</BBB>
<BBB>
Sólo texto.
</BBB>
</XXX>
El elemento AAA no puede contener ningún texto.:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA>
Elemento: <CCC/>
</AAA>
<BBB>
Element: <CCC/>
</BBB>
</XXX>
Los atributos se usan para asociar pares nombre-valor con elementos. La especificación de atributos sólo puede aparecer dentro de la etiqueta de apertura y en los elementos vacios. La declaración comienza con ATTLIST seguido del nombre del elemento al que pertenece el atributo y después le sigue la definición individual de cada atributo.
Un atributo del tipo CDATA puede contener cualquier caracter si éste se atiene a las reglas de formación. Los atributos #REQUIRED deben estar siempre presentes, los #IMPLIED son opcionales:
<!ELEMENT attributes (#PCDATA)>
<!ATTLIST attributes
aaa CDATA #REQUIRED
bbb CDATA #IMPLIED>
Los atributos CDATA pueden contener cualquier caracter que se atenga a las reglas:
<!DOCTYPE attributes SYSTEM "tutorial.dtd">
<attributes aaa="#d1" bbb="*~*">
Text
</attributes>
El orden de los atributos es indiferente:
<!DOCTYPE attributes SYSTEM "tutorial.dtd">
<attributes bbb="$25" aaa="13%">
Texto
</attributes>
El atributo bbb puede omitirse ya que es #IMPLIED:
<!DOCTYPE attributes SYSTEM "tutorial.dtd">
<attributes aaa="#d1" />
El atributo aaa es obligatorio. Porlo tanto debe estar siempre presente.:
<!DOCTYPE attributes SYSTEM "tutorial.dtd">
<attributes ___ bbb="X24"/>
Un atributo del tipo CDATA puede contener cualquier caracter si éste se atiene a las reglas de formación. Si es del tipo NMTOKEN sólo puede contener letras, dígitos, punto [ . ], guión [ - ], subrayado [ _ ] y dos puntos [ : ] . Los del tipo NMTOKENS pueden contener los mismos caracteres que NMTOKEN más espacios en blanco. Un espacio en blanco consiste en uno o más espacios, retornos de carro o tabuladores.
Los atributos bbb y ccc siempre tienen que estar presentes, el atributo aaa es opcional:
<!ELEMENT attributes (#PCDATA)>
<!ATTLIST attributes
aaa CDATA #IMPLIED
bbb NMTOKEN #REQUIRED
ccc NMTOKENS #REQUIRED>
Todos los atributos obligatorios están presentes y sus valores son del tipo correcto:
<!DOCTYPE attributes SYSTEM "tutorial.dtd">
<attributes aaa="#d1" bbb="a1:12" ccc=" 3.4 div -4"/>
Todos los atributos obligatorios están presentes y sus valores son del tipo correcto:
<!DOCTYPE attributes SYSTEM "tutorial.dtd">
<attributes bbb="a1:12"
ccc="3.4
div
-4"/>
El caracter # no está permitido en los atributos de tipos NMTOKEN y NMTOKENS:
<!DOCTYPE attributes SYSTEM "tutorial.dtd">
<attributes aaa="#d1" bbb="#d1" ccc="#d1"/>
El caracter de espacio no está permitido en los atributos de tipo NMTOKEN:
<!DOCTYPE attributes SYSTEM "tutorial.dtd">
<attributes bbb="A B C" ccc="A B C"/>
El valor de un atributo de tipo ID puede contener sólo caracteres válidos en NMTOKEN y debe comenzar con una letra. Ningún tipo de elemento puede tener especificado más de un atributo de tipo ID. El valor de un atributo ID debe ser único entre todos los valores de atributos ID.
Los atributos id, code y X determinan de manera inequívoca su elemento:
<!ELEMENT XXX (AAA+ , BBB+ , CCC+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ELEMENT CCC (#PCDATA)>
<!ATTLIST AAA
id ID #REQUIRED>
<!ATTLIST BBB
code ID #IMPLIED
list NMTOKEN #IMPLIED>
<!ATTLIST CCC
X ID #REQUIRED
Y NMTOKEN #IMPLIED>
Todos los valores ID son únicos :
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA id="a1"/>
<AAA id="a2"/>
<AAA id="a3"/>
<BBB code="QWQ-123-14-6" list="14:5"/>
<CCC X="zero" Y="16" />
</XXX>
Los atributos list y Y son del tipo NMTOKEN no ID. Éstos pueden tener, por lo tanto, el mismo valor que los atributos ID o tener el mismo valor en varios elementos :
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA id="L12"/>
<BBB code="QW" list="L12"/>
<CCC X="x-0" Y="QW" />
<CCC X="x-1" Y="QW" />
</XXX>
El atributo ID no puede comenzar con un número ni contener caracteres no permitidos en NMTOKEN:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA id="L12"/>
<BBB code="#QW" list="L12"/>
<CCC X="12" Y="QW" />
</XXX>
El atributo ID debe tener un valor único:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA id="L12"/>
<BBB code="QW" list="L12"/>
<CCC X="ZA" Y="QW" />
<CCC X="ZA" Y="QW" />
</XXX>
El atributo ID debe tener un valor único. Ambos, id y X, son de tipo ID:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA id="L12"/>
<BBB code="QW" list="L12"/>
<CCC X="L12" Y="QW" />
</XXX>
El valor de un atributo IDREF tiene que corresponder con el valor de algún atributo ID del documento. El valor del atributo IDREFS puede contener varias referencias a elementos con atributos ID separados por espacios en blanco.
Los atributos id y mark determinan inequívocamente su elemento. Los atributos ref hacen referencia a estos elementos:
<!ELEMENT XXX (AAA+ , BBB+, CCC+, DDD+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ELEMENT CCC (#PCDATA)>
<!ELEMENT DDD (#PCDATA)>
<!ATTLIST AAA
mark ID #REQUIRED>
<!ATTLIST BBB
id ID #REQUIRED>
<!ATTLIST CCC
ref IDREF #REQUIRED>
<!ATTLIST DDD
ref IDREFS #REQUIRED>
Todos los valores ID son únicos y todos los valores IDREF e IDREFS apuntan a elementos con IDs relevantes:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA mark="a1"/>
<AAA mark="a2"/>
<AAA mark="a3"/>
<BBB id="b001" />
<CCC ref="a3" />
<DDD ref="a1 b001 a2" />
</XXX>
No hay atributos ID con valor a3 ni b001:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA mark="a1"/>
<AAA mark="a2"/>
<BBB id="b01" />
<CCC ref="a3" />
<DDD ref="a1 b001 a2" />
</XXX>
El atributo ref en el elemento CCC es de tipo IDREF. Solo puede contener una referencia:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA mark="a1"/>
<AAA mark="a2"/>
<AAA mark="a3"/>
<BBB id="b001" />
<CCC ref="a1 b001 a2" />
<DDD ref="a1 b001 a2" />
</XXX>
Se pueden definir los valores permitidos en un atributo en la DTD.
Esta DTD declara los valores exactos que son permitidos:
<!ELEMENT XXX (AAA+, BBB+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ATTLIST AAA
true ( yes | no ) #REQUIRED>
<!ATTLIST BBB
month (1|2|3|4|5|6|7|8|9|10|11|12) #IMPLIED>
Todos los valores se dan en la DTD:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA true="yes"/>
<AAA true="no"/>
<AAA true="yes"/>
<BBB month="8" />
<BBB month="2" />
<BBB month="12" />
</XXX>
El atributo true no puede tener el valor "quizá", el atributo month no puede tener el valor "16" :
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA true="yes"/>
<AAA true="no"/>
<AAA true="quizá"/>
<BBB month="8" />
<BBB month="2" />
<BBB month="16" />
</XXX>
Si un atributo es opcional (#IMPLIED), puede definírsele un valor por defecto para cuando el atributo no se usa.
Ambos atributos son opcionales. Se dan sus valores por defecto.:
<!ELEMENT XXX (AAA+, BBB+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ATTLIST AAA
true ( yes | no ) "yes">
<!ATTLIST BBB
month NMTOKEN "1">
Los valores de true son yes, no y yes. Los valores de month son 8, 2 y 1.:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA true="yes"/>
<AAA true="no"/>
<AAA/>
<BBB month="8" />
<BBB month="2" />
<BBB/>
</XXX>
Un elemento puede ser definido EMPTY (vacio). En ese caso sólo puede contener atributos pero no texto.
Los elementos AAA pueden contener solamente atributos pero no texto:
<!ELEMENT XXX (AAA+)>
<!ELEMENT AAA EMPTY>
<!ATTLIST AAA
true ( yes | no ) "yes">
Ambas formas son válidas. En el segundo caso la etiqueta de cierre debe seguir inmediatamente al de apertura:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA true="yes"/>
<AAA true="no"></AAA>
</XXX>
El elemento AAA no puede contener ningún texto y el tag de apertura se tiene que cerrar inmediatamente:
<!DOCTYPE XXX SYSTEM "tutorial.dtd">
<XXX>
<AAA true="yes"/>
<AAA true="no"></AAA>
<AAA> </AAA>
<AAA>Hola!</AAA>
</XXX>
DTD de programación TV
<!DOCTYPE TVSCHEDULE [
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
]>
Kopiatua helbide honetatik: http://www.vervet.com/
<!DOCTYPE NEWSPAPER [
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">
]>
Kopiatua helbide honetatik: http://www.vervet.com/
<!DOCTYPE CATALOG [
<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "jd@jd-tools.com">
<!ELEMENT CATALOG (PRODUCT+)>
<!ELEMENT PRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ATTLIST PRODUCT
NAME CDATA #IMPLIED
CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
PARTNUM CDATA #IMPLIED
PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
INVENTORY (InStock|Backordered|Discontinued) "InStock">
<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONS
WEIGHT CDATA #IMPLIED
POWER CDATA #IMPLIED>
<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONS
FINISH (Metal|Polished|Matte) "Matte"
ADAPTER (Included|Optional|NotApplicable) "Included"
CASE (HardShell|Soft|NotApplicable) "HardShell">
<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICE
MSRP CDATA #IMPLIED
WHOLESALE CDATA #IMPLIED
STREET CDATA #IMPLIED
SHIPPING CDATA #IMPLIED>
<!ELEMENT NOTES (#PCDATA)>
]>
Un DTD es un conjunto de reglas sintácticas para definir etiquetas. Nos indica qué etiquetas se pueden usar en un documento, en qué orden deben aparecer, cuáles pueden aparecer dentro de otras, cuáles tienen atributos, etc.
Crear una definición del tipo de documento (DTD) es como crear nuestro propio lenguaje de marcado, para una aplicación específica. Por ejemplo, podríamos crear un DTD que defina una tarjeta de visita. A partir de ese DTD, tendríamos una serie de elementos XML que nos permitirían definir tarjetas de visita.
Originalmente los DTDs se desarrollaron para ser utilizados con SGML. Pueden ser parte del documento XML, pero se suele colocar aparte para utilizarlo en una serie de documentos.
Puesto que XML es un sistema para definir lenguajes, no puede tener un solo DTD (al contrario que HTML). En lugar de eso, quien necesite usar XML para intercambio de datos debe definir su propio DTD. Por ejemplo, el Wall Street Journal Interactive Edition tiene un DTD para especificar cada edición, con información sobre páginas, sumarios, etc.
Un problema que presentan los DTDs es que no siguen una sintaxis XML, sino una propia. Un grupo de desarrolladores han propuesto una alternativa a los DTDs, llamada esquemas ("schemas").
Básicamente, un esquema establece las reglas de un documento e indica qué etiquetas se pueden usar, sus atributos, las relaciones entre etiquetas, etc.
Un esquema, al contrario que un DTD, puede definir tipos de datos, lo cual es claramente beneficioso en el intercambio de datos, objetos o bases de datos.
SGML utiliza Definiciones de Tipo de Documentos(DTD) para describir los elementos (etiquetas) disponibles en un tipo de documento específico. Sin embargo, el diseño y construcción de una DTD puede ser una tarea compleja y no trivial, por lo que XML ha sido diseñado para ser usado con o sin una DTD. Sin-DTD significa que puedes inventar etiquetas sin tener que definirlas formalmente.
Para que esto funcione, un fichero sin-DTD 'define' sus propias etiquetas, informalmente, por la existencia y la localización de elementos cuando son creados. Pero cuando una aplicación XML, como un visualizador encuentra un fichero sin DTD, necesita ser capaz de entender la estructura del documento que está leyendo, y dado que no tiene DTD que le informe al respecto, se han hecho algunas modificaciones en las reglas.
Por ejemplo, el elemento <IMG> de HTML se define como 'VACÍO': no tiene etiqueta de fin. Sin una DTD, una aplicación XML no tendría manera de conocer si debe esperar una etiqueta de fin para un determinado elemento, luego ha tenido que introducirse el concepto de 'bien-formado'. Esto hace el comienzo y fin de todos los elementos, y la presencia de elementos VACÍO completamente no ambigua.
Documentos 'bien-formados'
Todos los documentos XML deben estar 'bien-formados':
Los ficheros XML bien-formados y sin-DTD deben tener <, >, ', ", y & predefinidos y disponibles para ser utilizados incluso sin DTD. Los ficheros XML válidos deben declararlos explícitamente si los utilizan.
XML válido
Los ficheros XML válidos son aquellos que tienen DTDs como el resto de las otras aplicaciones SGML. También deben estar bien-formados. Un fichero válido comienza como cualquier otro fichero SGML, con una Declaración de Tipo de Documento, una puede tener una declaración XML opcional:
<?xml version="1.0"?> <!DOCTYPE anuncio SYSTEM "http://www.foo.org/ad.dtd"> <libro> <titulo>...<imagen/>...</titulo> <texto>...</texto> </libro>
La Especificación XML define una Declaración SGML para XML que está fijada para todas las instancias (la declaración ha sido eliminada del texto de la especificación y ahora está en un documento aparte). Debe ser accesible una Versión XML de la DTD especificada para el procesador XML, bien localmente (ej. teniendo una copia en disco), o descargándola de la red. Esto puede especificarse mediante el URL para la DTD en un Identificador de Sistema (como en el ejemplo arriba). Es posible (algunos dirían preferible) proporcionar un Identificador Público Formal, pero si se utiliza, éste debe preceder al Identificador de Sistema, que debe ser dado (y sólo se utiliza la palabra clave PUBLIC), ej:
<!DOCTYPE anuncio PUBLIC "-//Foo, Inc//DTD Anuncios//ES" "http://www.foo.org/ad.dtd"> ó <!DOCTYPE anuncio SYSTEM "http://www.foo.org/ad.dtd">
Los valores por defecto para el resto de los atributos de la Declaración XML son VERSION="1.0" y ENCODING="UTF-8".
La DTD puede residir en un fichero externo, y quizá compartido por varios (puede que miles) de documentos. O bien, puede estar contenida en el propio documento XML, como parte de su declaración de tipo de documento.
Veamos un ejemplo:
<!DOCTYPE etiqueta[ <!ELEMENT etiqueta (nombre, calle, ciudad, pais, codigo)> <!ELEMENT nombre (#PCDATA)> <!ELEMENT calle (#PCDATA)> <!ELEMENT ciudad (#PCDATA)> <!ELEMENT pais (#PCDATA)> <!ELEMENT codigo (#PCDATA)> ]> <etiqueta> <nombre>Pepe García</nombre> <calle>C/Ronda, 3</calle> <ciudad>Armilla</ciudad> <pais>España</pais> <codigo>18465</codigo> </etiqueta>
La declaración del tipo de documento comienza en la primera línea y termina con "]>". Las declaraciones DTD son las líneas que empiezan con "<!ELEMENT" y se denominan declaraciones de tipo elemento. También se pueden declarar atributos, entidades y anotaciones para una DTD.
En el ejemplo anterior, todas las declaraciones DTD que definen "etiqueta" residen dentro del documento. Sin embargo, la DTD se puede definir parcial o completamente en otro lugar. Por ejemplo:
<?xml version="1.0"?> <!DOCTYPE coche SYSTEM "http://www.sitio.com/dtd/coche.dtd"> <coche> <modelo>...</modelo> ... </coche>
Ejercicio: Diseñar un DTD para enviar e-mail, definiendo los distintos componentes de un mensaje (remitente único, varios destinatarios, cero o más copias, un asunto, un cuerpo, y firma optativa).
Los elementos son la base de las marcas XML, y deben ajustarse a un tipo de documento declarado en una DTD para que el documento XML sea considerado válido.
Las declaraciones de tipo de elemento deben empezar con "<!ELEMENT" seguidas por el identificador genérico del elemento que se declara. A continuación tienen una especificación de contenido.
Por ejemplo:
<!ELEMENT receta (titulo, ingredientes, procedimiento)>
En este ejemplo, el elemento <receta> puede contener dentro elementos <titulo>, <ingredientes> y <procedimiento>, que, a su vez, estarán definidos también en la DTD y podrán contener más elementos.
Siguiendo la definición de elemento anterior, este ejemplo de documento XML sería válido:
<receta> <titulo>...</titulo> <ingredientes>...</ingredientes> <procedimiento>...</procedimiento> </receta>
Pero no este:
<receta> <parrafo>Esto es un párrafo</parrafo> <titulo>...</titulo> <ingredientes>...</ingredientes> <procedimiento>...</procedimiento> </receta>
La especificación de contenido puede ser de cuatro tipos:
EMPTY
Puede no tener contenido. Suele usarse para los atributos.
<!ELEMENT salto-de-pagina EMPTY>
ANY
Puede tener cualquier contenido. No se suele utilizar, ya que es conveniente estructurar adecuadamente nuestros documentos XML.
<!ELEMENT batiburrillo ANY>
Mixed
Puede tener caracteres de tipo datos o una mezcla de caracteres y sub-elementos especificados en la especificación de contenido mixto.
<!ELEMENT enfasis (#PCDATA)>
<!ELEMENT parrafo (#PCDATA|enfasis)*>
Por ejemplo, el primer elemento definido en el ejemplo (<enfasis>) puede contener datos de carácter (#PCDATA). Y el segundo (<parrafo>) puede contener tanto datos de carácter (#PCDATA) como sub-elementos de tipo <enfasis>.
Element
Sólo puede contener sub-elementos especificados en la especificación de contenido.
<!ELEMENT mensaje (remite, destinatario, texto)>
Para declarar que un tipo de elemento tenga contenido de elementos se especifica un modelo de contenido en lugar de una especificación de contenido mixto o una de las claves ya descritas.
Un modelo de contenido es un patrón que establece los sub-elementos aceptados, y el orden en que se acepta.
Un modelo sencillo puede tener un solo tipo de sub-elemento:
<!ELEMENT aviso (parrafo)>
Esto indica que sólo puede contener un solo <parrafo>.
<!ELEMENT aviso (titulo, parrafo)>
La coma, en este caso, denota una secuencia. Es decir, el elemento <aviso> debe contener un <titulo> seguido de un <parrafo>.
<!ELEMENT aviso (parrafo | grafico)>
La barra vertical "|" indica una opción. Es decir, <aviso> puede contener o bien un <parrafo> o bien un <grafico>. El número de opciones no está limitado a dos, y se pueden agrupar usando paréntesis.
<!ELEMENT aviso (titulo, (parrafo | grafico))>
En este último caso, el <aviso> debe contener un <titulo> seguido de un <parrafo> o de un <grafico>.
Además, cada partícula de contenido puede llevar un indicador de frecuencia, que siguen directamente a un identificador general, una secuencia o una opción, y no pueden ir precedidos por espacios en blanco.
Para entender esto, vamos a ver un ejemplo.
<!ELEMENT aviso (titulo?, (parrafo+, grafico)*)>
En este caso, <aviso> puede tener <titulo>, o no (pero sólo uno), y puede tener cero o más conjuntos <parrafo><grafico>, <parrafo><parrafo><grafico>, etc.
Ejercicio: Construir un ejemplo de DTD, incluido en el fichero XML, para especificar un tipo de documentos (XML) para describir artículos con las siguientes partes:
Los atributos permiten añadir información adicional a los elementos de un documento. La principal diferencia entre los elementos y los atributos, es que los atributos no pueden contener sub-atributos. Se usan para añadir información corta, sencilla y desestructurada.
<mensaje prioridad="urgente"> <de>Alfredo Reino</de> <a>Hans van Parijs</a> <texto idioma="holandés"> Hallo Hans, hoe gaat het? ... </texto> </mensaje>
Otra diferencia entre los atributos y los elementos, es que cada uno de los atributos sólo se puede especificar una vez, y en cualquier orden.
En el ejemplo anterior, para declarar la lista de atributos de los elementos <mensaje> y <texto> haríamos lo siguiente:
<!ELEMENT mensaje (de, a, texto)> <!ATTLIST mensaje prioridad (normal | urgente) normal> <!ELEMENT texto(#PCDATA)> <!ATTLIST texto idioma CDATA #REQUIRED>
Las declaraciones de los atributos empiezan con "<!ATTLIST", y a continuación del espacio en blanco viene el identificador del elemento al que se aplica el atributo. Despues viene el nombre del atributo, su tipo y su valor por defecto. En el ejemplo anterior, el atributo "prioridad" puede estar en el elemento <mensaje> y puede tener el valor "normal" o "urgente", siendo "normal" el valor por defecto si no especificamos el atributo.
El atributo "idioma", pertenece al elemento texto, y puede contener datos de carácter (CDATA). Es más, la palabra #REQUIRED significa que no tiene valor por defecto, ya que es obligatorio especificar este atributo.
A menudo interesa que se pueda omitir un atributo, sin que se adopte automáticamente un valor por defecto. Para esto se usa la condición "#IMPLIED". Por ejemplo, en una supuesta DTD que defina la etiqueta <IMG> de HTML:
<!ATTLIST IMG URL CDATA #REQUIRED ALT CDATE #IMPLIED>
Es decir, el atributo "URL" es obligatorio, mientras que el "ALT" es opcional (y si se omite, no toma ningún valor por defecto).
Atributos CDATA y NMTOKEN
Los atributos CDATA (character data) son los más sencillos, y pueden contener casi cualquier cosa. Los atributos NMTOKEN (name token) son parecidos, pero sólo aceptan los caracteres válidos para nombrar cosas (letras, números, puntos, guiones, subrayados y los dos puntos).
<!ATTLIST mensaje fecha CDATA #REQUIRED> <mensaje fecha="15 de Julio de 1999"> <!ATTLIST mensaje fecha NMTOKEN #REQUIRED> <mensaje fecha="15-7-1999">
Atributos enumerados y notaciones
Los atributos enumerados son aquellos que sólo pueden contener un valor de entre un número reducido de opciones.
<!ATTLIST mensaje prioridad (normal | urgente) normal>
Existe otro tipo de atributo parecido, llamado de notación (NOTATION). Este tipo de atributo permite al autor declarar que su valor se ajusta a una notación declarada.
<!ATTLIST mensaje fecha NOTATION (ISO-DATE | EUROPEAN-DATE) #REQUIRED>
Para declarar las notaciones, se utiliza "<!NOTATION", con una definición externa de la notación. La definición externa puede ser pública o un identificador del sistema para la documentación de la notación, una especificación formal o un asistente de la aplicación que contenga objetos representados en la notación.
<!NOTATION HTML SYSTEM "http://www.w3.org/Markup"> <!NOTATION HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
Atributos ID e IDREF
El tipo ID permite que un atributo determinado tenga un nombre único que podrá ser referenciado por un atributo de otro elemento que sea de tipo IDREF. Por ejemplo, para implementar un sencillo sistema de hipervínculos en un documento:
<!ELEMENT enlace EMPTY> <!ATTLIST enlace destino IDREF #REQUIRED> <!ELEMENT capitulo (parrafo)*> <!ATTLIST capitulo referencia ID #IMPLIED>
En este caso, una etiqueta <enlace destino="seccion-3"> haría referencia a un <capitulo referencia="seccion-3">, de forma que el procesador XML lo podría convertir en un hipervínculo, u otra cosa.
XML hace referencia a objetos (ficheros, páginas web, imágenes, cualquier cosa) que no deben ser analizados sintácticamente según las reglas de XML, mediante el uso de entidades. Se declaran en la DTD mediante el uso de "<!ENTITY"
Una entidad puede no ser más que una abreviatura que se utiliza como una forma corta de algunos textos. Al usar una referencia a esta entidad, el analizador sintáctico reemplaza la referencia con su contenido. En otras ocasiones es una referencia a un objeto externo o local.
Las entidades pueden ser:
Entidades generales internas
Son las más sencillas. Son básicamente abreviaturas definidas en la sección de la DTD del documento XML. Son siempre entidades analizadas, es decir, una vez reemplazada la referencia a la entidad por su contenido, pasa a ser parte del documento XML y como tal, es analizada por el procesador XML.
<!DOCTYPE texto[ <!ENTITY alf "Alien Life Form"> ]> <texto><titulo>Un día en la vida de un &alf;</titulo></texto>
Entidades generales externas analizadas
Las entidades externas obtienen su contenido en cualquier otro sitio del sistema, ya sea otro archivo del disco duro, una página web o un objeto de una base de datos. Se hace referencia al contenido de una entidad así mediante la palabra SYSTEM seguida de un URI (Universal Resource Identifier)
<!ENTITY intro SYSTEM "http://www.miservidor.com/intro.xml">
Entidades no analizadas
Evidentemente, si el contenido de la entidad es un archivo MPG o una imagen GIF o un fichero ejecutable EXE, el procesador XML no debería intentar interpretarlo como si fuera texto XML. Este tipo de entidades siempre son generales y externas.
<!ENTITY logo SYSTEM "http://www.miservidor.com/logo.gif">
Entidades parámetro internas y externas
Se denominan entidades parámetro a aquellas que sólo pueden usarse en la DTD, y no en el documento XML. Se pueden utilizar para agrupar ciertos elementos del DTD que se repitan mucho. Se diferencian las entidades parámetro de las generales, en que para hacer referencia a ellas, se usa el símbolo "%" en lugar de "&" tanto como para declararlas como para usarlas.
<!DOCTYPE texto[ <!ENTITY % elemento-alf "<!ELEMENT ALF (#PCDATA)>"> ... %elemento-alf; ]>
Tambien puede ser externa:
<!DOCTYPE texto[ <!ENTITY % elemento-alf SYSTEM "alf.ent"> ... %elemento-alf; ]>
Un DTD que puede servir como ejemplo podría ser uno que nos defina un lenguaje de marcado para una base de datos de personas.
En el ejemplo vamos a examinar cómo hacer una agenda que guardará el nombre y teléfono de cada persona. Además, cada persona tendrá un identificador (obligatoriamente) como atributo.
El fichero ejemplo-agenda.dtd podría ser algo así:
<?xml encoding="UTF-8"?> <!ELEMENT agenda (persona)+> <!ELEMENT persona (nombre, tlf)> <!ATTLIST persona id ID #REQUIRED> <!ELEMENT nombre (#PCDATA)> <!ELEMENT tlf (#PCDATA)>
Basándonos en este DTD, podríamos escribir nuestra primera agenda en XML (ejemplo-agenda.xml) de la siguiente manera:
<?xml version="1.0"?> <!DOCTYPE agenda SYSTEM "ejemplo-agenda.dtd"> <agenda> <persona id="ricardo"> <nombre>Ricardo Borriquero</nombre> <tlf>951345678</tlf> </persona> <persona id="eva"> <nombre>Eva Risto</nombre> <tlf>955837659</tlf> </persona> </agenda>
Ejercicio: Ampliar el ejemplo anterior de forma que además del nombre y teléfono, cada entrada de la agenda esté definida como persona del sexo masculino o femenido, tenga uno o varios emails, y se puedan especificar relaciones de amistad entre las diferentes personas de la agenda.