Визначення Типу Документа () включає два поняття: Термін, що застосовується для опису схеми документу чи його частини мовою схем DTD. Мова схем DTD (DTD schema language) — штучна мова, яку використовують для запису фактичних синтаксичних правил метамови розмітки тексту SGML та XML. З моменту її впровадження інші мови схем для специфікацій, такі як XML Schema та RELAX NG, випускаються з додатковою функціональністю.
Задає можливу структуру для XML-документів: як можуть називатися елементи як вони можуть один в одного входити які у кожного елемента можуть бути атрибути
Через певні відмінності між XML та SGML, застосування DTD також має певні особливості в залежності від мови цільового документа.
Зараз йде відмова від використання DTD в XML-технології по ряду причин: Відсутня підтримка просторів імен. Використовується відмінний від XML синтаксис Відсутня типізація вузлів.
DTD визначає дійсні будівельні блоки XML-документа. Вона визначає структуру документа зі списком перевірених елементів та атрибутів. DTD може бути оголошено у XML-документі або як зовнішнє посилання.
На зміну DTD прийшов стандарт консорціуму W3C XML Schema.
Підключення DTD в XML-документ Перший спосіб(в самому XML-документі)<?xml version="1.0"?>
<!DOCTYPE configuration [
<!ELEMENT configuration …>
…
]>
< configuration > … </ configuration>Другий спосіб(окремий файл)<!DOCTYPE configuration SYSTEM "config.dtd">Третій спосіб(вказання простору імен)<!DOCTYPE configuration SYSTEM "http://myserver.com/config.dtd">
Опис схеми документа
DTD описує схему документа для певної мови розмітки через набір оголошень (об'єктів-параметрів, елементів та атрибутів), що описують його клас (чи тип) з точки зору синтаксичних обмежень цього документу. Також DTD може оголошувати конструкції, які не завжди необхідні для визначення структури документа, але натомість можуть впливати на інтерпретацію певних документів.
Оголошення об'єктів-параметрів Оголошення об'єкта-параметра визначає макрос певного типу, на який можна посилатися і який може бути розгорнутий де-небудь в DTD. Ці макроси можуть не з'являтися в самому документі, а бути лише в DTD. Якщо на об'єкт-параметр посилаються за ім'ям з DTD, то він розгортається в стрічку, в якій вказано вміст цього об'єкта.
Приклади: <!ENTITY % fontstyle "TT | I | B | BIG | SMALL"> Об'єкт-параметр fontstyle містить в собі групу тегів TT | I | B | BIG | SMALL. <!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;"> Об'єкт-параметр inline містить в собі текстові дані та ще три об'єкта-параметра phrase, special та formctrl.
Оголошення елементів <!ELEMENT імя_елемента вміст >
Оголошення елементів утворюють перелік дозволених назв елементів в документі, а також зазначає інформацію щодо тегів (чи є вони обов'язковими) та моделі вмісту для кожного елемента.
Різні ключові слова та символи визначають вміст елемента: ПравилоОписE*будь-яку кількість елементів (0 і більше елементів E)E+принаймні один елемент (1 і більше елементів E)E?необов'язкова наявність елемента (0 або 1)E1|E2|…|EnОдин з елементів Е1, Е2, …, ЕnE1, E2, …, EnЕлемент E1, за яким слідують E2, …, En#PCDATAТекст(#PCDATA|E1|…|En)*0 або більше текстових елементів і елементи Е1, Е2, …, EN, розташовані в довільному порядку (змішане утримання)ANYБудь-який дочірній вузол(будь-який вміст)EMPTYНемає дочірних вузлів(пустий вміст)
Якщо немає *, + або ? — елемент повинен бути тільки один
Приклади:<!ELEMENT title (#PCDATA)><!ELEMENT DL - - (DT|DD)+> Елемент DL має містити один або більше елементів DT чи DD в будь-якому порядку.
<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)> Елемент FORM має містити в собі один або більше елементів з об'єкта-параметра block чи елементи SCRIPT в будь-якому порядку, проте виключена можливість містити ще один елемент FORM.
Оголошення атрибутів <!ATTLIST елемент атрибут тип атрибуту властивості >
З кожним елементом DTD-документа можна зіставити список атрибутів. Для цього використовується директива !ATTLIST, в якій зазначаються ім'я елемента, з яким може бути зіставлений список атрибутів і параметри кожного атрибута: його ім'я, тип і властивості за умовчуванням.
Оголошення атрибутів являє собою дозволений набір атрибутів для кожного визначеного елемента, а також зазначає інформацію щодо типу значень атрибутів (чи одразу вказаний список можливих значень) та інформацію щодо потреби встановлювати значення атрибутів за умовчанням.
Наприклад: <!ATTLIST MAP name CDATA #IMPLIED >
<!ATTLIST person number CDATA #REQUIRED> В цьому прикладі визначений атрибут name для елемента MAP. Він не є необхідним.
Існують такі типи атрибутів:
CDATA (Character set of data) — значенням атрибута можуть бути будь-які символьні дані ID — значенням атрибута повинен бути унікальний ідентифікатор елемента IDREF — значенням елемента є посилання на елемент по його ID IDREFS — теж що і IDREF, але з можливістю посилань не по одному ідентифікатору, а за кількома NMTOKEN — значенням атрибута може бути послідовність символів, в чомусь схожа з ім'ям (звідси і назвою — name token). Це рядок, яка містить будь-яку комбінацію тих символів, які дозволено використовувати для імен XML. NMTOKENS — значенням атрибута є список значень ENTITY — значення використовується для посилання на зовнішню сутність. ENTITIES — дозволяє задати список зовнішніх сутностей, розділених пробілами. NOTATION — значенням атрибута може бути одна з раніше визначених нотацій NOTATIONS — дозволяє задати список нотацій. Listings і NOTATION-listings ENUMERATION — задає список можливих альтернатив значень.
Існують такі властивості за умовчуванням:
IMPLIED — значення атрибута вказувати не обов'язково; REQUIRED — значення атрибута обов'язково повинно бути зазначено; FIXED — значення цього атрибута задано як константа в DTD і в документі не може бути змінено; деяке конкретне значення, яке використовується за умовчанням.
Визначення сутності Визначення типів документа (DTD) також можна використовувати для декларації спеціальних символів і символьних рядків, які використовуються в XML документі.Сутність складається з трьох частин: амперсанда (), імені сутності і крапки з комою (;).
<! ENTITY імя_сутності "сутність">
Приклад:
<!ENTITY myname "Дмитро Денисов">
Програма-аналізатор, переглядаючи в першу чергу вміст області DTD- визначень, опрацює цю інструкцію і при подальшому розборі документа буде використовувати вміст DTD- компонента в тому місці, де буде зустрічатися його назва. Тобто тепер в документі ми можемо використовувати вираз &myname; , Яке буде замінено на рядок «Дмитро Денисов».
Приклад:<!ENTITY writer "Donald Duck."> <!ENTITY copyright "Copyright W3Schools.">В XML-документі:<author>&writer;©right;</author>у браузері відображатись XML-документ буде так:
Donald Duck.Copyright W3Schools.
Зв'язок документа з певним DTD Щоб пов'язати документ з певним DTD, треба на початку тексту документа зазначити елемент DTD.
В залежності від місцезнаходження DTD, DTD можуть бути двох видів: Внутрішня підмножина DTD Набір оголошень DTD міститься в самому тексті документа. Наприклад: <!DOCTYPE foo [ <!ENTITY greeting "helloworld"> ]>
<!DOCTYPE bar [ <!ENTITY greeting "helloworld"> ]> Зовнішня підмножина DTD Набір оголошень DTD міститься в окремому текстовому файлі з розширенням .dtd В такому разі посилання на файл можна робити через публічний ідентифікатор та (або) через системний ідентифікатор. Наприклад: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Приклад Приклад дуже простого XML DTD, що описує список людей:<! ELEMENT people_list (person *)> <! ELEMENT person (name, birthdate ?, gender, social security number?)> <! ELEMENT name (#PCDATA)> <! ELEMENT birthdate (#PCDATA)> <! ELEMENT Gender (#PCDATA)> <! ELEMENT socialsecuritynumber (#PCDATA)>Починаючи з першого рядка:
Елемент <people_list> містить будь-яке число елементів <person>. Знак <*> означає що можливо 0, 1 або більше елементів <person> всередині елемента <people_list>. Елемент <person> містить елементи <name>, <birthdate >,<gender >і< socialsecuritynumber>. Знак <?> Означає що елемент необов'язковий. Елемент <name> не містить <?>, Що означає що елемент <person> обов'язково повинен містити елемент <name>. Елемент <name> містить дані. Елемент <birthdate> містить дані. Елемент <gender> містить дані. Елемент <socialsecuritynumber> містить дані.
Приклади XML-документа, що використовує цей DTD:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE people_list SYSTEM "example.dtd"> <people_list> <person> <name> Fred Bloggs </name> <birthdate> 27/11/2008 </birthdate> <gender> Male </gender> <socialsecuritynumber> 1234567890 </socialsecuritynumber> </person> </people_list><?xml version="1.0"?> <!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>
Див. також
DITA XML schema XML Schema (W3C) RELAX NG Формальна граматика Варианты DOCTYPE для HTML 4.01
Посилання Визначення декларації типу XML документа в специфікації Extensible Markup Language (XML) 1.0 (четверта редакція) на W3.org Довідник XML DTD Книги по XML(рос.)