DTD and Doctype

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-та.

Литература:

https://www.quackit.com/xml/tutorial/dtd_fpi.cfm