Document Type Definition

(Перенаправлено з DTD)

Визначення Типу Документа (англ. Document Type Definition, DTD) включає два поняття:

  • Термін, що застосовується для опису схеми документу чи його частини мовою схем DTD.
  • Мова схем DTD (DTD schema language) — штучна мова, яку використовують для запису фактичних синтаксичних правил метамови розмітки тексту SGML та XML. З моменту її впровадження інші мови схем для специфікацій, такі як XML Schema та RELAX NG, випускаються з додатковою функціональністю.
Document Type Definition
Дата появи 1996 (1998) рік
Творці World Wide Web (W3C)
Розробник Tim Berners-Lee
Основні реалізації Допомога у відображені вебсторінок і вебдодатків
Операційна система Windows, IOS, Android

Задає можливу структуру для XML-документів:

  1. як можуть називатися елементи
  2. як вони можуть один в одного входити
  3. які у кожного елемента можуть бути атрибути

Через певні відмінності між XML та SGML, застосування DTD також має певні особливості в залежності від мови цільового документа.

Зараз йде відмова від використання DTD в XML-технології по ряду причин:

  1. Відсутня підтримка просторів імен.
  2. Використовується відмінний від XML синтаксис
  3. Відсутня типізація вузлів.

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, …, Еn
E1, 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 — задає список можливих альтернатив значень.

Існують такі властивості за умовчуванням:

  1. IMPLIED — значення атрибута вказувати не обов'язково;
  2. REQUIRED — значення атрибута обов'язково повинно бути зазначено;
  3. FIXED — значення цього атрибута задано як константа в DTD і в документі не може бути змінено;
  4. деяке конкретне значення, яке використовується за умовчанням.

Визначення сутності ред.

Визначення типів документа (DTD) також можна використовувати для декларації спеціальних символів і символьних рядків, які використовуються в XML документі.Сутність складається з трьох частин: амперсанда (), імені сутності і крапки з комою (;).

<! ENTITY імя_сутності "сутність">

Приклад:

<!ENTITY myname "Дмитро Денисов">

Програма-аналізатор, переглядаючи в першу чергу вміст області DTD- визначень, опрацює цю інструкцію і при подальшому розборі документа буде використовувати вміст DTD- компонента в тому місці, де буде зустрічатися його назва. Тобто тепер в документі ми можемо використовувати вираз &myname; , Яке буде замінено на рядок «Дмитро Денисов».

Приклад:

<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">

В XML-документі:

<author>&writer;&copyright;</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)>

Починаючи з першого рядка:

  1. Елемент <people_list> містить будь-яке число елементів <person>. Знак <*> означає що можливо 0, 1 або більше елементів <person> всередині елемента <people_list>.
  2. Елемент <person> містить елементи <name>, <birthdate >,<gender >і< socialsecuritynumber>. Знак <?> Означає що елемент необов'язковий. Елемент <name> не містить <?>, Що означає що елемент <person> обов'язково повинен містити елемент <name>.
  3. Елемент <name> містить дані.
  4. Елемент <birthdate> містить дані.
  5. Елемент <gender> містить дані.
  6. Елемент <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>

Див. також ред.

Посилання ред.