5.5 Dokumentin tyyppimäärittely

SGML:n käyttöönottamisessa tärkein ja eniten työtä vaativa tehtävä on dokumentin tyyppimäärittelyn tekeminen — ellei sitten jokin olemassaolevista tyyppimäärittelyistä kelpaa sellaisenaan. Tavalliselle tekstin kirjoittajalle tyyppimäärittely on abstraktin ja oudon tuntuinen asia. Sen rooli dokumentin rakenteen kuvaamisessa on kuitenkin aivan oleellinen ja siksi perusideat on syytä oppia ymmärtämään.

Dokumentin tyyppimäärittely (DTD, Document Type Definition) on SGML-standardin mukaisesti laadittu muodollinen kuvaus dokumenttien rakenteesta. Tyyppimäärittely laaditaan yleensä niin, että se kattaa johonkin tiettyyn aihapiiriin tai käyttötarkoitukseen kuuluvat, tai jonkin organisaation käyttämät dokumentit. Yhden organisaation dokumenttityyppejä voivat olla esimerkiksi pöytäkirjat, muistiot, selvitykset, pysyväismääräykset, ohjeet ja tiedotteet. Jokaisen dokumenttityypin mukaisia dokumentteja on vaihteva määrä ja dokumentit voivat keskenään olla tietyissä rajoissa vaihtelevan näköisiä.

Dokumentin tyyppimäärittely on eräänlainen formaali kielioppi. Kun jokin dokumentti on koodattu tämän tyyppimäärityksen edellyttämällä tavalla, tietokoneella voidaan yksikäsitteisesti tarkistaa, onko dokumentti todella kyseisen tyyppimäärityksen mukainen. Ohjelma lukee ensin muistiin tyyppimäärityksen ja sen jälkeen käy dokumentin yksityiskohtaisesti läpi. Ohjelma havaitsee, jos dokumentissa on sellaisia rakenneosia, joita tyyppimääritys ei tunne. Ohjelma havaitsee myös, jos dokumentista puuttuu jokin osa, joka on tyyppimäärityksessä määritelty pakolliseksi tai jos rakenneosat esiintyvät väärässä järjestyksessä.

Dokumentin tyyppimäärityksessä määritellään:

Yksinkertainen artikkeleita koskeva dokumentin tyyppimäärittely (document.dtd) näyttää seuraavalta:

<!DOCTYPE dokumentti
[
<!ELEMENT article - - (titlepag, abstract?, toc?, p*, sect+,
          (appendix, sect+)?, biblio?) +(footnote) >
<!ATTLIST article id    ID #IMPLIED  
	 opts  CDATA "null" >
<!ELEMENT titlepag - - (title, author, date?)     > 
<!ELEMENT title - O (#PCDATA)                  > 
<!ELEMENT author - O (name, inst?, (and, name, inst?)*)    > 
<!ELEMENT name O O (#PCDATA) >
<!ELEMENT and - O (#PCDATA) > 
<!ELEMENT inst - O (#PCDATA) >
<!ELEMENT date - O (#PCDATA) >
<!ENTITY % sect "heading, p* " >
<!ELEMENT heading - - (#PCDATA) >
<!ELEMENT sect - O (%sect, (p+ | sect1*)) >
<!ELEMENT sect1 - O (%sect, (p+ | sect2*)) >
<!ELEMENT sect2 - O (%sect, p+) >
<!ELEMENT p - - (#PCDATA) >
]>

Tyyppimäärittely ei ole aivan täydellinen. Se antanee kuitenkin riittävän hyvän mielikuvan asiasta. Tyyppimäärittely on tarkoitettu aiemmin esitetyn esimerkin mukaisen dokumentin määritykseksi. Käyn seuraavassa pääpiirteissään läpi esimerkkidokumentin rinnastamalla sitä tyyppimääritykseen. Käytännössä tyyppimäärittelyt ovat paljon pidempiä ja täynnä vaikeaselkoisia, teknisen tuntuisia yksityiskohtia.