SGML-muotoinen dokumentti koostuu kolmesta osasta: SGML-esittelystä (SGML Declaration), dokumentin tyyppimäärittelystä (Document Type Definition) ja itse dokumentista, jota kutsutaan dokumentin esiintymäksi (Document Instance). Kaikki kolme osaa voivat olla samassa tiedostossa peräkkäin. Tavallisin tilanne on kuitenkin se, että SGML-esittelynä käytetään ohjelmaan sisäänrakennettua oletusesittelyä eikä käyttäjä koskaan sitä edes näe. Dokumenttien tyyppimäärittelyjä voi olla käytössä useitakin mutta nekin ovat yleensä erillisissä tiedostoissa. Niitä tarvitaan vain, jos dokumentin koodauksessa tarvitaan yksityiskohtaista tietoa koodien muodosta tai kieliopillisista seikoista. Useimmiten käyttäjä kirjoittaa jollakin tekstinkäsittelyohjelmalla pelkän dokumentin esiintymän (jatkossa käytän pelkästään nimitystä dokumentti, jolla asiayhteydestä riippuen tarkoitetaan dokumentin alkuperäistä muotoa tai SGML-muotoista, koodattua esitystä).
Aluksi lyhyt esimerkki SGML-koodatusta dokumentista. Sitä käytetään hyväksi myöhemmin standardin tärkeimpien piirteiden esittelyssä.
<!doctype article system "document.dtd"> <article opts="twoside"> <titlepag> <title>Esimerkki dokumentin koodaamisesta <author> <name>Ville Virtanen <inst>Dokumenttien hallinta Oy </author> <date>30.6.1994 </titlepag> <abstract> Dokumentti voi sisältää tiivistelmän, joka useimmiten ladotaan hiukan eri tavalla kuin muu teksti. </abstract> <sect><heading>Dokumentin ensimmäinen luku</heading> <p> Varsinainen tekstiosa dokumentista voidaan jakaa monella tavalla osiin. Dokumentti voi koostua luvuista, jotka koostuvat aliluvuista, jotka koostuvat jaksoista jne. Tässä esimerkkitapauksessa jaotuksessa käytettävät nimet ovat tyyppiä sect, sect1, sect2, jne. <p> Kappaleet voi erotella tyhjällä rivillä. </sect> </article>
Esimerkissä on suhteettoman paljon koodeja varsinaisen tekstin määrään verrattuna. Normaalisti dokumentin sisällöstä valtaosa on tavallista raakatekstiä, joka sisältää hyvin vähän SGML-koodeja.
Esimerkki on siinä mielessä täydellinen, että se voidaan käsitellä SGML-ohjelmilla kunhan käytettävissä on vain sopiva dokumenttityypin määrittelytiedosto, tässä tapauksessa document.dtd. Päällisin puolin esimerkki muistuttaa HTML-koodattuja WWW:n dokumentteja. Syy tähän on hyvin yksinkertainen, HTML on SGML-pohjainen merkintäkieli ja kaikki SGML-pohjaiset merkintäkielet muistuttavat ulkoasunsa puolesta toisiaan.
SGML-esittelyn tärkeimpänä tarkoituksena on määritellä käytettävä merkkivalikoima (tavallisimmin ISO Latin 1, eli ISO 8859-1) ja koodauksessa käytettävät tärkeimmät erikoismerkit. SGML-koodaus perustuu erityisten merkintäkoodien (tagien) eli erottimien käyttöön. Jokaisen tekstielementin alussa on alkuerotin, lopussa on mahdollisesti loppuerotin. Esimerkiksi henkilön nimi voidaan dokumentissa ilmaista muodossa:
<name>Ville Virtanen</name>
Alkuerotin on <name> ja loppuerotin </name>. Kulmasulut ja kauttaviiva ovat tässä tapauksessa tärkeimmät koodauksessa käytettävät erikoismerkit. Ne ovat itse asiassa samat kuin varsinaisessa standardissa. Niitä ei ole kuitenkaan pakko käyttää. Jos on aivan erityisiä syitä, nekin merkit voidaan vaihtaa joksikin muiksi. Uudet koodauksessa käytettävät erikoismerkit esitellään SGML-esittelyssä.
Esittelyssä hoidetaan myös eri tietokoneiden käyttämien erilaisten merkistöjen eroista aiheutuvat ongelmat. Tietokoneet eivät käsittele näkyviä merkkejä (esim. kirjainmerkki `A') vaan merkkejä vastaavia numeroarvoja. Kirjainmerkkiä `A' vastaava numeroarvo ASCII-koodissa on 65, IBM:n tietokoneiden käyttämässä EBCDIC-koodissa 193 (kumpikin luku on ilmaistu 10-järjestelmässä). Numeroarvojen ohella merkistöt poikkeavat toisistaan myös merkkivalikoimien osalta. Esimerkiksi ASCII-merkit on alunperin suunniteltu pelkästään englannin kielen tarpeiden mukaan. Siitä puuttuvat kokonaan mm. skandinaaviset kirjaimet. ISO Latin 1 ne sen sijaan sisältää.
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 sen vuoksi perusideat on syytä opetella 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 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.
Dokumentin alussa kerrotaan, että käsillä oleva dokumentti on tyyppiä article ja että siinä käytettävät merkinnät perustuvat tyyppimääritykseen document.dtd (lyhyesti DTD).
Artikkeli kokonaisuudessaan sijoittuu alkuerottinen <article> ja loppuerottimen </article> väliin. Dokumentin alkuerottimessa ilmoitettu attribuutti täsmentää sen käsittytapaa. Artikkeli on tarkoitus tulostaa kaksipuolisena.
DTD:n toiselta riviltä alkaen (<!ELEMENT article ...) nähdään artikkelin määritelty rakenne. Se koostuu pakollisesta otsikkosivusta, valinnaisesta abstraktista, valinnaisesta sisällysluettelosta, tekstin alkuosaan sijoittuvasta otsikottomasta joukosta kappaleita, joka voi myös puuttua (p*) ja niiden jälkeen tulevista luvuista ja aliluvuista. Artikkelin lopussa on vielä valinnainen liite ja valinnainen kirjallisuusluettelo.
Dokumentin rakenteen kuvaus perustuu elementteihin, jotka jakaantuvat edelleen elementeiksi ja lopulta koostuvat merkkijonoista tai vakiosymboleista. Elementtejä ja niistä muodostettuja nimeämättömiä rakenneosia ryhmitellään alla esitettävien sääntöjen mukaan sulkujen avulla.
Lukumääriä ohjaavat erikoismerkit elementtinimien ja rakenneosien lopussa tarkoittavat seuraavaa. Elementtinimi ilman erikoismerkkiä tarkoittaa, että elementti on pakollinen, se voi esiintyä ainoastaan kyseisessä kohdassa ja vain kerran (titlepag). Elementtinimeä seuraava kysymysmerkki ilmaisee, että elementti on valinnainen (abstract?). Elementtinimeä seuraava `+'-merkki tarkoittaa, että elementin on esiinnyttävä kyseissä kohdassa vähintään kerran (sect+). Elementtinimen perässä oleva kertomerkki ilmaisee, että kyseinen elementti voi esiintyä kyseisessä kohdassa kuinka monta kertaa hyvänsä tai olla esiintymättä lainkaan (p*).
Indeksien ja sanastojen tekemistä varten on tekstiin voitava vapaasti sijoittaa tarpeellisia merkintöjä. Samoin ala- ja loppuviitteitä voi olla lähes missä kohdassa tahansa. Näiden varalta on käytettävissä poikkeusmerkintä, josta esimerkkinä on DTD:n alaviitteiden määrittely +(footnote).
Pilkut eri rakenneosien välissä ilmaisevat, että rakenneosien on oltava täsmälleen määritellyssä järjestyksessä. Pystyviiva elementtien välissä tarkoittaa vaihtoehtoa, kyseiseen kohtaan tulee jompikumpi pystyviivalla erotetuista rakenneosista. Jos rakenneosien välissä on `&'-merkki, se tarkoittaa, että kyseiseen kohtaan tulevat molemmat rakenneosat jommassa kummassa järjestyksessä.
Esimerkkidokumentissa artikkelin alussa oleva otsikkosivu on alku- ja loppuerottimien avulla rajattu. Erottimien pakollisuus tai valinnaisuus ilmaistaan DTD:ssä elementin nimen ja sisällön määrittämisen välissä olevilla `O' (optionaalinen, eli valinnainen) ja `-' (pakollinen) merkeillä. Esimerkiksi nimekkeen (title) alkuerotin on pakollinen mutta loppuerotin ei.
Nimekkeen sisältömäärityksenä on (#PCDATA) ja se tarkoittaa, että nimeke koostuu nollasta tai useammasta dokumentissa käytetyn merkistön mukaisesta merkistä. Sana ei viittaa mikrotietokoneen merkistöön, akronyymi auki kirjoitettuna on parced data characters.
Suurin osa esimerkkidokumentin ja DTD:n riveistä on samantapaisia kuin edellä esitellyt rivit. DTD:stä on varsinaisesti esittelemättä enää vain attribuuttilista ja yksi entiteetti.
Dokumentin elementtiin article voi liittyä attribuutteja ja tätä mahdollisuutta on käytettykin dokumentin koodauksessa (tulostus kaksipuolisena). DTD:ssä attribuutit määritellään elementtikohtaisesti attribuuttilistan avulla. Tässä tapauksessa artikkelilla voi olla yksikäsitteinen tunniste ID, jolle ei ole määritelty mitään oletusarvoa. Dokumentin käsittelytapaa täsmentävä optio on merkkijono, jonka oletusarvona on tyhjä merkkijono.
Entiteetti sect on DTD:n kirjoittamisessa käytetty lyhennysmerkintä. Entiteettimäärityksen jälkeen olevilla riveillä merkintä %sect korvataan aina entiteetin arvolla ``heading, p* ''. Entiteettien tavallisin käyttötapa on erikoismerkkien yhteydessä. Jos tekstin joukkoon halutaan esimerkiksi merkki `<' sellaisenaan, on käytettävä entiteettiä `<'. Ampersandi eli `&'-merkki ilmaistaan entiteetillä `&'.