DTD или още Document Type Definition, е стандарт за дефиниране на това, какви валидни елементи и техните атрибути, даденият език за маркиране може да съдържа за да се счита за валиден.
With a DTD, independent groups of people can agree on a standard DTD for interchanging data.
Рабирам това така: можем да имаме custom DTD-та ако искаме да си зададем свой формат на валиден език за маркиране. Тоест, DTD не са нещо твърдо зададено като задължителен формат.
С помощта на DTD можем също да проверяваме дали даден документ, написан на език за маркиране, е валиден.
Пример за XML
DTD дефиницията на даден XML документ може да е или вградена в самият документ, или заредена от външен *.dtd файл.
Тук standalone=“yes“ ще рече, че даденият документ използва вграден DTD, а не извлича такъв от външен файл.
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Ако искаме да отдели DTD дефиницията в отделен *.dtd файл, тогава:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE address SYSTEM "address.dtd">
За какво служи SYSTEM?
За да зададем т.н. Formal Public Identifier.
Със SYSTEM задаваме, че става дума не за предефиниран DTD, а за например наш, custom DTD файл. И посочваме кой е файлът.
Ако имаме PUBLIC вместо SYSTEM, тоагава ще имаме например:
<!DOCTYPE name PUBLIC „-//Beginning XML//DTD Address Example//EN“>
тогава казваме, че искаме да използваме публичен DTD и посочваме неговият Formal Public Identifier.
Елементи на DTD
Вижда се как DTD дефиницията за целият документ се свежда до следната схема:
<!DOCTYPE <коренен таг> [ декларации на отделните елементи ]>
Декларацията на отделният елемент –
<!ELEMENT <таг> (тип на тага)>
За декларация на атрибути към даден елемент използваме:
<!ATTLIST <таг> <има на атрибут> <тип на атрибут> <стойност на атрибут>>
Примерно DTD:
<!ATTLIST payment type CDATA „check“>
Примерен XML:
<payment type=“check“>
По-подробно за Formal Public Identifier
FPI се състои от 4 полета, разделени от // например:
-//W3C//DTD XHTML 1.0 Transitional//EN
поле 1 : Indicates whether the DTD is connected to a formal standard or not. If the DTD hasn’t been approved (for example, you’ve defined the DTD yourself), use a hypen (-). If the DTD has been approved by a nonstandards body, use a plus sign „+“. If the DTD has been approved by a formal standards body this field should be a reference to the standard itself.
поле 2 : Holds the name of the group (or person) responsible for the DTD. The above example is maintained by the W3C, so „W3C“ appears in the second field.
поле 3 : Indicates the type of document that is being described. This usually contains some form of unique identifier (such as a version number).
поле 4 : Specifies the language that the DTD uses. This is achieved by using the two letter identifier for the language (i.e. for english, use „EN“).
Интересно:
Каква е разликата между CDATA (Charcter data) и PCDATA (Parsed Character Data)?
Първото означава, че става дума за текст, който не бива парсиран от парсера и се използва за текст, който носи информация.
Второто е текст, който е част от самият език за маркиране, като тагове, атрибути и т.н…
Също, добър въпрос би бил, щом можем с PUBLIC да си задаваме DTD файл, това значи, че можем да си създаваме свои, custom DTD-та.
Литература: