DTD
DTD (от англ. Document Type Definition — определение типа документа) — это набор правил и деклараций, задающих структуру, элементы и атрибуты для документов определённого типа в языках разметки, таких как SGML, XML и HTML. DTD описывает, какие теги (элементы) могут встречаться в документе, в каком порядке они могут следовать, какие атрибуты допустимы для каждого элемента, а также определяет сущности (entities) для подстановки текста или символов. DTD является одним из старейших механизмов валидации структуры документов, предшествуя более современным схемам, таким как XML Schema (XSD) и Relax NG.
История
Концепция DTD возникла в рамках стандарта SGML (Standard Generalized Markup Language), разработанного в 1980-х годах и принятого как международный стандарт ISO 8879:1986. SGML использовался для создания сложных структурированных документов, особенно в издательском деле и оборонной промышленности. DTD в SGML служил формальным описанием грамматики документа, позволяя программам-парсерам проверять соответствие документа заданному типу.
С появлением XML (Extensible Markup Language) в 1998 году, разработанного Консорциумом Всемирной паутины (W3C), DTD был включён в спецификацию XML 1.0 как один из способов определения схемы документа. Однако XML-версия DTD унаследовала от SGML ряд ограничений, в частности, неполную поддержку типов данных (все значения атрибутов трактовались как строки) и отсутствие пространств имён. Несмотря на это, DTD оставался основным механизмом валидации XML-документов в течение нескольких лет.
В 2001 году W3C рекомендовал XML Schema (XSD) как более мощную и гибкую альтернативу DTD. XSD поддерживает типизацию данных, пространства имён, наследование и другие возможности, отсутствующие в DTD. Тем не менее, DTD продолжает использоваться в ряде приложений, особенно в старых системах, в форматах документов (например, DocBook, TEI) и в HTML до версии HTML5.
Структура и синтаксис DTD
DTD состоит из деклараций, которые могут быть размещены непосредственно в документе (внутренний DTD) или в отдельном файле (внешний DTD). Внешние DTD подключаются через DOCTYPE-декларацию в начале документа.
Основные типы деклараций
- Декларация элемента (ELEMENT) — определяет имя элемента и его содержимое. Содержимое может быть:
EMPTY— элемент не содержит текста или дочерних элементов (например,<br/>).ANY— элемент может содержать любой текст или любые элементы.(#PCDATA)— элемент содержит только текстовые данные (parsed character data).- Дочерние элементы, заданные в виде последовательности (запятая), выбора (вертикальная черта) или комбинации с операторами повторения (
*— ноль или более,+— один или более,?— ноль или один).
Пример: ``dtd <!ELEMENT книга (название, автор+, год?)> <!ELEMENT название (#PCDATA)> <!ELEMENT автор (#PCDATA)> <!ELEMENT год (#PCDATA)> ``
- Декларация атрибута (ATTLIST) — определяет список атрибутов для элемента, их типы и значения по умолчанию. Типы атрибутов включают:
CDATA— символьные данные.ID— уникальный идентификатор в пределах документа.IDREF/IDREFS— ссылка на один или несколько ID.NMTOKEN/NMTOKENS— имя или список имён.ENUMERATION— перечисление допустимых значений.
Пример: ``dtd <!ATTLIST книга isbn ID #REQUIRED жанр (роман|поэзия|драма) "роман" язык CDATA "русский"> ``
- Декларация сущности (ENTITY) — определяет именованный фрагмент текста, который может быть подставлен в документ. Сущности бывают:
- Внутренние (значение задаётся строкой).
- Внешние (значение берётся из внешнего файла).
- Параметрические (используются только внутри DTD).
Пример: ``dtd <!ENTITY автор "Лев Толстой"> <!ENTITY стиль "&автор; — русский писатель"> ``
- Декларация нотации (NOTATION) — определяет формат данных, используемый в документе (например, для внешних нетекстовых объектов).
Внутренний и внешний DTD
Внутренний DTD размещается внутри документа между <!DOCTYPE ... [ ... ]>: ``xml <!DOCTYPE книга [ <!ELEMENT книга (название, автор)> <!ELEMENT название (#PCDATA)> <!ELEMENT автор (#PCDATA)> ]> <книга> <название>Война и мир</название> <автор>Лев Толстой</автор> </книга> ``
Внешний DTD хранится в отдельном файле (например, book.dtd) и подключается: ``xml <!DOCTYPE книга SYSTEM "book.dtd"> ``
Применение DTD
DTD широко применяется в следующих областях:
- Языки разметки: SGML и XML. Многие стандартные форматы данных, такие как DocBook (для технической документации), TEI (Text Encoding Initiative, для гуманитарных наук), MathML (математическая разметка), используют DTD.
- HTML: До версии HTML5 HTML-документы могли содержать DOCTYPE-декларацию, ссылающуюся на DTD (например,
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">). В HTML5 DOCTYPE упрощён до<!DOCTYPE html>и не использует DTD. - RSS и Atom: Некоторые версии RSS-лент (например, RSS 2.0) определяются через DTD.
- Архивные и издательские системы: DTD используется для описания структуры сложных документов, таких как книги, технические руководства и юридические тексты.
Преимущества и недостатки
Преимущества
- Простота: DTD имеет относительно простой синтаксис, легко читается и пишется.
- Совместимость: DTD поддерживается большинством XML-парсеров и редакторов.
- Компактность: DTD-файлы часто меньше по размеру, чем соответствующие XSD-схемы.
- Сущности: Механизм сущностей позволяет создавать макросы и подставлять часто используемые фрагменты текста.
Недостатки
- Ограниченная типизация: DTD не поддерживает типы данных, отличные от строковых (CDATA). Невозможно задать, что атрибут должен быть числом, датой или булевым значением.
- Отсутствие пространств имён: DTD не поддерживает механизм пространств имён XML, что затрудняет комбинирование элементов из разных схем.
- Сложность с повторением и порядком: DTD использует регулярные выражения для описания содержимого элементов, что может быть неудобно для сложных структур.
- Не XML-синтаксис: DTD не является XML-документом, что требует отдельного парсинга и может вызывать проблемы в некоторых инструментах.
DTD и современные альтернативы
С развитием XML-технологий DTD был в значительной степени вытеснен более мощными схемами:
- XML Schema (XSD): Рекомендация W3C, поддерживающая пространства имён, типизацию данных, наследование и ограничения. XSD сам является XML-документом.
- Relax NG: Более простая и гибкая альтернатива XSD, также поддерживающая пространства имён и типы данных. Relax NG может быть записан в компактном синтаксисе (RNC) или в XML-синтаксисе (RNG).
- Schematron: Язык на основе правил, использующий XPath для проверки условий. Не заменяет DTD, а дополняет его.
Тем не менее, DTD остаётся востребованным в легаси-системах, в образовательных целях и в некоторых нишевых приложениях, где важна простота и совместимость.
Интересные факты
- DTD используется в формате EPUB для электронных книг, хотя современные версии EPUB (3.x) рекомендуют использовать XSD или Relax NG.
- В SGML DTD мог содержать условные секции, позволяющие включать или исключать части схемы в зависимости от параметров.
- DOCTYPE-декларация в HTML4 могла указывать на три различных DTD: строгий (Strict), переходный (Transitional) и с фреймами (Frameset), что позволяло выбирать уровень строгости валидации.
Источники
- W3C. Extensible Markup Language (XML) 1.0 (Fifth Edition). Recommendation, 2008.
- W3C. XML Schema Part 0: Primer Second Edition. Recommendation, 2004.
- ISO 8879:1986. Information processing — Text and office systems — Standard Generalized Markup Language (SGML).
- Bray, T., Paoli, J., Sperberg-McQueen, C. M., Maler, E., Yergeau, F. (eds.). XML 1.0 Specification.
- Walmsley, P. Definitive XML Schema. Prentice Hall, 2001.
- Clark, J., Makoto, M. (eds.). RELAX NG Specification. OASIS, 2001.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →