Ir directamente al contenido de esta página
<!ATTLIST>
En el primero de los artículos dedicados a leer una DTD vimos las declaraciones de elementos. Ahora vamos a ver cómo se especifican los atributos de los mismos.
Las listas de atributos definidas en una DTD suelen presentar este aspecto:
<!ELEMENT meta EMPTY>
<!ATTLIST meta
lang NMTOKEN #IMPLIED
xml:lang NMTOKEN #IMPLIED
dir (ltr|rtl) #IMPLIED
id ID #IMPLIED
http-equiv CDATA #IMPLIED
name CDATA #IMPLIED
content CDATA #REQUIRED
scheme CDATA #IMPLIED
Lo que expresado en un esquema general sería:
<!ATTLIST nombre_del_elemento
nombre_del_atributo valor_del_atributo valor_por_defecto
…
>
donde:
ATTLIST
: La palabra reservada que indica que lo que se declara es una lista de atributos.nombre_del_elemento
: El elemento del que se declaran los atributos.nombre_del_atributo
: Como en el caso de los nombres de los elementos, debe ser un nombre XML legal:
href
y HREF
, por ejemplo, serían atributos distintos.-
), guión bajo (_
), punto (.
) y dos puntos (:
), no obstante este último signo se reserva para indicar espacios de nombres.valor_del_atributo
: Se puede especificar o bien el tipo de valor del atributo, o bien un booleano, o bien una lista de opciones. Lo veremos con más detenimiento un poco más abajo.valor_por_defecto
: En ella es posible especificar tanto un valor por defecto para el atributo, como su grado de obligatoriedad. También lo veremos después con más detalle.Por lo general, la lista de atributos se recoge después de la declaración del elemento correspondiente, pero el motivo es organizar de una forma más lógica la DTD, no un requisito de la especificación.
De la misma manera, los espacios en blanco y los saltos de línea no tienen valor alguno, lo que se suele aprovechar para crear columnas que ayuden a la legibilidad.
Por último, aunque no se indica de manera alguna, por sintaxis de XML un elemento sólo puede tener un atributo de cada uno de los especificados.
CDATA
El tipo de valor más general de atributo, significa que consiste en cualquier cadena de texto, con las salvedades básica de un atributo bien formado en XML, es decir, que los caracteres &
y <
deben sustituirse por sus referencias de entidad —&
y <
—, y que deben escaparse las comillas que puedan crear confusión con las que se empleen para indicar el valor del atributo.
En el ejemplo se indica que el atributo title
de map
puede ser cualquier cadena de texto:
<!ATTLIST map
[…]
title CDATA #IMPLIED
[…]
>
NMTOKEN
y NMTOKENS
Un NMTOKEN
—abreviatura de name token— es un nombre similar al nombre legal de XML que hemos descrito para el nombre de un atributo, con la salvedad de que tanto números como los cuatro signos de puntuación pueden aparecer como primer caracter. Así, 120
o .dif
serían nmtokens válidos, aunque serían nombres XML ilegales.
En el ejemplo se indica que el atributo xml:lang
de meta
podrían ser, por ejemplo, 11-ES
(aunque no exista):
<!ATTLIST meta
[…]
xml:lang NMTOKEN #IMPLIED
[…]
>
En el caso de NMTOKENS
, estaríamos indicando que el atributo puede contener una lista con varios NMTOKEN
, que se separían por medio de espacios en blanco.
ENTITY
y ENTITIES
ENTITY
indica que el valor del atributo debe ser una entidad general no interpretada —unparsed general entity—, pero qué significa eso lo veremos en un artículo futuro en que las trataré en concreto.
ENTITIES
sería una lista de entidades no interpretadas, separadas por espacios en blanco.
ID
Por medio de ID
se asigna un atributo que funciona como identificador del elemento. El valor de un identificador tiene que ser un nombre XML legal, pero además debe ser único en un documento dado.
En el ejemplo vemos que param
—como la mayoría de los elementos de XHTML— puede tener un atributo id
que debe ser un identificador único:
<!ATTLIST param
id ID #IMPLIED
[…]
>
Sólo dos notas, sobre confusiones comunes:
Aunque lo más común es que en una DTD se asigne el valor de ID
a un atributo llamado precisamente id
, no es obligatorio.
Por ejemplo, supongamos que estuviésemos escribiendo una DTD para llevar el registro de los socios de un club exclusivísimo, y quisiéramos asignar al elemento socio
un identificador único en un atributo. Para facilitar la lectura de los documentos que creásemos sobre esa DTD, lo lógico sería que le diésemos un nombre significativo como número-socio
1:
<!ATTLIST socio
número-socio ID #REQUIRED
>
ID
es que el valor del atributo asignado debe ser único en un documento, no que el atributo en sí tenga que serlo. Es decir, varios elementos distintos pueden tener un atributo id
, pero, por ejemplo, el valor contenido
del atributo id
de un elemento div
no podría aparecer en el id
de ningún otro elemento.IDREF
e IDREFS
Por medio de IDREF
se requiere que el valor del atributo coincida con el valor de un identificador único presente en el documento marcado.
El ejemplo más claro en XHTML 1.0 es el atributo for
de label
:
<!ATTLIST label
[…]
for IDREF #IMPLIED
[…]
>
Como sabemos, significa que en caso de que un label
tenga un for
, el valor del mismo debe de ser el id
asignado a un elemento de un formulario.
Por su parte, IDREFS
funciona igual que IDREF
, pero permite especificar una lista de identificadores, separados por espacios en blanco.
En el ejemplo, por medio de headers
se pueden asignar los identificadores de tantos elementos th
como se necesiten:
<!ATTLIST td
[…]
headers IDREFS #IMPLIED
[…]
>
NOTATION
NOTATION
especifica que el valor del atributo debe ser una anotación definida en algún lugar de la DTD. Lo que es una anotación lo trataré más detenidamente en otro artículo.
En algunos casos se puede querer especificar un atributo que sólo puede tener un valor de verdadero o falso. Para indicarlo no hay más que incluir el atributo entre paréntesis.
En el ejemplo, los dos atributos de select
son opcionales, pero en caso de aparecer, su valor tiene que ser necesariamente el mismo nombre que el atributo, esto es, multiple="multiple"
o disabled="disabled"
:
<!ATTLIST select
[…]
multiple (multiple) #IMPLIED
disabled (disabled) #IMPLIED
[…]
>
Por último, se puede especificar una serie de valores posibles para el atributo. Para ello se debe listar los valores entre paréntesis y separados por medio de la barra vertical (|
).
En el ejemplo, el atributo type
de button
sólo acepta como valores button
, submit
o reset
:
<!ATTLIST button
[…]
type (button|submit|reset) "submit"
[…]
>
Una de las limitaciones de la DTD es que los posibles valores del atributo deben recogerse literal y exahustivamente. No se puede indicar, por ejemplo, un tipo de valor para el atributo —un numero, una cadena literal sin espacios, etc.—, un formato para el valor —tres cifras, una palabra de cuatro letras, etc.— o un rango de valores —letras de la «a» a la «d», fechas entre 1970 y 2005, etc.—; para ello se necesitaría definir un esquema XML (inglés), pero eso queda fuera del ámbito de este artículo.
Bien, ya sabemos cómo especificar los valores de un atributo. Ahora vamos a ver cómo se indica su valor por defecto, es decir, cuál es el significado de la última parte de la declaración de un atributo.
#IMPLIED
Por medio de #IMPLIED
se define el atributo como opcional. En caso de que el elemento cuente con el atributo, el valor será el especificado; en caso contrario, su valor será indefinido.
En el ejemplo se indica que br
puede tener o no un atributo style
:
<!ATTLIST br
[…]
style CDATA #IMPLIED
[…]
>
#REQUIRED
#REQUIRED
lo que significa es que el atributo es obligatorio, aunque no se especifica un valor concreto para el mismo, sólo que debe estar presente; de hecho, puede aparecer vacío.
Para el elemento img
, alt
es obligatorio, pero una vez marcado, puede tener cualquier valor permitido, o ser alt=""
:
<!ATTLIST img
[…]
alt CDATA #REQUIRED
>
#FIXED
#FIXED
es similar a #REQUIRED
, salvo que sí se especifica el valor del atributo, inmediatamente después y entrecomillado. #FIXED
es como decir «este atributo debe aparecer necesariamente, y además su valor es éste».
En XHTML, como en todos los lenguajes de marcado, el atributo xmlns
del elemento raíz siempre tiene asignado un literal fijo:
<!ATTLIST html
[…]
xmlns CDATA #FIXED 'http://www.w3.org/1999/xhtml'
>
Por último, se puede indicar literalmente el valor por defecto, simplemente recogiéndolo entrecomillado.
En el ejemplo, el atributo type
de input
puede tener cualquiera de los valores listados, pero en caso de que no se marque el atributo, su valor no será indefinido como ocurre con #IMPLIED
, sino que será text
:
<!ATTLIST input
[…]
type (text | password | checkbox |
radio | submit | reset |
file | hidden | image | button) "text"
[…]
>
Y hasta aquí, las declaraciones de atributos. En el siguiente artículo veremos lo que son las entidades de una DTD.