Atributs en un DTD

Ja sabem declarar elements, ara vorem com es declaren els atributs associats a un element.

Recordem…

Els atributs en Document Type Definition (DTD) en XML són elements clau que es poden utilitzar per proporcionar informació addicional sobre els elements dins del document XML.

  • Els atributs van insertats en els elements.
  • Estan formats per parells NOM-VALOR.
  • Els valors van entre “ “.
  • Poden ser obligatoris, opcionals , fixes…
  • Normalment accepten valors de text, números, llistes de possibles valors, etc.

En XML podem definir els nostres propis atributs dins dels elements. Per exemple l’atribut país a l’etiqueta f1:

<esportistes>
  <f1 país="Països Baixos">Max Verstappen</f1>
  <f1>Carlos Sainz</f1>
  <tenis>Carlos Alcaraz</tenis>
</esportistes>

- Els atributs

  • Permeten afegir informació addicional als elements d’un document.
  • No poden contenir sub-atributs.
  • S’usen per afegir informació curta, senzilla i desestructurada.

- Cadascun dels atributs

  • Només es pot especificar una vegada
  • Pot aparéixer en qualsevol ordre.

Declaració d’atributs en DTD

La sintaxi per declarar un atribut és:


<!ATTLIST nomElement nomAtribut tipusAtribut valorInicialAtribut >

On:

  • !ATTLIST : Declaració de marca per a un atribut o llista d'atributs.
  • nomElement : Identificador de l'element al que s'aplica l'atribut.
  • nomAtribut : Nom de l'atribut.
  • tipusAtribut : Tipus.
  • valorInicialAtribut : Valor per defecte.

