Document Type Definition
DTD (ang. document type definition) – rodzaj dokumentu definiujący formalną strukturę dokumentów XML, HTML, XHTML lub innych pochodzących z rodziny SGML lub XML. Definicje DTD mogą być zawarte w pliku dokumentu, którego strukturę definiują, przeważnie jednak zapisane są w osobnym pliku tekstowym, co pozwala na zastosowanie tego samego DTD dla wielu dokumentów.
DTD określa składnię konkretnej aplikacji XML lub SGML, np. XHTML, EAD, TEI lub innej, zdefiniowanej dla potrzeb użytkownika. Zazwyczaj DTD definiuje każdy dopuszczalny element dokumentu, jego zbiór atrybutów i dopuszczalne wartości. DTD określa także zagnieżdżanie i wymagalność poszczególnych elementów w dokumencie. W praktyce DTD przeważnie składa się z definicji ELEMENT i definicji ATTLIST.
W praktyce ze względu na małe możliwości obecnie DTD jest wypierane przez nowocześniejsze XML Schema, które posiada znacznie większe możliwości oraz nie wymaga stosowania dodatkowej, nie-XML-owej składni.
Przykład bardzo prostego użycia DTD osadzonego wewnątrz dokumentu XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE osoba [
<!ELEMENT osoba (imie, drugieImie, nazwisko)>
<!ELEMENT imie (#PCDATA)>
<!ELEMENT drugieImie (#PCDATA)>
<!ELEMENT nazwisko (#PCDATA)>
]>
<osoba>
<imie>Amadeusz</imie>
<drugieImie>Zenon</drugieImie>
<nazwisko>Kowalski</nazwisko>
</osoba>
Dokument pokazany powyżej jest poprawny składniowo (ang. well-formed) oraz strukturalnie (ang. valid). Użyte wcięcia są „dobrym zwyczajem” mającym na celu uwypuklenie drzewiastej struktury dokumentu, a kodowanie UTF-8 w systemie Unicode jest zalecane przez konsorcjum W3C i „zdrowy rozsądek”.
Stosowanie zewnętrznych DTD
Oprócz metody umieszczania DTD bezpośrednio w dokumencie XML można także stosować odwołanie zewnętrzne na dwa sposoby:
- identyfikator systemowy
- identyfikator publiczny
Zasada identyfikatora systemowego jest podobna do umieszczania stylu CSS wewnątrz HTML-a, tzn. należy podać nazwę elementu głównego (root element) oraz adres URI (np. URL), np.:
<!DOCTYPE osoba SYSTEM "naszaDefinicja.dtd">
W identyfikatorze publicznym dodatkowo umieszcza się tzw. formalny identyfikator publiczny (formal public identifier, FPI), określony w normie ISO 9070. FPI jest zbudowany na zasadzie -//właściciel//opis//język, np.:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Jest to standardowy budulec stron WWW w XHTML 1.0 Strict. FPI jest informacją dla parsera (np. przeglądarki WWW), który posiada zapisane w pamięci definicje DTD dla „dobrze znanych” FPI. Jeśli parser nie rozpozna zadanego FPI, to posłuży się adresem URI celem pobrania pliku DTD. Inne „dobrze znane” deklaracje DTD, to:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
Określanie liczebności
W DTD istnieją cztery sposoby definiowania kardynalności (liczebności) elementów (zbioru elementów):
Symbol | Znaczenie |
---|---|
bez symbolu | Element lub zbiór elementów występują tylko jeden raz. Jest to sposób domyślny. |
? | Element lub zbiór elementów występują co najwyżej raz. |
+ | Element lub zbiór elementów występują przynajmniej raz. |
* | Element lub zbiór elementów występują dowolną ilość razy. |
Przykładowo dla tak skonstruowanego DTD umieszczonego w pliku o nazwie pracownicy.dtd:
<!ELEMENT pracownicy (pracownik+)>
<!ELEMENT pracownik (daneOsobowe, dział?)>
<!ELEMENT daneOsobowe (imie, drugieImie?, nazwisko)>
<!ELEMENT imie (#PCDATA)>
<!ELEMENT drugieImie (#PCDATA)>
<!ELEMENT nazwisko (#PCDATA)>
<!ELEMENT dział (#PCDATA)>
prawidłowym dokumentem XML jest:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE pracownicy SYSTEM "pracownicy.dtd">
<pracownicy>
<pracownik>
<daneOsobowe>
<imie>Izabela</imie>
<nazwisko>Nowakowska-Jasnorzębska</nazwisko>
</daneOsobowe>
</pracownik>
<pracownik>
<daneOsobowe>
<imie>Zygfryd</imie>
<drugieImie>Zenobiusz</drugieImie>
<nazwisko>Wawrzyniak</nazwisko>
</daneOsobowe>
<dział>Public Relations</dział>
</pracownik>
</pracownicy>
Zgodnie z zasadami budowy poprawnego składniowego XML-a dokument posiada jeden element główny pracownicy, w którym zgodnie z DTD musi znaleźć się co najmniej jeden element pracownik. Idąc dalej pracownik musi posiadać jeden element daneOsobowe, dział może wystąpić raz albo wcale. W danych osobowych musi wystąpić raz element imie i nazwisko, drugieImie może raz, ale nie musi. Opcjonalny atrybut standalone dodatkowo informuje, że dokument nie występuje „w izolacji”, a jest związany z konkretnym DTD. Ważne jest także zachowanie odpowiedniej kolejności np. element nazwisko nie może wystąpić przed elementem imie.
Określanie kardynalności przez DTD w praktyce może okazać się za mało elastyczne, np. jeśli chce się określić, że dany element ma wystąpić dokładnie 12 razy lub co najwyżej 200 razy. Należy wtedy zastosować inne rozwiązanie np. XML Schema.
Bibliografia
- Praca zbiorowa: Beginning XML, 4th Edition. Wydawnictwo Wrox, 2007.
Linki zewnętrzne
- Kurs DTD na stronach W3Schools. w3schools.com. [zarchiwizowane z tego adresu (2003-12-07)]. (ang.)
- Fragment rekomendacji W3C XML 1.0 dot. DTD (ang.)
- Przykładowy DTD dla danych klimatycznych z serwisu WeerOnline (ang.)