Открыть главное меню

DTD (англ. Document Type Definition — определение типа документа) — включает в себя два понятия:

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

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

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

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

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

Описание схемы документаПравить

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.

Объявление элементовПравить

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

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

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

Примеры:

<!ELEMENT DL - - (DT|DD)+>

Элемент DL должен содержать один и более элементов DT или DD в произвольном порядке.

<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>

Элемент FORM должен содержать в себе один или более элементов с объектом-параметром block или элементы SCRIPT в произвольном порядке, однако исключена возможность содержать ещё один элемент FORM.

Определение атрибутовПравить

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

Например:

<!ATTLIST MAP name 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Править

Чтобы связать документ с определённым 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) >

Начиная с первой строки:

  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>

См. такжеПравить