Saltar la navegación

6.2.4. Tipos de atributos

ID

Sirve para generar identificadores a los elementos. Un identificador es un valor único que tendrá cada elemento y son muy usados en XML. El valor de un atributo de tipo ID cumple estas reglas:

  • El valor tiene que cumplir las mismas reglas que para especificar nombres XML. Es decir: nada de espacios, no pueden comenzar con un número y sólo admite letras, números y el carácter de subrayado (_).
  • No puede haber dos elementos con el mismo ID en un mismo documento XML
  • En el DTD, para cada elemento sólo puede indicarse un atributo como ID. No puede haber dos atributos distintos en el mismo elemento que contengan IDs.
  • Los atributos ID sólo pueden indicar #IMPLIED o #REQUIRED en el apartado del valor por defecto.

Los IDs son especialmente útiles para las herramientas de maquetación, análisis y programación de aplicaciones XML. Ya que permiten diferenciar de manera única a cada elemento.

<!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> <!-- ERROR: 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> <!-- ERROR: el valor "L1" ya se ha utilizado -->
</ejemplo>

IDREF

Los atributos IDREF contienen el valor de un ID de otro elemento. Es decir será una referencia a otro elemento. Las reglas de los IDREF son:

  • El valor de un IDREF debe cumplir las reglas para especificar nombres XML (es lógico ya que contienen valores de tipo ID)
  • Debe existir un atributo ID en el documento XML cuyo valor coincida con el especificado en un IDREF (de otro modo se haría referencia a un elemento inexistente y esto no está permitido)

