Esta declaración:
<!ATTLIST persona nacionalidad CDATA>
Significa que hemos definido el atributo nacionalidad correspondiente al elemento persona. Que será de tipo CDATA, es decir texto normal. Así en un XML que se valide con el DTD en el que está la instrucción anterior, podremos:
<persona nacionalidad="española"></persona>
Para indicar el tipo de valores de un atributo se usa la palabra CDATA para indicar que el atributos contiene texto (CDATA es el acrónimo de Character DATA).
A diferencia de #PCDATA, su contenido no es procesado, lo que significa que puede contener cualquier valor, incluidos los caracteres no permitidos en los elementos <, >, &, ' y “.
<!DOCTYPE ejemplos [
<!ELEMENT ejemplo EMPTY>
<!ATTLIST ejemplo color CDATA #REQUIRED>
]>
<ejemplos>
<ejemplo color=""></ejemplo>
<ejemplo color="amarillo"></ejemplo>
<ejemplo color="azul marino #000080"></ejemplo>
<ejemplo></ejemplo> <!-- ERROR: falta el atributo "color", obligatorio debido al #REQUIRED -->
</ejemplos>
Al declarar un atributo, lo último que se indica es la propiedad relativa al valor por defecto del atributo. Se comentan a continuación sus posibilidades:
Valor por defecto concreto
Si al final de la declaración de un atributo aparece un valor concreto, se entiende que ese será el valor por defecto. Es decir que se podría no utilizar el atributo en un elemento y entonces dicho atributo tomaría dicho valor.
Por ejemplo supongamos que éste es el archivo directorio.dtd:
<!ELEMENT directorio ( persona )+>
<!ELEMENT persona (#PCDATA)>
<!ATTLIST persona nacionalidad CDATA "Española">
Se define en él el atributo nacionalidad para el elemento persona como un atributo que contendrá texto de todo tipo, pero que por defecto toma el valor Española (nacionalidad por defecto en dicho archivo).
Entonces este archivo XML será válido:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE directorio SYSTEM "directorio.dtd">
<directorio>
<persona nacionalidad="Francesa">Vivian Maret</persona>
<persona>Juan Martín</persona>
</directorio>
Entonces para Vivian Maret se ha indicado explícitamente la nacionalidad, pero no se ha usado el atributo para Juan Martín, por lo que tomará la nacionalidad española.
Otro ejemplo:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejemplos [
<!ELEMENT ejemplo EMPTY>
<!ATTLIST ejemplo color CDATA "verde">
]>
<ejemplos>
<ejemplo></ejemplo>
<ejemplo color=""></ejemplo>
<ejemplo color="amarillo"></ejemplo>
<ejemplo color="verde"></ejemplo>
</ejemplos>
Valores fijos
Se puede utilizar el término #FIXED antes de indicar un valor fijo para un atributo. En ese caso en ningún documento XML se podrá modificar dicho atributo. Ejemplo:
<!ELEMENT directorio ( persona )+>
<!ELEMENT persona (#PCDATA)>
<!ATTLIST persona nacionalidad CDATA #FIXED "Española">
El atributo nacionalidad no podrá tomar ningún valor que no sea el valor Española, impidiendo tomar otra nacionalidad. En la práctica este tipo de atributos no se usa demasiado, sólo se usa en el caso de que la presencia o no de dicho atributo en un elemento sea determinante.
Otro ejemplo:
<!DOCTYPE ejemplos [
<!ELEMENT ejemplo EMPTY>
<!ATTLIST ejemplo color CDATA #FIXED "verde">
]>
<ejemplos>
<ejemplo></ejemplo>
<ejemplo color="verde"></ejemplo>
<ejemplo color=""></ejemplo> <!-- ERROR: el atributo "color" no tiene el valor "verde" -->
<ejemplo color="amarillo"></ejemplo> <!-- ERROR: el atributo "color" no tiene el valor "verde" -->
</ejemplos>
Valores requeridos
En este caso se usa la palabra #REQUIRED indicando con ello que siempre hay que dar valor al atributo. Ejemplo:
<!ATTLIST persona nacionalidad CDATA #REQUIRED>
Un documento XML que utilice el elemento persona deberá especificar obligatoriamente la nacionalidad. Obviamente usando #REQUIRED no se puede indicar un valor por defecto (al no poder dejarse sin especificar el atributo).
<!DOCTYPE ejemplos [
<!ELEMENT ejemplo EMPTY>
<!ATTLIST ejemplo color CDATA #REQUIRED>
]>
<ejemplos>
<ejemplo color=""></ejemplo>
<ejemplo color="amarillo"></ejemplo>
<ejemplo color="azul marino #000080"></ejemplo>
<ejemplo></ejemplo> <!-- ERROR: falta el atributo "color" -->
</ejemplos>
Valor opcional
La palabra #IMPLIED especificada en el atributo indicaría que dicho atributo puede quedarse sin valor; es decir no posee valor por defecto, pero puede quedarse sin especificar (quedaría nulo por tanto).
<!ATTLIST persona nacionalidad CDATA #IMPLIED>
En el ejemplo, el atributo nacionalidad no es obligatorio especificarlo, puede quedar sin valor. Nuevamente en este caso no se puede especificar un valor por defecto (sería absurdo).
<!DOCTYPE ejemplos [
<!ELEMENT ejemplo EMPTY>
<!ATTLIST ejemplo color CDATA #IMPLIED>
]>
<ejemplos>
<ejemplo></ejemplo>
<ejemplo color=""></ejemplo>
<ejemplo color="amarillo"></ejemplo>
<ejemplo color="azul marino #000080"></ejemplo>
</ejemplos>