DTD filens konstruktion
Nedan är en liten DTD fil:
<!ELEMENT products (product+)>
<!ELEMENT product (code,price,amount)>
<!ELEMENT code (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT amount (#PCDATA)>
Den kan tolkas som:
Rotnoden måste heta products och skall innehålla mist en
product nod.
Product noden måste innehålla code, price och
amount noder, men bara en av varje.
code, price och amount noderna består av teckendata
DTD beståndsdelar
En DTD kan bestå av tre olika saker:
- ELEMENT
Säger vilka tags som godkänns och hu de skall nästas
- ATTLIST
Säger vilka attribut en tag har
- ENTITY
Makron som innehåller fördefinierade värden
ELEMENT
Bestämmer tags och hur de skall användas.
<!ELEMENT firstname (#PCDATA)>
betyder att det finns ett element (tag) med namnet firstname, som består
av textdata (PCDATA). Taggen får inte ha undernoder. Ex:
<firstname>Putte</firstname>
är OK, medan
<firstname>
<veryfirst>Kalle</veryfirst>
<other>Erik</other>
</firstname>
inte uppfyller DTD:ns krav
<!ELEMENT person (firstname, lastname)>
betyder att elementet person inte har eget data utan skall ha två
undernoder med namnen fisrtnname och lastname (i nämnd ordning). Ex:
<person>
<firstname>Kalle</firstname>
<lastname>Eriksson</lastname>
</person>
Man kan sedan använda kompletterande tecken:
+ betyder att det får finnas flera, men måste finnas minst
en - 1 eller flera
* betyder att det får finnas flera, men får även vara
tomt - 0, en eller flera
? betyder att man inte måste ange detta - 0 eller 1
frånvaro av tecken betyder att det måste förekomma endast en
- 1
Detta betyder att följande:
<!ELEMENT person (firstname,middlename?, lastname, phone+, adress*)>
betyder att en person måste ha ett förnamn, kan ha
ett mellannamn, måste ha ett efternamn, måste ha telefon
men kan även ha flera, kan ha en adress eller flera adresser men måste
inte ha någon. Nedan är några exempel på XML data som
uppfyller detta.
<person>
<firstname>Kalle</firstname>
<lastname>Eriksson</lastname>
<phone>123456</phone>
<phone>321123</phone>
</person>
Om man kobinerar med komma(,) betyder det att elementen måste komma i
den ordning som de satts in. Det finns även en annan möjlighet och
det är att kombinera med |
<!ELEMENT record ( title, ( artist | group ))>
betyder att noden record måste ha en undernod title och
kan ha antingen en artist nod eller en group nod men inte bägge
Det finns mer att säga om DTD och ELEMENT, framför allt om ID och
IDREFS, men för tillfället så nåjer vi os med detta
ATTLIST
Attlist används för att specificera vilka attribut en tag har.
<!ELEMENT song (#PCDATA)>
<!ATTLIST song length CDATA #IMPLIED>
beryder att song taggen har ett attribut som heter length och som är av
CDATA typ (text och/eller siffror). Det är inte obligatoriskt att ange
detta attribut. EX:
<song length="4.22">Do, Re, Mi</song>
<song length="too long">Do, Re, Mi</song>
<song>Do, Re, Mi</song>
Är samtliga korrekta enligt den ATTLISt som skrevs ovan
<!ATTLIST song length CDATA #REQUIRED>
betyder däremot att length måste anges. Detta medför
att med denna DTD beskrivining är inte ovanstående XML fragment korrekt.
<!ATTLIST person sex (M | F) #REQUIRED>
betyder att person taggens sex attribut måste vara M
eller F och måste anges
Om en tag har flera attribut skrivs dessa i samma ATTLIST
<!ATTLIST song length CDATA #REQUIRED
rating
(good | bad | ugly) #IMPLIED
type
CDATA "rock"
extra
CDATA #FIXED "no reason">
Betyder att song taggen måste ha ett length attribut,
kan ha ett rating attribut som i så fall måste vara något
av alternativen good, bad eller ugly
och kan ha en type attribut som kommer att få defaultvärdet
rock om det inte anges
Det finns dessutom ett attribut med namnet extra som alltid har värdet
no reason vad än vi försöker ställa in i XML filen.
Fölljande nyckelord förekommer i en ATTLIST
#IMPLIED -
inte obligatoriskt
#REQUIRED
obligatoriskt
#FIXED "ett värde"
attributet kommer alltid att ha det värde som finns specificerat
"värde"
attributet kommer att ha som defaultvärde det värde som här specificerats
ENTITY
Används för att förbestämma värden (makron)
<!ENTITY adress "West East Street">
betyder att det finns ett fördefinierat namn adress som har värdet
West East Street. Detta kan vara användbart i websammanhang då
man kan göra t.ex. följande:
<!ENTITY logo "images/logo.gif">
vilket gör att man kan använda &logo; var som helt i XML
datat och detta kommer att ersättas med images/logo.gif. Observera
att man alltid måste sätta & före namnet och ett ; (semikolon)
efter. Den vane HTML kodaren känner igen detta. Exakt samma system används
i HTML för t.ex. som sätter in ett hårt mellanslag
i texten.
En annan variant av ENTITY är följande:
<!ENTITY % alternativ "ja | nej | kanske">
Detta används närmast tillsammans med ATTLIST och gör att man
kan skriva
<!ATTLIST what answer (%alternativ;) #REQUIRED>
vilket gör att man måste använda något av alternativen
som specificerats i alternativ ENTITYN