Trots att det inte finns några krav (men det kan ändras) på att XML-dokument ska stödja sig på en DTD förväntar sig XML-behandlare (parser) att hitta en sådan. Utan en gällande regelsamling kan inte behandlaren bedöma om ett dokument validerar och därmed är giltigt. Det är först med en DTD "i sin hand" som behandlaren kan jämföra om dokumentets grammatik överensstämmer med den grammatik som gäller för just denna typ av dokument. Därför bör varje XML-dokument kopplas till en tillhörande DTD.
DTDn kan skrivas i ett separat dokument och återanvändas med alla dokument av samma typ eller inkluderas i dokumentinstansen. Självfallet är det det första sättet att föredra. Dokumentet skrivs i en valfri texteditor och brukar sparas med tillägget .dtd.
Reglerna skrivs i form av olika deklarationer, s.k. SGML-deklarationer.
En deklaration kan jämföras med en processinstruktion. Den innehåller information om de olika objekt som kan förekomma i ett dokument samt vilka regler som gäller för dessa objekt. En DTD får endast innehålla deklarationer. Även "vanligt" text, t ex kommentarer till läsaren, skrivs i form av deklarationer.
Med undantag för just kommentarer är alla deklarationer strukturerade på samma sätt.
<!NYCKELORD (objekt som deklareras) (regler för detta objekt)>
<! |
<!NYCKELORD (objekt som deklareras) (regler för detta objekt)> Öppnar en deklaration. Dessa två tecken betraktas som ett och får inte innehålla några mellanslag. Direkt efter dessa två tecken, dvs utan några mellanslag, följer |
NYCKELORD |
<!NYCKELORD (objekt som deklareras) (regler för detta objekt)> Talar om vilken typ av deklaration det handlar om. Här skrivs vad som definieras, t ex: Om dokumenttypen definieras är nyckelordet DOCTYPE |
objekt |
<!NYCKELORD (objekt som deklareras) (regler för detta objekt)> s.k. Generic Identifier (GI) då den namnger och därmed identifierar det objekt som definieras, t ex: Om dokument av typen bok definieras är objektet bok |
regler |
<!NYCKELORD (objekt som deklareras) (regler för detta objekt)> (eller parametrar) som gäller för det identifierade objektet, t ex: Om dokumenttypen deklareras hänvisar reglerna till dess version och DTDn |
> |
<!NYCKELORD (objekt som deklareras) (regler för detta objekt)> Stänger deklarationen |
Varje typ av objekt definieras för sig och bara en gång. I DTDn definierar man dokumenttypens grammatik. Därför heter dokumentet Dokumenttypsdefinition (Document Type Definition). DTDn måste innehålla alla gällande regler. Man resonerar så att om en regel inte uttryckligen är definierad så gäller den inte, dvs den är otillåten.
Deklarationerna kan skrivas i en valfri editor och på ett valfritt språk. Ska DTDn skrivas på svenska bör följande instruktion inkluderas på den absolut första raden i DTDn:
<?xml encoding="ISO-8859-1"?>
Det finns inget krav på att en parser ska stödja andra teckenuppsättningar än standard UTF-8 och UTF-16. De flesta stödjer dock de latinska tecken. Ändå rekommenderar man att än så länge inte använda svenska tecken för att undvika eventuella kraschar.
Dokumenttypsdefinitionen brukar man spara med tillägget .dtd. För att lätt kunna åtskilja de olika DTDerna är det också vedertaget att döpa dem efter rotelementet / dokumenttypen, t ex artikel.dtd om rotelementet / dokumenttypen har namnet artikel.
Deklarationerna i DTDn kallas för uppmärkningsdeklarationer. Såsom namnet antyder definierar uppmärkningsdeklarationer dokumentets uppmärkning. Det finns fyra sådana deklarationer:
Exempel:
<!NYCKELORD (objekt som deklareras) (regler för detta objekt)>
<!DOCTYPE (dokumenttyp) (regler för denna dokumenttyp)>
<!ENTITY (entitetsnamn) (entitetens innehåll)>
<!ELEMENT (elementtyp) (förekomstregler för denna elementtyp)>
<!ATTLIST (för elementtyp) (attributlista för denna elementtyp)>
Förutom namn på element eller attribut innehåller deklarationerna ett antal olika tecken. Varje tecken har en mycket speciell funktion. De är ordningsoperatorer, antalsindikatorer och teckendata.
Ordningsoperatorer, sekvensoperatorer, talar om i vilken följd elementet (eller gruppen av element) som finns före och efter operatorn får förekomma i dokumentet eller föräldraelementet.
, |
Alla deklarerade objekt måste förekomma i en sekvens och dessutom i samma följd som de deklareras. <!ELEMENT meta-info (titel, skribent)> meta-info måste följas av titel som i sin tur måste följas av skribent <meta-info> |
| |
Betyder eller. Det definierade objektet måste innehålla minst ett av de i deklarerade objekten. Antingen det före operatorn eller det efter operatorn. <!ELEMENT meta-info (titel | skribent)> <meta-info> |
& |
Alla objekt före eller efter operatorn måste förekomma. Följden är dock valfri. <!ELEMENT meta-info (titel & skribent)> <meta-info> |
Antalsindikatorer talar om hur många gånger ett objekt (eller en grupp av objekt) till vänster om indikatorn får förekomma i dokumentet.
Ingen indikator |
Objektet får förekomma en gång och bara en gång. <!ELEMENT meta-info (titel, skribent)> Varken titel eller skribent får repeteras. |
+ |
Objektet till vänster om indikatorn får förekomma en eller flera gånger <!ELEMENT meta-info (titel & skribent+)> titel kan förekomma bara en gång medan skribent kan repeteras. <meta-info> |
* |
Objektet till vänster om indikatorn får förekomma noll eller flera gånger <!ELEMENT meta-info (titel | skribent*)> titel kan förekomma bara en gång medan skribent kan repeteras eller inte alls förekomma. <!ELEMENT meta-info (titel | skribent)*> både titel och skribent kan repeteras. |
? |
Objektet till vänster om indikatorn får förekomma noll eller en gång <!ELEMENT meta-info (titel, skribent?)> om skribent finns över huvud taget får det förekomma bara en gång. |
Tckendata är all text som inte är uppmärkning. Teckendata är helt enkelt en teckenuppsättning som får användas i dokument. Det finns två sådana uppsättningar:
#PCDATA är analyserade (behandlade) teckendata - i vardagslivet kallar man dem för text. De får innehålla alla de tecken som finns i teckenuppsättningen samt entityreferenser som kommer att beskrivas längre fram. Stegen framför PCDATA indikerar att det som följer är ett speciellt ord och inte en typ av element.
Om #PCDATA innehåller entitetsreferenser expanderas de till sitt egentliga innehåll, t ex entitetsreferensen Ä expanderas till Ä.
CDATA är en teckensekvens (bokstäver, siffror, speciella tecken) inklusive entitetsreferenser (beskrivs nedan) ur dokumentets teckenuppstättning. Vilka teckensekvenser CDATA får innehålla beror på dess förekomst, dvs om den förekommer i element, attribut eller CDATA-sektionen.
Om CDATA definieras i innehållsmodellen innebär detta att elementets innehåll är en textsträng utan starttagg-avgränsarna.
Om CDATA är ett attributvärde är dess innehåll specifikt för värdetyp. Varje värdetyp, t ex ID eller IDREF, har sin egen teckensekvens. Skillnaderna mellan de olika teckensekvenserna är marginella.
Om CDATA innehåller entitetsreferenser expanderas de till sitt egentliga innehåll.
I CDATA-sektioner visas innehållet som vanlig text, inklusive de tecken som i vanliga fall representerar dokumentets uppmärkning.