DTD

DTD (англ. Document Type Definition — определение типа документа) — аббревиатура для обозначения следующих двух понятий:
 Схема всего документа или его части (в контексте языка схем DTD).
 Язык схем DTD (DTD schema language) — компьютерный язык, который используется для записи фактических синтаксических правил метаязыка SGML и расширяемого языка разметки XML. С момента его внедрения другие языки схем для  языков разметки, такие как XML Schema и RELAX NG, обзавелись дополнительной функциональностью.

Из-за определённых различий между XML и SGML применение DTD также имеет некоторые особенности в зависимости от целевого документа.

Сейчас идёт отказ от использования DTD в XML-технологии по ряду причин:

 Используется отличный от XML синтаксис.
 Отсутствует типизация узлов (в DTD).
 Отсутствует поддержка пространств имён (в DTD).

На смену DTD пришёл стандарт XML Schema консорциума W3C.

Описание схемы документа 

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 содержит в себе текстовые данные и ещё четыре объекта-параметра fontstyle, phrase, special и formctrl.

Объявление элементов 
Объявления элементов определяют (задают) набор разрешённых названий элементов в документе, тип содержимого для каждого элемента и обязательность/необязательность тегов.

Различные ключевые слова и символы определяют содержимое элемента:

  — пустое содержимое
  — любое содержимое
  — указывает порядок
  — разделение альтернатив
  — группировка
  — любое количество элементов (ноль и более)
  — по крайней мере один элемент (один и более)
  — необязательное наличие элемента (ноль или один)
 Если нет ,  или  — элемент должен быть только один

Примеры:
<!ELEMENT DL - - (DT|DD)+>
Элемент DL должен содержать один и более элементов DT или DD в произвольном порядке.

<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>
Элемент FORM должен содержать в себе один или более элементов в виде объекта-параметра block или элемента SCRIPT в произвольном порядке, однако исключена возможность содержать ещё один элемент FORM.

Объявление атрибутов элементов
Каждому элементу DTD-документа можно назначить список атрибутов. Для этого используется директива , в которой указывается имя элемента, которому назначается список атрибутов и параметры каждого атрибута: имя, тип и значение по умолчанию.

Например: 
<!ATTLIST MAP name CDATA #REQUIRED>
В этом примере для элемента MAP определен атрибут name. Он является обязательным.

Существующие типы атрибутов:
  (Character set of data) — значением атрибута могут быть любые символьные данные
  — значением атрибута должен быть уникальный идентификатор элемента
  — значением элемента является ссылка на элемент по его 
  — тоже что и , но с возможностью ссылок не по одному идентификатору, а по нескольким
  — значением атрибута может быть последовательность символов, в чём-то схожая с именем (отсюда и названием — name token). Это строка, которая содержит любую комбинацию тех символов, которые разрешено использовать для имен XML.
  — значением атрибута является список значений
  — значение используется для ссылки на внешнюю сущность.
  — позволяет задать список внешних сущностей, разделённых пробелами.
  — значением атрибута может быть одна из ранее определённых нотаций
  — позволяет задать список нотаций.
  и 
  — задаёт список возможных альтернатив значений.

Существуют такие свойства по умолчанию:
  — значение атрибута указывать не обязательно;
  — значение атрибута обязательно должно быть указано;
  — значение этого атрибута задано как константа в DTD и в документе не может быть изменено;
 некоторое конкретное значение, которое используется по умолчанию.

Связь документа с определённым DTD 
Чтобы связать документ с определённым DTD, необходимо в начале текста документа указать элемент Объявление Типа Документа.

В зависимости от места расположения DTD Объявление Типа Документа может быть двух видов:
 Внутреннее подмножество DTD
Набор объявлений DTD содержится в самом тексте документа. Например:
<!DOCTYPE foo [ <!ENTITY greeting "helloworld"> ]>
 
<!DOCTYPE bar [ <!ENTITY greeting "helloworld"> ]>
 Внешнее подмножество DTD
Набор объявлений DTD располагается в отдельном текстовом файле с расширением .dtd
В этом случае ссылку на файл можно сделать через публичный идентификатор и (или) через системный идентификатор. Например:
<!-- Валидация простого HTML 4.01 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">

Пример 
Пример очень простого XML DTD, описывающего список людей:

<!ELEMENT people_list (person*)>
<!ELEMENT person (name, birthdate?, gender?, socialsecuritynumber?)>
<!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>

См. также 
 Варианты DOCTYPE для HTML 4.01
 RELAX NG
 XML Schema

Примечания 

XML