Содержание
Данный раздел является информативным.
(например, [SMIL] DTD модульной архитектуры. Это делается путем применения технологий модуляризации XHTML постепенно усложняющимися способами, что приведет к созданию полного типа документа из отдельных не связанных друг с другом модулей.
Обратите внимание, что в данных примерах ни в коем случае не требуется изменение самих файловых сущностей модуля XHTML. Файловые сущности модуля XHTML полностью параметризованы, так что с помощью различных определений модулей и файлов драйверов можно настроить определение и модель содержимого каждого элемента и его иерархии.
И, наконец, помните, что большинство пользователей XHTML не дизайнеры, разрабатывающие специализированные DTD для конкретного клиента. Например:
XML из базы непосредственно в документ XHTML. Можно и просто внедрять записи, но организация может определить модуль DTD с описанием записей, прикрепить его к XHTML DTD и создать тем самым полное DTD для своих страниц. Затем эта организация может получать доступ к данным с помощью новых элементов через объектную модель документов [DOM], проверять корректность документов, предоставлять определения стиля для элементов с использованием каскадных таблиц стилей [CSS2] и т.д. Потратив время на определение структуры данных и создание DTD с помощью определенных в этом разделе процессов, организация сможет воспользоваться всеми преимуществами XML.
содержимого перед передачей его клиенту (с целью минимизации обработки ошибок клиентом). Для гарантии корректности содержимого разработчик создает DTD, являющееся подмножеством XHTML, с помощью описанных в этом разделе процессов. Затем новое DTD может использоваться прокси-сервером и устройствами, а также разработчиками контента, чтобы они могли проверить соответствие своих документов этому DTD. Эти простые действия позволяют клиенту использовать определенную в настоящем документе архитектуру, существенно удешевить разработку DTD и гарантировать полную поддержку выбранного множества XHTML.
например:
<!ATTLIST %a.qname;
%MyModule.pfx;myattr CDATA #IMPLIED
%MyModule.xmlns.extras.attrib;
>
"myattr" с необязательным префиксом, определяемым "%MyModule.pfx" и значением типа CDATA, в элемент "a". Это происходит, потому что в XML допускается определение или расширение списка атрибутов элемента в любой точке DTD. Подробнее о квалифицированных именах и префиксах пространств имен см. в разделе "Определение пространства имен модуля".
информации, доступ к которой будет осуществляться с помощью скриптов через объектную модель документа (например).
Определение дополнительных элементов ненамного сложнее определения дополнительных атрибутов. Обычно авторы DTD должны писать объявление для каждого элемента:
<!-- В подмодуле qname -->
<!ENTITY % MyModule.myelement.qname "%MyModule.pfx;myelement" >
<!ENTITY % MyModule.myotherelement.qname "%MyModule.pfx;myotherelement" >
<!-- В подмодуле declaration -->
<!ELEMENT %MyModule.myelement.qname;
( #PCDATA | %MyModule.myotherelement.qname; )* >
<!ATTLIST %MyModule.myelement.qname;
myattribute CDATA #IMPLIED
>
<!ELEMENT %MyModule.myotherelement.qname; EMPTY >
После определения элементы необходимо интегрировать в модель содержимого. Стратегии интеграции новых элементов или наборов элементов в модель содержимого обсуждаются в следующем разделе.
Поскольку модель содержимого модулей XHTML полностью параметризована, авторы DTD могут изменять модель содержимого для каждого элемента каждого модуля. Подробно интерфейс модуля DTD определен в разделе "Построение модулей DTD". В основном для такого изменения используются два способа:
Выбор стратегии зависит от природы объединяемых модулей и интегрируемых элементов. В оставшейся части данного раздела описаны технологии интегрирования двух различных классов или модулей.
Если модуль (помните, что модуль может быть набором других модулей) содержит элементы, связанные в своей модели содержимого только друг с другом, он называется внутренне полным. По существу, такой модуль может использоваться самостоятельно. Например, можно определить DTD, представляющее только этот модуль, и использовать один из его элементов в качестве корневого. Процесс интеграции такого модуля в XHTML состоит из трех шагов:
Рассмотрим прикрепление элементов, определенных выше. В этом примере элемент myelement является корневым. Чтобы прикрепить его под элементом img и только для элемента img XHTML, нужно сделать следующее:
<!ENTITY % img.content "( %MyModule.myelement.qname; )*">
DTD, определенное с такой моделью содержимого, позволит существовать документам с фрагментами наподобие следующего:
<img src="..."> <myml:myelement >Содержимое локально определенного элемента</myml:myelement> </img>
Важно помнить, что обычно элемент img имеет модель содержимого EMPTY. Добавляя myelement в эту модель содержимого, мы на самом деле заменяем EMPTY на myelement. В случае других элементов, для которых уже определены модели содержимого, добавление элемента потребует переобъявления существующего содержимого в дополнение к myelement.
Расширим приведенный выше пример. Чтобы прикрепить наш модуль к любому модулю, в котором допустима группа модели %Flow.mix, потребуется следующее:
<!ENTITY % Misc.extra
"| %MyModule.myelement.qname;" >
Поскольку класс модели содержимого %Misc.extra используется в параметрической сущности %Misc.class, а эта параметрическая сущность используется во всех модулях XHTML, новый модуль будет доступен во всех расширенных типах документов XHTML.
До сих пор в примерах данного раздела описывались методы расширения XHTML и модели содержимого XHTML. Следующим шагом будет сбор модулей, составляющих DTD, в один драйвер DTD, объединяющий новые определения так, чтобы они переопределяли и расширяли должным образом основные определения XHTML.
Используя приведенный выше тривиальный пример, можно легко определить новое DTD, использующее и расширяющее модули XHTML. Для начала определим новые элементы и их модель содержимого в модуле:
<!-- Файл: simpleml-model-1.mod -->
<!-- Объявим параметрическую сущность, определяющую внешние пространства имен,
используемые в этом модуле -->
<!-- Установим параметрическую сущность (ПС), используемую во всех ATTLIST в этом модуле
NS.prefixed.attrib инициализируется в модуле xhtml-qname, а
SimpleML.ns.noprefix.attrib - в файле драйвера SimpleML
DTD.-->
<!ENTITY % SimpleML.xmlns.attrib
"%NS.decl.attrib;"
>
<!ENTITY % SimpleML.Common.attrib
"%SimpleML.xmlns.attrib;
id ID #IMPLIED"
>
<!ENTITY % SimpleML.element.qname "%SimpleML.pfx;element" >
<!ENTITY % SimpleML.otherelement.qname "%SimpleML.pfx;otherelement" >
<!ELEMENT %SimpleML.element.qname;
( #PCDATA | %SimpleML.otherelement.qname; )* >
<!ATTLIST %SimpleML.element.qname;
myattribute CDATA #IMPLIED
%SimpleML.Common.attrib;
>
<!ELEMENT %SimpleML.otherelement.qname; EMPTY >
<!ATTLIST %SimpleML.otherelement.qname;
%SimpleML.Common.attrib;
>
<!ENTITY % SimpleML.img.myattr.qname "%SimpleML.pfx;myattr" >
<!ATTLIST %img.qname;
%SimpleML.img.myattr.qname; CDATA #IMPLIED
>
<!-- Добавим наши элементы в модель содержимого XHTML -->
<!ENTITY % Misc.class
"| %SimpleML.element.qname;" >
<!-- Введем модель содержимого XHTML Basic -->
<!ENTITY % xhtml-basic-model.mod
PUBLIC "-//W3C//ENTITIES XHTML Basic 1.0 Document Model 1.0//EN"
"http://www.w3.org/TR/xhtml-basic/xhtml-basic10-model-1.mod" >
%xhtml-basic-model.mod;
Затем определим драйвер DTD для нового языка:
<!-- файл: simpleml-1_0.dtd -->
<!-- Введем типы данных XHTML -->
<!ENTITY % xhtml-datatypes.mod
PUBLIC "-//W3C//ENTITIES XHTML Datatypes 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-datatypes-1.mod" >
%xhtml-datatypes.mod;
<!-- Объявим фактическое пространство имен данного модуля -->
<!ENTITY % SimpleML.xmlns "http://www.example.com/xmlns/simpleml1" >
<!-- Отключим по умолчанию префиксацию для нового модуля -->
<!ENTITY % NS.prefixed "IGNORE" >
<!ENTITY % SimpleML.prefixed "%NS.prefixed;" >
<!-- Префикс по умолчанию для элементов и атрибутов модуля -->
<!ENTITY % SimpleML.prefix "simpleml" >
<!-- Если в пространстве имен модуля используется префиксация -->
<![%SimpleML.prefixed;[
<!ENTITY % SimpleML.pfx "%SimpleML.prefix;:" >
]]>
<!ENTITY % SimpleML.pfx "" >
<![%SimpleML.prefixed;[
<!ENTITY % SimpleML.xmlns.extra.attrib
"xmlns:%SimpleML.prefix; %URI.datatype; #FIXED '%SimpleML.xmlns;'" >
]]>
<!ENTITY % SimpleML.xmlns.extra.attrib "" >
<!ENTITY % XHTML.xmlns.extra.attrib
"%SimpleML.xmlns.extra.attrib;"
>
<!-- Установим модель содержимого нашего языка -->
<!ENTITY % xhtml-model.mod
SYSTEM "simpleml-model-1.mod" >
<!-- Инициализируем xhtml basic DTD для всей работы -->
<!ENTITY % xhtml-basic.dtd
PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
"http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd" >
%xhtml-basic.dtd;
При использовании этого DTD можно использовать префиксы пространства имен XML. При этом начало документа, использующего это новое DTD, может выглядеть так:
<!DOCTYPE html SYSTEM "simpleml-1_0.dtd" [
<!ENTITY % SimpleML.prefixed "INCLUDE">
]>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:simpleml="http://www.example.com/xmlns/simpleml1" >
<head>
<title>Пример использования значений по умолчанию</title>
</head>
<body>
<p>Содержимое пространства имен XHTML</p>
<simpleml:element>
Содержимое пространства имен SimpleML.
<simpleml:otherelement />
</simpleml:element>
<p><img src="missing" alt="Изображение отсутствует" simpleml:myattr="value"/></p>
</body>
</html>
Бывают ситуации, когда в XHTML (или в подмножество XHTML) добавляются полные, дополнительные или сложные модули. По существу такая ситуация не отличается от приведенного выше тривиального примера, единственное различие заключается в том, что добавляемый модуль объединяется в DTD по ссылке, а не путем явного включения новых определений в DTD.
Одним из таких сложных модулей является DTD для [MATHML]. Чтобы объединить MathML и XHTML в одно DTD, автор может просто определить, где содержимое MathML будет допустимо в пределах документа, и добавить корневой элемент MathML в эту точку модели содержимого. Сначала определим модуль модели содержимого, инициализирующий MathML DTD и подключающий его к модели содержимого:
<!-- Файл: mathml-model.mod -->
<!ENTITY % XHTML1-math
PUBLIC "-//W3C//DTD MathML 2.0//EN"
"http://www.w3.org/TR/MathML2/dtd/mathml2.dtd" >
%XHTML1-math;
<!ENTITY % Inlspecial.extra
"%a.qname; | %img.qname; | %object.qname; | %map.qname;
| %Mathml.Math.qname;" >
Затем определим драйвер DTD, идентифицирующий наш новый модуль модели как модель содержимого для DTD и передающий обработку драйверу XHTML 1.1 (например):
<!-- Файл: xhtml-mathml.dtd -->
<!ENTITY % xhtml-model.mod
SYSTEM "mathml-model.mod" >
<!ENTITY % xhtml11.dtd
PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" >
%xhtml11.dtd;
Еще один способ использования модулей XHTML авторами DTD - определение DTD, являющегося подмножеством семейства типов документов XHTML (если, например, они создают устройства или программное обеспечение, поддерживающее только подмножество XHTML). Это ненамного сложнее предыдущего примера. Вот основные шаги:
Например, рассмотрим устройство, использующее модули XHTML, но без форм и таблиц. DTD для такого устройства будет выглядеть следующим образом:
<!-- Файл: xhtml-simple.dtd -->
<!ENTITY % xhtml-form.module "IGNORE" >
<!ENTITY % xhtml-table.module "IGNORE" >
<!ENTITY % xhtml-table.module "IGNORE" >
<!-- Введем основной модуль таблиц -->
<!ENTITY % xhtml-basic-table.mod
PUBLIC "-//W3C//ELEMENTS XHTML Basic Tables 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-basic-table-1.mod"
>
%xhtml-basic-table.mod;
<!ENTITY % xhtml11.mod
PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" >
%xhtml11.mod;
Обратите внимание, что фактически модель содержимого XHTML 1.1 DTD не изменяется. Однако, поскольку XML игнорирует не определенные в модели содержимого элементы, элементы форм и таблиц автоматически выбрасываются из модели.
И, наконец, некоторым авторам DTD может понадобиться начать все с нуля, используя модуляризацию XHTML в качестве средства построения нового языка разметки. Язык должен состоять из необходимого минимального числа модулей XHTML. Кроме того, он может содержать другие модули, определенные с помощью XHTML, или какие-либо другие модули, которые хочет использовать автор. В данном примере мы возьмем обязательные модули XHTML, добавим некоторые модули, определенные с помощью XHTML, и добавим определенный выше модуль.
Первый шаг - использовать для нового модуля квалифицированных имен XHTML-шаблон, измененный таким образом, чтобы он позволял определять квалифицированные имена и пространства имен для наших новых элементов.
<!-- файл: myml-qname-1.mod -->
<!-- Введем типы данных - для объявления xmlns attributes используется
ПС URI.datatype. -->
<!ENTITY % MyML-datatypes.mod
PUBLIC "-//W3C//ENTITIES XHTML Datatypes 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-datatypes-1.mod" >
%MyML-datatypes.mod;
<!-- Отключим по умолчанию префиксацию для этого модуля -->
<!ENTITY % NS.prefixed "IGNORE" >
<!ENTITY % MyML.prefixed "%NS.prefixed;" >
<!-- Объявим фактическое пространство имен данного модуля -->
<!ENTITY % MyML.xmlns "http://www.example.com/xmlns/myml" >
<!-- Объявим префикс по умолчанию для данного модуля -->
<!ENTITY % MyML.prefix "myml" >
<!-- Если в пространстве имен модуля используется префиксация -->
<![%MyML.prefixed;[
<!ENTITY % MyML.pfx "%MyML.prefix;:" >
]]>
<!ENTITY % MyML.pfx "" >
<!-- Объявим параметрическую сущность, определяющую внешние пространства имен,
используемые в этом модуле -->
<!ENTITY % MyML.xmlns.extra.attrib "" >
<!-- Объявим ПС, определяющую атрибуты xmlns для использования MyML. -->
<![%MyML.prefixed;[
<!ENTITY % MyML.xmlns.attrib
"xmlns:%MyML.prefix; %URI.datatype; #FIXED '%MyML.xmlns;'
%MyML.xmlns.extra.attrib;"
>
]]>
<!ENTITY % MyML.xmlns.attrib
"xmlns %URI.datatype; #FIXED '%MyML.xmlns;'
%MyML.xmlns.extra.attrib;"
>
<!-- Убедимся, что атрибуты пространства имен MyML включены в набор
атрибутов XHTML -->
<![%NS.prefixed;[
<!ENTITY % XHTML.xmlns.extra.attrib
"%MyML.xmlns.attrib;" >
]]>
<!ENTITY % XHTML.xmlns.extra.attrib
""
>
<!-- Теперь объявим имена элементов -->
<!ENTITY % MyML.myelement.qname "%MyML.pfx;myelement" >
<!ENTITY % MyML.myotherelement.qname "%MyML.pfx;myotherelement" >
Затем определим модуль, определяющий элементы и атрибуты, с использованием XHTML-шаблона.
<!-- ...................................................................... -->
<!-- Модуль My Elements ................................................... -->
<!-- файл: myml-elements-1_0.mod
PUBLIC "-//MY COMPANY//ELEMENTS XHTML MyML Elements 1.0//EN"
SYSTEM "http://example.com/DTDs/myml-elements-1_0.mod"
xmlns:myml="http://example.com/DTDs/myml-1_0.dtd"
...................................................................... -->
<!-- Модуль My Elements
myelement
myotherelement
Этот модуль только предоставляет структуру для некоторого
содержимого PCDATA.
-->
<!ELEMENT %MyML.myelement.qname;
( #PCDATA | %MyML.myotherelement.qname; )* >
<!ATTLIST %MyML.myelement.qname;
myattribute CDATA #IMPLIED
%MyML.xmlns.attrib;
>
<!ELEMENT %MyML.myotherelement.qname; EMPTY >
<!ATTLIST %MyML.myotherelement.qname;
%MyML.xmlns.attrib;
>
<!ENTITY % MyML.img.myattr.qname "%MyML.pfx;myattr" >
<!ATTLIST %img.qname;
%MyML.img.myattr.qname; CDATA #IMPLIED
%MyML.xmlns.attrib;
>
<!-- конец myml-elements-1_0.mod -->
Теперь построим описание модели содержимого, объединяющее новые элементы и атрибуты с прочими элементами XHTML. Следующий пример построен на модели содержимого XHTML, но является полным и автономным модулем модели содержимого:
<!-- ...................................................................... -->
<!-- Модуль MyML Model ................................................... -->
<!-- файл: myml-model-1.mod
PUBLIC "-//MY COMPANY//ELEMENTS XHTML MyML Model 1.0//EN"
SYSTEM "http://example.com/DTDs/myml-model-1_0.mod"
xmlns:myml="http://www.example.com/xmlns/myml"
...................................................................... -->
<!-- Определим модель содержимого для Misc.extra -->
<!ENTITY % Misc.class
"| %MyML.myelement.qname; ">
<!-- .................... Встроенные элементы ......................... -->
<!ENTITY % HeadOpts.mix
"( %meta.qname; )*" >
<!ENTITY % I18n.class "" >
<!ENTITY % InlStruct.class "%br.qname; | %span.qname;" >
<!ENTITY % InlPhras.class
"| %em.qname; | %strong.qname; | %dfn.qname; | %code.qname;
| %samp.qname; | %kbd.qname; | %var.qname; | %cite.qname;
| %abbr.qname; | %acronym.qname; | %q.qname;" >
<!ENTITY % InlPres.class
"" >
<!ENTITY % Anchor.class "| %a.qname;" >
<!ENTITY % InlSpecial.class "| %img.qname; " >
<!ENTITY % Inline.extra "" >
<!-- %Inline.class; включает все встроенные элементы,
используемые в качестве компонентов в смесях
-->
<!ENTITY % Inline.class
"%InlStruct.class;
%InlPhras.class;
%InlPres.class;
%Anchor.class;
%InlSpecial.class;"
>
<!-- %InlNoAnchor.class; включает все устроенные элементы, не являющиеся якорями,
используемые в качестве компонентов в смесях
-->
<!ENTITY % InlNoAnchor.class
"%InlStruct.class;
%InlPhras.class;
%InlPres.class;
%InlSpecial.class;"
>
<!-- %InlNoAnchor.class; включает все устроенные элементы, не являющиеся якорями
-->
<!ENTITY % InlNoAnchor.mix
"%InlNoAnchor.class;
%Misc.class;"
>
<!-- %Inline.mix; включает все встроенные элементы, включая %Misc.class;
-->
<!ENTITY % Inline.mix
"%Inline.class;
%Misc.class;"
>
<!-- ..................... Элементы уровня блока ...................... -->
<!ENTITY % Heading.class
"%h1.qname; | %h2.qname; | %h3.qname;
| %h4.qname; | %h5.qname; | %h6.qname;" >
<!ENTITY % List.class "%ul.qname; | %ol.qname; | %dl.qname;" >
<!ENTITY % BlkStruct.class "%p.qname; | %div.qname;" >
<!ENTITY % BlkPhras.class
"| %pre.qname; | %blockquote.qname; | %address.qname;" >
<!ENTITY % BlkPres.class "" >
<!ENTITY % Block.extra "" >
<!-- %Block.class; включает все элементы уровня блока,
используемые в качестве компонентов в смесях
-->
<!ENTITY % Block.class
"%BlkStruct.class;
%BlkPhras.class;
%BlkPres.class;
%Block.extra;"
>
<!-- %Block.mix; включает все элементы уровня блока плюс %Misc.class;
-->
<!ENTITY % Block.mix
"%Heading.class;
| %List.class;
| %Block.class;
%Misc.class;"
>
<!-- ................ Все элементы содержимого .................. -->
<!-- %Flow.mix; включает все текстовое содержимое, уровня блока и встроенное
-->
<!ENTITY % Flow.mix
"%Heading.class;
| %List.class;
| %Block.class;
| %Inline.class;
%Misc.class;"
>
<!-- специальная модель содержимого для элемента pre -->
<!ENTITY % pre.content
"( #PCDATA
| %Inline.class; )*"
>
<!-- конец myml-model-1.mod -->
И, наконец, будем использовать XHTML-шаблон нового DTD, соответствующим образом измененный для нашего языка разметки:
<!-- ....................................................................... -->
<!-- MYML DTD ............................................................. -->
<!-- файл: myml-1_0.dtd -->
<!-- Это драйвер DTD для myml 1.0.
Используйте для его определения следующий общий формальный идентификатор:
"-//MY COMPANY//DTD XHTML MYML 1.0//EN"
И следующее пространство имен для уникальных для myml элементов:
xmlns:myml="http://www.example.com/xmlns/myml"
-->
<!ENTITY % XHTML.version "-//MY COMPANY//DTD XHTML MYML 1.0//EN" >
<!-- зарезервировано для использования с профилями документов ------->
<!ENTITY % XHTML.profile "" >
<!-- Указать на использование модуля квалифицированных имен в качестве
дополнительного драйвера qname -->
<!ENTITY % xhtml-qname-extra.mod
SYSTEM "myml-qname-1.mod" >
<!-- Определим используемую модель содержимого -->
<!ENTITY % xhtml-model.mod
SYSTEM "myml-model-1.mod" >
<!-- Отключим поддержку двунаправленного текста -->
<!ENTITY % XHTML.bidi "IGNORE" >
<!-- Введем структуру XHTML -->
<!ENTITY % xhtml-framework.mod
PUBLIC "-//W3C//ENTITIES XHTML Modular Framework 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-framework-1.mod" >
%xhtml-framework.mod;
<!-- Модуль основного текста (обязателен) ............................... -->
<!ENTITY % xhtml-text.mod
PUBLIC "-//W3C//ELEMENTS XHTML Basic Text 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-text-1.mod" >
%xhtml-text.mod;
<!-- Модуль гипертекста (обязателен) .................................... -->
<!ENTITY % xhtml-hypertext.mod
PUBLIC "-//W3C//ELEMENTS XHTML Hypertext 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-hypertext-1.mod" >
%xhtml-hypertext.mod;
<!-- Модуль списков (обязателен) .......................................... -->
<!ENTITY % xhtml-list.mod
PUBLIC "-//W3C//ELEMENTS XHTML Lists 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-list-1.mod" >
%xhtml-list.mod;
<!-- Модуль My Elements ................................................... -->
<!ENTITY % MyML-elements.mod
SYSTEM "myml-elements-1.mod" >
%MyML-elements.mod;
<!-- Модуль изображений XHTML .................................... -->
<!ENTITY % xhtml-image.mod
PUBLIC "-//W3C//ELEMENTS XHTML Images 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-image-1.mod" >
%xhtml-image.mod;
<!-- Модуль метаинформации документа ..................................... -->
<!ENTITY % xhtml-meta.mod
PUBLIC "-//W3C//ELEMENTS XHTML Metainformation 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-meta-1.mod" >
%xhtml-meta.mod;
<!-- Модуль структуры документа (обязателен) .............................. -->
<!ENTITY % xhtml-struct.mod
PUBLIC "-//W3C//ELEMENTS XHTML Document Structure 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-struct-1.mod" >
%xhtml-struct.mod;
Когда разработка нового DTD завершена, оно может использоваться в любом документе. Использование DTD достигается путем ссылки на него в объявлении DOCTYPE документа:
<!DOCTYPE html SYSTEM "myml-1_0.dtd" > <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Пример использования значений по умолчанию</title> </head> <body> <p>Содержимое пространства имен XHTML</p> <myelement> Содержимое пространства имен SimpleML. <myotherelement /> </myelement> <p><img src="missing" alt="Изображение отсутствует" myattr="value"/></p> </body> </html>
С помощью префиксов в этом документе могут использоваться и элементы, лежащие за пределами пространства имен XHTML:
<!DOCTYPE html SYSTEM "myml-1_0.dtd" [ <!ENTITY % MyML.prefixed "INCLUDE" > ]> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Пример использования значений по умолчанию</title> </head> <body> <p>Содержимое пространства имен XHTML</p> <myml:myelement> Содержимое пространства имен myml. <myml:myotherelement /> </myml:myelement> <p><img src="missing" alt="Изображение отсутствует" myml:myattr="value"/></p> </body> </html>