20-10-2023
DTD (англ. Document Type Definition определение типа документа) — включает в себя два понятия:
Из-за определённых отличий между XML и SGML, применение DTD также имеет некоторые особенности в зависимости от целевого документа
Сейчас идёт отказ от использования DTD в XML-технологии по ряду причин:
На смену 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
содержит в себе текстовые данные и ещё три объекта-параметра phrase
, special
и formctrl
.
Объявления элементов образовывают перечень разрешенных названий элементов в документе, а также определяют информацию относительно тегов (являются ли они обязательными) и модели содержимого для каждого элемента.
Различные ключевые слова и символы определяют содержимое элемента:
Примеры:
<!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
. Он является обязательным.
Существуют такие типы атрибутов:
Существуют такие свойства по умолчанию:
Чтобы связать документ с определённым DTD, необходимо в начале текста документа указать элемент Объявление Типа Документа.
В зависимости от места расположения DTD, Объявление Типа Документа может быть двух видов:
Набор объявлений DTD содержится в самом тексте документа. Например:
<!DOCTYPE foo [ <!ENTITY greeting "helloworld"> ]> <!DOCTYPE bar [ <!ENTITY greeting "helloworld"> ]>
Набор объявлений 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?, 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>
DTD.