Ir directamente al contenido de esta página

codexexempla.org

Leer una DTD: <!ATTLIST>

Tabla de contenidos

  1. Introducción
  2. La lista de atributos
  3. Los valores de los atributos
    1. CDATA
    2. NMTOKEN y NMTOKENS
    3. ENTITY y ENTITIES
    4. ID
    5. IDREF e IDREFS
    6. NOTATION
    7. Un booleano
    8. Una enumeración
  4. La declaración del valor por defecto del atributo
    1. #IMPLIED
    2. #REQUIRED
    3. #FIXED
    4. Un literal

Introducción

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.

La lista de atributos

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:

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.

Los valores de los atributos

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 —&amp; y &lt;—, 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:

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.

Un booleano

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
        […] 
    >
            

Una enumeración

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.

La declaración del valor por defecto del atributo

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'
    >
            

Un literal

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.

Notas

  1. Sí, a la hora de declarar un atributo —o un elemento— se puede emplear «ú» y cualquier otro caracter de UTF-8. Por ejemplo, sería válido algo como <!ELEMENT 当て字 (#PCDATA)>. Volver

Contacto

En virtud de la Ley Orgánica 15/1999 de Protección de Datos de Carácter Personal le informo de que los datos que proporcione no serán empleados para otro fin que el de responder a su mensaje. En especial, me comprometo a no cederlos a terceros ni a emplearlos para enviar información no solicitada.

Del blog de Digital Icon