DTD

**DTD** () on yksi  SGML- ja XML- kielten yhteydessä käytetyistä rakennemäärittelytavoista. DTD määrittelee rakenteisen dokumentin sallitut ilmenemismuodot elementeille ja attribuuteille siten että määrittelystä muodostuu uusi merkintäkieli.

## Käytettävät avainsanat

DTD:llä määritellään dokumentin rakenne käyttämällä seuraavia avainsanoja: 

* **DOCTYPE**: määrittelyn aloitus (liittäminen dokumenttiin)
* **ENTITY**: määrittelee entiteetin ja sen sisällön
* **ELEMENT**: määrittelee elementin ja sen sisällön
* **ATTLIST**: määrittelee elementin attribuuttilistan
* **NOTATION**: määrittelee notaatiotyypin
* **SHORTREF**: määrittee käytettäviä lyhenteitä
* **USEMAP**: määrittelee elementissä käytettävät lyhenteet

## Liittäminen dokumentteihin

DTD liitetään dokumentteihin lisäämällä dokumenttityyppimäärittely avainsanalla **DOCTYPE**, joka on aina dokumentin alussa (XML:ssä aina XML- määrittelyn jälkeen) annettava merkintä. Merkintä määrittelee, että mikä on DTD:n tunniste ja sijainti, sekä sen mistä DTD:n elementistä kyseisen dokumentin rakenne alkaa. Merkintään voidaan liittää myös sisäisiä rakennemäärittelyjä siten että ulkoista määrittelyä ei tarvita välttämättä lainkaan. 

### Ulkoinen määrittely


```
<!DOCTYPE html PUBLIC
          "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
```


Määrittelyssä *html* kertoo että tämä dokumentti alkaa elementillä *html* ja että rakenteen tarkastus pitäisi aloittaa siitä elementistä. *PUBLIC* määrittelee että seuraava merkkijono on DTD:n julkinen tunniste, jota voidaan käyttää hyväksi DTD:n hakemisessa esimerkiksi sovelluksen omasta DTD- hakemistosta. DTD:n tunnisteena tässä toimii "*-//W3C//DTD XHTML 1.0 Transitional//EN*" ja sitä vastaava tiedosto löytyy osoitteesta "*http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd*" jos tunnisteen perusteella ei löytynyt paikallista kopiota. Ulkoiseen tiedostoon voidaan viitata suoraan ilman tunnistetta käyttämällä merkinnän *PUBLIC* sijaan merkintää *SYSTEM*. 

### Sisäinen määrittely


```
<?xml version="1.0"?>
<!DOCTYPE juuri [ <!ENTITY moikkaus "Moi!"> ]>
<juuri>&moikkaus;</juuri>
```


Tässä määritellään että XML- dokumentti alkaa elementillä *juuri*, mutta mitään ulkoisia määrittelyjä ei anneta. Sen sijaan hakasulkeiden sisällä määritellään sisäisesti yksi entiteetti nimeltä *moikkaus*. Entiteettiä käytetään elementin *juuri* sisällä siten, että sen paikalle tulee teksti *Moi!*. 

## Esimerkkejä

### XHTML

XHTML- merkintäkielen DTD määrittelee että dokumentin juurielementtinä pitää aina olla  *html*, ja että *html* elementin alla on aina ensimmäisenä elementti *head* ja toisena elementti *body*. Vastaavasti DTD määrittelee näiden elementtien sallitut tai vaaditut attribuutit. 

Esimerkkinä ote XHTML DTD:stä:


```
<!ELEMENT html (head, body)>
<!ATTLIST html
  %i18n;
  id          ID             #IMPLIED
  xmlns       %URI;          #FIXED 'http://www.w3.org/1999/xhtml'
>
```


### HTML

DTD voi myös määritellä rakenteita siten, että vaikka varsinaisessa dokumentissa ei ole elementille merkintää (niin sanottuja *tägejä*), on dokumentti kuitenkin tulkittava siten että elementti on annettu. Esimerkiksi HTML- merkintäkielen DTD määrittelee että juurielementin *HTML* voi jättää merkitsemättä. 

Esimerkkinä ote HTML DTD:stä (merkintä "*O O*" tarkoittaa että alku- ja lopputägejä ei tarvitse merkitä):


```
<!ELEMENT HTML O O (%html.content;)    -- document root element -->
<!ATTLIST HTML
  %i18n;                               -- lang, dir --
>
```


## Lisää aiheesta

* W3Schools 

## Lähteet