Document Type Definition
Document Type Definition (DTD, рус. «Определение типа документа») — это набор правил, который описывает структуру, состав и допустимые значения элементов и атрибутов для определённого класса документов, размеченных с помощью SGML (Standard Generalized Markup Language) или XML (Extensible Markup Language). DTD определяет, какие элементы могут встречаться в документе, в каком порядке, сколько раз, какие атрибуты им разрешены и какие значения эти атрибуты могут принимать. Фактически, DTD выступает грамматикой для конкретного формата данных, обеспечивая возможность формальной валидации документа на соответствие заданному типу. DTD может быть включён непосредственно в документ (внутреннее DTD) или храниться в отдельном файле (внешнее DTD), на который документ ссылается.
История
Концепция DTD восходит к языку SGML, разработанному в 1960–1980-х годах. Первым стандартом, определившим синтаксис DTD, стал ISO 8879:1986 (SGML). В этом стандарте DTD было неотъемлемой частью SGML-документа, поскольку без DTD невозможно было однозначно интерпретировать разметку. С появлением XML в 1998 году (рекомендация W3C) DTD было включено в спецификацию XML как один из способов задания структуры документа. Однако в XML DTD стало опциональным: документ может быть как «правильно построенным» (well-formed) без DTD, так и «валидным» (valid) при его наличии.
С развитием веб-технологий и ростом сложности XML-схем DTD постепенно уступило место более мощным и гибким альтернативам, таким как XML Schema (XSD) и RELAX NG. Тем не менее DTD остаётся широко используемым в унаследованных системах, в форматах, основанных на SGML (например, DocBook, TEI), и в некоторых веб-стандартах (например, XHTML 1.0 использует DTD).
Синтаксис и структура
DTD состоит из деклараций, которые описывают элементы, атрибуты, сущности и нотации. Основные типы деклараций:
Декларации элементов
Декларация элемента задаёт его имя и модель содержимого. Модель содержимого определяет, какие дочерние элементы и в каком порядке могут находиться внутри данного элемента, а также может ли элемент содержать текст (#PCDATA). Синтаксис:
`` <!ELEMENT имя_элемента модель_содержимого> ``
Примеры моделей содержимого:
(#PCDATA)— элемент может содержать только текст.(дочерний1, дочерний2)— последовательность дочерних элементов.(дочерний1 | дочерний2)— выбор одного из дочерних элементов.(дочерний+)— один или более раз.(дочерний*)— ноль или более раз.(дочерний?)— ноль или один раз.EMPTY— элемент не может содержать содержимого (например,<br/>).ANY— элемент может содержать любые другие элементы и текст (используется редко, обычно для отладки).
Пример:
`` <!ELEMENT книга (название, автор?, глава+)> <!ELEMENT название (#PCDATA)> <!ELEMENT автор (#PCDATA)> <!ELEMENT глава (заголовок, параграф*)> <!ELEMENT заголовок (#PCDATA)> <!ELEMENT параграф (#PCDATA)> ``
Декларации атрибутов
Декларация атрибута задаёт для элемента список атрибутов, их тип и значение по умолчанию. Синтаксис:
`` <!ATTLIST имя_элемента имя_атрибута тип_атрибута значение_по_умолчанию ...> ``
Типы атрибутов:
CDATA— строка (не интерпретируется как разметка).ID— уникальный идентификатор в пределах документа.IDREF/IDREFS— ссылка на один или несколько ID.NMTOKEN/NMTOKENS— имя (токен) или набор имён.(значение1 | значение2 | ...)— перечисление допустимых значений.ENTITY/ENTITIES— ссылка на сущность.
Значения по умолчанию:
#REQUIRED— атрибут обязателен.#IMPLIED— атрибут необязателен.#FIXED "значение"— атрибут всегда имеет заданное значение."значение"— значение по умолчанию.
Пример:
``` <!ATTLIST книга isbn CDATA #REQUIRED жанр (фантастика | детектив | роман) "роман" id ID #IMPLIED
```
Декларации сущностей
Сущности в DTD — это макросы, которые позволяют вставлять повторяющиеся фрагменты текста или символы. Различают внутренние и внешние сущности.
Внутренняя сущность:
`` <!ENTITY имя "значение"> ``
Пример:
`` <!ENTITY copyright "© 2024"> ``
Внешняя сущность:
`` <!ENTITY имя SYSTEM "URI"> ``
Пример:
`` <!ENTITY введение SYSTEM "intro.xml"> ``
Параметрические сущности (используются только внутри DTD) объявляются с символом %:
`` <!ENTITY % общие-атрибуты "id ID #IMPLIED lang CDATA #IMPLIED"> <!ATTLIST книга %общие-атрибуты;> ``
Декларации нотаций
Нотации описывают тип внешнего содержимого (например, двоичные данные), на которое ссылается документ. Синтаксис:
`` <!NOTATION имя SYSTEM "системный_идентификатор"> ``
Пример:
`` <!NOTATION gif SYSTEM "image/gif"> ``
Внутреннее и внешнее DTD
Внутреннее DTD
Внутреннее DTD включается непосредственно в документ с помощью конструкции <!DOCTYPE ... [ ... ]>:
``xml <?xml version="1.0"?> <!DOCTYPE книга [ <!ELEMENT книга (название, автор)> <!ELEMENT название (#PCDATA)> <!ELEMENT автор (#PCDATA)> ]> <книга> <название>Война и мир</название> <автор>Лев Толстой</автор> </книга> ``
Внешнее DTD
Внешнее DTD хранится в отдельном файле и подключается через ссылку:
``xml <?xml version="1.0"?> <!DOCTYPE книга SYSTEM "book.dtd"> <книга> <название>Война и мир</название> <автор>Лев Толстой</автор> </книга> ``
Файл book.dtd:
`` <!ELEMENT книга (название, автор)> <!ELEMENT название (#PCDATA)> <!ELEMENT автор (#PCDATA)> ``
Применение
Валидация документов
Основное назначение DTD — обеспечение формальной валидации. Парсер, поддерживающий DTD, может проверить, соответствует ли документ заданным правилам. Если документ не соответствует DTD, он считается невалидным. Это важно для обмена данными между системами, где требуется строгое соблюдение формата.
Форматы на основе SGML
Многие классические форматы, такие как DocBook (для технической документации), TEI (для гуманитарных наук), HTML (до HTML5) и XHTML 1.0, используют DTD. Например, XHTML 1.0 Strict имеет официальное DTD, которое определяет все допустимые элементы и атрибуты.
Унаследованные системы
В корпоративных и государственных информационных системах, разработанных в 1990–2000-х годах, часто используются DTD. Миграция на более современные схемы (XSD) требует значительных усилий, поэтому DTD продолжают эксплуатироваться.
Простота и компактность
DTD имеет более простой синтаксис по сравнению с XSD и не требует изучения пространств имён XML. Для небольших и простых схем DTD может быть предпочтительнее из-за меньшего объёма кода.
Ограничения и критика
Несмотря на широкое распространение, DTD имеет ряд недостатков:
- Не XML-синтаксис. DTD использует собственный синтаксис, отличный от XML, что усложняет его обработку стандартными XML-инструментами.
- Ограниченная поддержка типов данных. DTD позволяет задавать только базовые типы (CDATA, ID, NMTOKEN и т.д.), но не поддерживает числовые типы, даты, регулярные выражения или пользовательские типы.
- Отсутствие поддержки пространств имён. DTD не умеет корректно обрабатывать пространства имён XML, что критично для современных веб-сервисов.
- Сложность с модульностью. Повторное использование частей DTD в разных документах затруднено без параметрических сущностей, которые могут быть громоздкими.
- Не поддерживает наследование. В отличие от XSD, DTD не позволяет создавать иерархии типов или расширять существующие элементы.
Альтернативы
Основные альтернативы DTD:
- XML Schema (XSD) — рекомендованная W3C схема, поддерживающая типы данных, пространства имён, наследование и модульность.
- RELAX NG — более простая и гибкая схема, поддерживающая как XML-синтаксис, так и компактный синтаксис.
- Schematron — схема, основанная на правилах и XPath, позволяющая задавать сложные бизнес-ограничения.
Пример полного DTD
Ниже приведён пример DTD для простого каталога книг:
``` <!ELEMENT каталог (книга+)> <!ELEMENT книга (название, автор, год?, цена)> <!ELEMENT название (#PCDATA)> <!ELEMENT автор (#PCDATA)> <!ELEMENT год (#PCDATA)> <!ELEMENT цена (#PCDATA)> <!ATTLIST книга isbn CDATA #REQUIRED жанр (фантастика | детектив | роман) "роман"
```
Соответствующий XML-документ:
``xml <?xml version="1.0"?> <!DOCTYPE каталог SYSTEM "catalog.dtd"> <каталог> <книга isbn="978-5-699-12345-6" жанр="роман"> <название>Война и мир</название> <автор>Лев Толстой</автор> <год>1869</год> <цена>500</цена> </книга> </каталог> ``
Источники
- ISO 8879:1986 — Information processing — Text and office systems — Standard Generalized Markup Language (SGML).
- W3C Recommendation — Extensible Markup Language (XML) 1.0 (Fifth Edition), 2008.
- W3C Recommendation — XHTML™ 1.0 The Extensible HyperText Markup Language (Second Edition), 2002.
- Bray, T. et al. (2006). «Extensible Markup Language (XML) 1.1 (Second Edition)». W3C.
- Goldfarb, C. F. (1990). The SGML Handbook. Oxford University Press.
- Harold, E. R., & Means, W. S. (2004). XML in a Nutshell. O'Reilly Media.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →