DTD

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

  1. Используется отличный от XML синтаксис.
  2. Отсутствует типизация узлов (в DTD).
  3. Отсутствует поддержка пространств имён (в 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.

Объявление элементов

[править | править код]

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

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

  • 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>

В этом примере для элемента MAP определен атрибут name. Он является обязательным.

Существующие типы атрибутов:

  • 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>

Примечания

[править | править код]
  1. Редакторы Ashok Malhotra, Murray Maloney. XML Schema Requirements. W3C (15 февраля 1999). Дата обращения: 26 июля 2021. Архивировано 19 июля 2021 года.