La idea es poder relacionar elementos a través de atributos de tipo ID e IDREF. Ejemplo de uso:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Archivo directorio.dtd -->
<!ELEMENT directorio (persona)+ >
<!ELEMENT persona (#PCDATA) >
<!ATTLIST persona id ID #REQUIRED
   madre IDREF #IMPLIED
   padre IDREF #IMPLIED>
<?xml version="1.0" encoding="UTF-8"?>
<!-- Archivo directorio1.xml-->
<!DOCTYPE directorio SYSTEM "directorio.dtd">
<directorio>
   <persona id="p1">Pedro</persona>
   <persona id="p2">Marisa</persona>
   <persona id="p3" madre="p2" padre="p1">Carmen</persona>
</directorio>

Carmen es la hija de Pedro y Marisa, según el código anterior, ya que los atributos padre y madre de tipo IDREF contienen los ID de Pedro y Marisa.

IDREFS

Igual que el anterior sólo que permite indicar varias referencias (que deben existir en el documento XML) a otros ID, separadas por espacios. Ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Archivo directorio.dtd -->
<!ELEMENT directorio (persona)+ >
<!ELEMENT persona (#PCDATA) >
<!ATTLIST persona id ID #REQUIRED padres IDREFS #IMPLIED >
<?xml version="1.0" encoding="UTF-8"?>
<!-- Archivo directorio1.xml-->
<!DOCTYPE directorio SYSTEM "directorio.dtd">
<directorio>
   <persona id="p1">Pedro</persona>
   <persona id="p2">Marisa</persona>
   <persona id="p3" padres="p1 p2">Carmen</persona>
</directorio>

NMTOKEN

El valor del atributo será un texto que cumplirá las reglas para nombres XML. Se usa en atributos donde se entiende que CDATA permite demasiadas libertades, de esta forma al menos sabremos que es un texto donde sólo existirán letras, números y el los caracteres de punto “.”, guión “-“, subrayado “_” y dos puntos “:”, es decir un texto que cumple las reglas para nombres XML.

<!DOCTYPE ejemplo [
<!ELEMENT ejemplo EMPTY>
<!ATTLIST ejemplo color NMTOKEN #REQUIRED>
]>
<ejemplo color="azul-marino"></ejemplo>
<ejemplo color="1"></ejemplo>

Los siguientes casos darían un error de validación:

<ejemplo color=""></ejemplo><!-- ERROR: no admite vacío -->
<ejemplo color="azul marino"></ejemplo> <!-- ERROR: hay un espacio en blanco -->
<ejemplo color="#F0F0F0"></ejemplo> <!-- ERROR: contiene el carácter # -->

NMTOKENS

El atributo puede contener varios valores de tipo NMTOKEN separados por espacios

<!DOCTYPE ejemplo [
<!ELEMENT ejemplo EMPTY>
<!ATTLIST ejemplo color NMTOKENS #REQUIRED>
]>

En el documento XML podría aparecer escrito de la siguiente manera:

<ejemplo color="1"></ejemplo>
<ejemplo color="azul marino"></ejemplo>

Los siguientes casos darían un error de validación:

<ejemplo color=""></ejemplo><!-- ERROR: no admite vacío -->
<ejemplo color="2*2"></ejemplo> <!-- ERROR: hay un asterisco -->

ENTITY

El valor de un atributo será una entidad de la cual se indica el nombre, se debe de declarar en el DTD.

ENTITIES

El valor del atributo será una lista de nombres de entidades (que deben declararse en el DTD) separadas por espacios.

Enumeración

En este caso el valor del atributo debe de ser uno de una lista de valores posibles cada uno de los cuales se separa del siguiente mediante el símbolo |.

Ejemplo:

<!ATTLIST persona sexo (Hombre | Mujer) #REQUIRED >

Las personas sólo podrán especificar como sexo "Hombre" o "Mujer" y nada más:

<persona sexo="Varón">Javier Ruiz</persona>

El código anterior XML fallaría ya que el atributo sexo no admite el valor "Varón".

<!DOCTYPE ejemplo [
<!ELEMENT ejemplo EMPTY>
<!ATTLIST ejemplo color (azul | blanco | rojo) #REQUIRED>
]>

En el documento XML podría aparecer escrito de la siguiente manera:

<ejemplo color="azul"></ejemplo>

El siguiente caso darían un error de validación:

<ejemplo color=""></ejemplo><!-- ERROR: no admite vacío, no está entre los valores declarados -->
<ejemplo color="verde"></ejemplo> <!-- ERROR: "verde"no está en la lista de valores -->

Limitaciones de los esquemas DTD:

  • Un DTD no es un documento XML, luego no se puede verificar si está bien formado.
  • No se pueden fijar restricciones sobre los valores y atributos, como su tipo de datos, su tamaño, etc.
  • No soporta espacios de nombres.
  • Sólo se puede enumerar los valores de los atributos, no de los elementos.
  • Sólo se puede dar un valor por defecto para atributos, no para elementos.
  • Existe un control limitado sobre las cardinalidades de los elementos, es decir, concretar el número de veces que pueden aparecer.

Ejemplo XML y DTD asociada

agenda.xml

<!--?xml version="1.0" encoding="UTF-8"?-->

<agenda>
   <contacto codigo="c001">
      <nombre>Juan</nombre>
      <apellidos>Marquez</apellidos>
      <movil empresa="movistar">656773221</movil>
      <movil>666123432</movil>
      <fijo>912343820</fijo>
      <movil>609398271</movil>
      <email tipo="trabajo">juan@ticarte.com</email>
      <sexo>
         <hombre></hombre>
      </sexo>
      <comentarios></comentarios>
   </contacto>
   <contacto codigo="c002">
      <nombre>Maria</nombre>
      <apellidos>Bonilla</apellidos>
      <movil empresa="movistar">665343092</movil>
      <movil>666232096</movil>
      <fijo>923430675</fijo>
      <email tipo="personal">maria@ticarte.com</email>
      <sexo>
         <mujer></mujer>
      </sexo>
      <pareja codigo="c001">Juan</pareja>
      <comentarios>Llamar solo por la mañana.</comentarios>
   </contacto>
</agenda>

agenda.dtd

<!ELEMENT agenda (contacto*)>
<!ELEMENT contacto (nombre, apellidos, (movil|fijo)*, email?, sexo?, pareja?, comentarios? )>
<!ELEMENT nombre (#PCDATA)><br><!ELEMENT apellidos (#PCDATA)>
<!ELEMENT fijo (#PCDATA)><br><!ELEMENT movil (#PCDATA)>
<!ATTLIST movil empresa CDATA #IMPLIED>
<!ELEMENT email (#PCDATA)>
<!ATTLIST email tipo (personal|trabajo) #REQUIRED>
<!ELEMENT sexo (hombre|mujer)>
<!ELEMENT hombre EMPTY>
<!ELEMENT mujer EMPTY>
<!ELEMENT pareja (#PCDATA)>
<!ATTLIST pareja codigo IDREF #IMPLIED>
<!ELEMENT comentarios ANY>



Creado con eXeLearning (Ventana nueva)