Exemple

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mensajes [
  <!ELEMENT mensajes (mensaje+)>
  <!ELEMENT mensaje (de, a, texto)>
  <!ATTLIST mensaje prioridad (normal|urgente) "normal">
  <!ELEMENT de (#PCDATA)>
  <!ELEMENT a (#PCDATA)>
  <!ELEMENT texto (#PCDATA)>
  <!ATTLIST texto idioma CDATA #REQUIRED>
]>
<mensajes>
  <mensaje prioridad="urgente">
    <de>Alfredo Regno</de>
    <a>Hans van Parijs</a>
    <texto idioma="holandés">
      Trobo Hans, hoe gaat het? ...
    </texto>
  </mensaje>
</mensajes>
  • L’atribut prioridad pot estar en <mensaje> i pot tindre el valor “normal” o “urgente”, sent “normal” el valor per defecte si no especifiquem l’atribut.
  • Podem establir la necessitat o no d’especificar cada atribut.
  • L’atribut idioma, pertany a <texto>, i pot contindre dades de caràcter (CDATA).
  • #REQUIRED: indica que és obligatori especificar aquest atribut.

Tipus d’Atributs

Els atributs en un DTD poden tindre diversos tipus de valors, segons el tipus d’informació que contenen. Aquesta classificació permet controlar millor la validació dels documents XML i assegurar que els valors siguen coherents

Els principals tipus d’atributs són els següents:


1. CDATA

Els atributs de tipus CDATA accepten caràcters de dades, és a dir, text lliure. Són els més senzills i flexibles, ja que poden contindre qualsevol seqüència de caràcters vàlids en XML.

<!ATTLIST element atribut CDATA #REQUIRED>

Exemple:

<!DOCTYPE missatge [
  <!ELEMENT missatge (#PCDATA)>
  <!ATTLIST missatge data CDATA #REQUIRED>
]>
<missatge data="15/07/2024">Benvinguts!</missatge>

L’atribut data pot contindre qualsevol text. Si no s’especifica en el document, es considerarà no vàlid perquè està declarat com #REQUIRED.


2. NMTOKEN

El tipus NMTOKEN restringeix el valor de l’atribut a una sola paraula composta per caràcters permesos en XML (lletres, números, guions, punts o subratllats). No pot contindre espais.

<!ATTLIST empleat codi NMTOKEN #REQUIRED>

Exemple:

<empleat codi="emp_001"/>

✅ Vàlid

<empleat codi="emp-001"/>

❌ No vàlid (perquè conté un espai)

<empleat codi="emp 001"/>

3. NMTOKENS

El tipus NMTOKENS és similar a NMTOKEN, però permet una llista de paraules separades per espais. És útil quan un atribut ha de contindre diversos valors.

<!ATTLIST contacte telefonos NMTOKENS #IMPLIED>

Exemple:

<contacte telefonos="612345678 698745632 987654321"/>

Ací l’atribut telefonos accepta diversos números separats per espais.


4. ENUMERAT

Els atributs de tipus enumerat limiten el valor possible a una llista tancada d’opcions predefinides dins de la declaració DTD. És molt útil per garantir uniformitat.

<!ATTLIST cotxe marca (Ford | Toyota | Honda) "Ford">

Exemples:

✅ Vàlid

<cotxe marca="Honda"/>

❌ No vàlid

<cotxe marca="Renault"/>

Si no s’indica cap valor, l’atribut marca tindrà per defecte "Ford" (valor entre cometes al final de la declaració).


5. ID

El tipus ID s’utilitza per crear identificadors únics dins del document XML. Cap altre element pot tindre el mateix valor d’ID.

<!ATTLIST element id ID #REQUIRED>

Regles importants:

  • Cada valor ID ha de ser únic en tot el document.
  • Ha de començar amb una lletra o subratllat, i no pot contindre espais.

Exemple:

<producte id="p001"/>
<producte id="p002"/>

✅ Vàlid

<producte id="001"/> <!-- No vàlid: comença amb número -->

6. IDREF

El tipus IDREF permet crear referències a valors d’atributs ID ja declarats. Serveix per relacionar elements dins del mateix document.

<!ATTLIST empleat cap IDREF #IMPLIED>

Exemple:

<!DOCTYPE empresa [
  <!ELEMENT empresa (empleat+)>
  <!ELEMENT empleat (#PCDATA)>
  <!ATTLIST empleat id ID #REQUIRED>
  <!ATTLIST empleat cap IDREF #IMPLIED>
]>
<empresa>
  <empleat id="e1">Anna</empleat>
  <empleat id="e2" cap="e1">Marc</empleat>
</empresa>

L’atribut cap="e1" fa referència a un altre element amb id="e1".


7. IDREFS

El tipus IDREFS és una extensió d’IDREF que permet indicar múltiples referències separades per espais.

<!ATTLIST projecte membres IDREFS #IMPLIED>

Exemple:

<!DOCTYPE empresa [
  <!ELEMENT empresa (empleat+, projecte+)>
  <!ELEMENT empleat (#PCDATA)>
  <!ATTLIST empleat id ID #REQUIRED>
  <!ELEMENT projecte (#PCDATA)>
  <!ATTLIST projecte membres IDREFS #IMPLIED>
]>
<empresa>
  <empleat id="e1">Anna</empleat>
  <empleat id="e2">Marc</empleat>
  <empleat id="e3">Carla</empleat>
  <projecte membres="e1 e3">Projecte A</projecte>
</empresa>

Ací, el projecte té com a membres els empleats amb identificadors e1 i e3.


8. ENTITAT i ENTITATS

Els atributs ENTITAT i ENTITATS permeten referir-se a entitats declarades prèviament dins del DTD.

  • ENTITAT → una sola entitat.
  • ENTITATS → diverses entitats separades per espais.
<!ATTLIST llibre idioma ENTITAT #IMPLIED>
<!ATTLIST document referencies ENTITATS #IMPLIED>

Exemple complet:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE biblioteca [
  <!ELEMENT biblioteca (llibre+)>
  <!ELEMENT llibre (titol, autor)>
  <!ELEMENT titol (#PCDATA)>
  <!ELEMENT autor (#PCDATA)>
  <!ENTITY cat "Català">
  <!ENTITY eng "Anglés">
  <!ATTLIST llibre idioma ENTITAT #IMPLIED>
]>
<biblioteca>
  <llibre idioma="&cat;">
    <titol>L’Ombra del Vent</titol>
    <autor>Zafón</autor>
  </llibre>
  <llibre idioma="&eng;">
    <titol>To Kill a Mockingbird</titol>
    <autor>Harper Lee</autor>
  </llibre>
</biblioteca>

9. Exemple resum (ID i IDREF / IDREFS)

Per acabar, un exemple més complet amb relacions reals entre elements mitjançant ID, IDREF i IDREFS:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE musica [
  <!ELEMENT musica (artistes, cancons)>
  <!ELEMENT artistes (artista*)>
  <!ELEMENT artista (#PCDATA)>
  <!ATTLIST artista id ID #REQUIRED>
  <!ELEMENT cancons (canco*)>
  <!ELEMENT canco (#PCDATA)>
  <!ATTLIST canco referencia IDREFS #REQUIRED>
]>
<musica>
  <artistes>
    <artista id="a1">John Lennon</artista>
    <artista id="a2">Bob Dylan</artista>
  </artistes>
  <cancons>
    <canco referencia="a1 a2">Imagine</canco>
    <canco referencia="a1">Give Peace a Chance</canco>
    <canco referencia="a2">Blowin' in the Wind</canco>
  </cancons>
</musica>
  • Cada <artista> té un id únic.
  • Cada <canco> pot fer referència a un o més artistes.
  • Els valors d’IDREFS han de coincidir amb algun ID definit en el document.

En resum…

Tipus d’Atribut Descripció
CDATA Permet qualsevol caràcter de dades (text).
ENUMERAT Només permet valors específics.
NMTOKEN Només permet noms de tokens (seqüències de caràcters alfanumèrics, guions baixos i altres caràcters especials, sense espais).
NMTOKENS És similar a NMTOKEN, però permet una llista de noms de tokens separats per espais.
ID Ha de ser un identificador únic per a l’atribut dins del document.
IDREF Fa referència a l’ID d’un altre element.
IDREFS És una llista de referències a IDs d’altres elements.
ENTITAT Fa referència a un nom d’entitat definida al DTD.
ENTITATS És una llista de noms d’entitats definides.

Valors d’Atributs

  • Els valors dels atributs poden ser literals o referències.
  • En cas de literals, els valors han de coincidir exactament amb els especificats en ENUMERAT o ser de tipus CDATA.
  • Les referències s’utilitzen per a IDREF, IDREFS i ENTITAT, i fan referència a altres elements definits al DTD.
<!ATTLIST coche marca (Ford | Toyota | Honda) "Ford">
<!ATTLIST libro autor CDATA #REQUIRED>
<!ATTLIST empleado jefe IDREF #IMPLIED>

Valors Predeterminats d’Atributs

  • Pots especificar un valor predeterminat per a un atribut que s’utilitzarà si no es proporciona un valor al document XML.
  • Valor entre comilles dobles (“) o simples (‘): L’atribut té valor per defecte.

Els valors predeterminats poden ser:

  • #REQUIRED: L’atribut és obligatori.
  • #IMPLIED: L’atribut és opcional.
  • #FIXED valor: L’atribut té un valor fix que no es pot canviar.

Exemple:

<!ATTLIST persona edad CDATA #REQUIRED>
<!ATTLIST libro idioma CDATA #IMPLIED>
<!ATTLIST coche color CDATA #FIXED "negro">

Exemple Resum (amb DTD extern)

Biblioteca.dtd

<!ELEMENT biblioteca (llibre+)>
<!-- Definim un element llibre amb atributs de diferents tipus -->
<!ELEMENT llibre (titol, autor)>
<!ELEMENT titol (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!-- Atribut de tipus CDATA (dades de caràcter) -->
<!ATTLIST llibre ISBN CDATA #REQUIRED>
<!-- Atribut de tipus NMTOKEN (nom de caràcter sense espais en blanc) -->
<!ATTLIST llibre categoria NMTOKEN #IMPLIED>
<!-- Atribut de tipus ID (identificador únic) -->
<!ATTLIST llibre referencia ID #REQUIRED>
<!-- Atribut de tipus IDREF (referència a un ID existent) -->
<!ATTLIST llibre relacion IDREF #IMPLIED>
<!-- Atribut de tipus IDREFS (una llista de referències a IDs) -->
<!ATTLIST llibre similars IDREFS #IMPLIED>
<!-- Atribut de tipus ENTITAT per idiomes (entitats prèviament definides) -->
<!ATTLIST llibre idiomes ENTITAT #IMPLIED>

Biblioteca.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE biblioteca SYSTEM "biblioteca.dtd" [
  <!ENTITY cat "Català">
  <!ENTITY lat "Llatí">
]>
<biblioteca>
  <llibre ISBN="978-1290" categoria="novel·la" referencia="L1" idiomes="&cat; &lat;">
    <titol>L’Ombra del Vent</titol>
    <autor>Zafón</autor>
  </llibre>
  <llibre ISBN="978-9210" categoria="no-ficció" referencia="L2" relacion="L1" similars="L3 L4">
    <titol>Un llibre d'aprenentatge</titol>
    <autor>Anònim</autor>
  </llibre>
  <llibre ISBN="978-XXXX" categoria="XXXX" referencia="L3">
    <titol>Títol L3</titol>
    <autor>Autor L3</autor>
  </llibre>
  <llibre ISBN="978-XXXX" categoria="XXXX" referencia="L4">
    <titol>Títol L4</titol>
    <autor>Autor L4</autor>
  </llibre>
</biblioteca>