Definicje typu dokumentu
Definicje typu dokumentu (DTD) są podstawą budowy wszelkich
szczegółowych języków opartych na SGML-u i XML-u. Określają one,
jakie znaczniki mogą pojawić się w treści dokumentu, w jakiej
kolejności i jakie mogą mieć atrybuty. Weźmy pod uwagę podany w
tekście przykład dokumentu zawierającego kursy walut. Definicja typu
dokumentu może być zawarta bezpośrednio w dokumencie lub zapisana w
osobnym pliku, do którego w dokumencie umieszczamy tylko odwołanie.
Możliwe jest też połączenie tych dwu możliwości - ogólna część
definicji, opisująca całą klasę podobnych dokumentów, zawarta jest w
zewnętrznym pliku, natomiast specyficzne elementy charakterystyczne
tylko dla tego dokumentu zawarte są wewnątrz.
Tak oto wygląda dokument z odwołaniem do zewnętrznej DTD
zawartej w pliku gielda.dtd:
<?xml version="1.0"?>
<!DOCTYPE GIEŁDA SYSTEM "gielda.dtd">
<GIEŁDA>
<TYTUŁ>Kursy walut z dnia <DATA>01.10.1999</DATA></TYTUŁ>
<KURS WALUTA="USD">4,0662</KURS>
<KURS WALUTA="GBP">6,7184</KURS>
<KURS WALUTA="DEM">2,2364</KURS>
<KURS WALUTA="FRF">0,6668</KURS>
</GIEŁDA>
W deklaracji !DOCTYPE najpierw występuje nazwa elementu, który jest
głównym elementem dokumentu - w tym przypadku jest to GIEŁDA. Użycie
deklaracji !DOCTYPE z inną nazwą byłoby w tym dokumencie niepoprawne.
Parametr SYSTEM informuje, że właściwa definicja typu dokumentu
zapisana jest w pliku gielda.dtd - oto jej treść (zamiast
odwoływać się do dodatkowego pliku, poniższą definicję moglibyśmy
również w całości umieścić wewnątrz dokumentu):
<!DOCTYPE GIEŁDA [
<!ELEMENT GIEŁDA (TYTUŁ?,KURS*)>
<!ELEMENT TYTUŁ (#PCDATA|DATA)*>
<!ELEMENT DATA (#PCDATA)>
<!ELEMENT KURS (#PCDATA)>
<!ATTLIST KURS
WALUTA CDATA #REQUIRED
TYP (sprzedaż|kupno|średni) "średni"
>
]>
Definicja ta mówi nam, iż:
- element GIEŁDA składa się z opcjonalnego elementu TYTUŁ (znak ?
po nazwie elementu), po którym może wystąpić dowolna liczba - w tym
także zero - elementów KURS (znak * po nazwie elementu).
W szczególności zatem zawartość elementu GIEŁDA może być pusta.
Gdyby przy nazwie elementu KURS zamiast gwiazdki znajdował się znak
+, element ten musiałby wystąpić przynajmniej raz.
- element TYTUŁ może zawierać mieszaną zawartość: dowolny tekst bez
znaczników (#PCDATA) i/lub element(y) DATA. Kolejność jest dowolna.
- elementy DATA i KURS zawierają dowolny tekst.
- element KURS musi mieć atrybut WALUTA (#REQUIRED), którego wartością
jest dowolny tekst (CDATA) i może (ale nie musi) mieć atrybut TYP,
mogący przybierać jedną z trzech wartości: "sprzedaż", "kupno" lub
"średni", przy czym w razie opuszczenia atrybutu przyjęta będzie
wartość domyślna "średni".
Nie będzie zatem poprawny dokument, w którym np.:
- element TYTUŁ występuje pomiędzy elementami KURS lub po nich,
- występuje więcej niż jeden element TYTUŁ,
- znacznik KURS pozbawiony jest atrybutu WALUTA,
- występują jakiekolwiek inne znaczniki, nie wymienione w DTD.