Главной целью определения модулей XHTML и
общей методологией модуляризации является
облегчение разработки типов документов на
базе XHTML. Эти типы документов могут расширять
XHTML путём интеграции дополнительных
возможностей (например, [SMIL])
или могут определять поднаборы XHTML для
использования в специализированных
устройствах.
В этом разделе описывается техника, которую
дизайнеры типов документов обязаны
применять, чтобы использовать
преимущества реализации ОТД XML этой
архитектуры модуляризации. Это достигается
применением техники Модуляризации XHTML
прогрессивно усложняющимися способами и
созданием в результате сложного документа
из различных модулей.
Заметьте, что эти примеры ни в коем случае
не требуют модификации самих
предоставляемых XHTML модулями файловых
объектов. Объекты файла модуля XHTML
полностью параметризованы, так что можно, с
помощью раздельных определений модулей и файлов
драйверов, установить определение и
модель содержимого каждого элемента и
каждой иерархии элементов.
Вспомним, наконец, что большинство
пользователей XHTML не собираются быть
авторами ОТД. Авторы ОТД - это, как правило,
те, кто определяют специализированную
разметку, улучшающую читабельность и
упрощающую отображение документа или
облегчающую обработку документов машиной,
либо это дизайнеры клиентских приложений,
которым необходимо определить
специализированное ОТД для конкретного
приложения.
Рассмотрим эти варианты:
Организация предоставляет подписчикам
информацию через интерфейс Web. Эта
организация хранит информацию о своих
подписчиках в базе данных на основе XML. Один из способов передачи этой информации
из БД в Web - внедрить записи XML из БД
непосредственно в документ XHTML.
Поскольку можно просто внедрить эти записи,
организация могла бы определить модуль ОТД,
в котором описаны записи, присоединить этот
модуль к ОТД XHTML и затем создать полное ОТД
для страниц.
Эта организация может затем иметь доступ к
данным в новых элементах через Document Object
Model [DOM], проверять
документы, предоставлять определения
стилей для каскадируемых элементов,
используя Cascading Style Sheets
[CSS2], и т.д. Затратив определённое время на
определение структуры данных и создание
ОТД, используя процессы, определённые в
этом разделе, организация сможет
реализовать все преимущества XML.
Разработчики клиентов Internet создают
специализированное устройство. Это
устройство будет поддерживать только
поднабор XHTML и всегда будет иметь доступ к Internet
через прокси-сервер, проверяющий
содержимое перед тем, как передать его
клиенту (для уменьшения обработки на
стороне клиента возможных ошибок).
Чтобы удостовериться, что содержимое верно,
разработчики создают ОТД, которое является
поднабором XHTML, используя процессы,
определённые в этом разделе.
Затем они используют новое ОТД на прокси-сервере
и в своих новых устройствах, а также делают
ОТД доступным для разработчиков
содержимого, так что разработчики могут
проверять своё содержимое перед тем, как
открыть к нему доступ.
Выполнив несколько простых шагов,
разработчики клиентов могут использовать
определённую в этом документе архитектуру
для значительного уменьшения усилий,
необходимых для разработки ОТД и иметь
уверенность, что эти клиенты полностью
поддерживают подключённый поднабор XHTML.
В определённых случаях расширение XHTML
может быть таким же простым, как создание дополнительных
атрибутов. Атрибуты могут быть добавлены к
элементу путём спецификации
дополнительного ATTLIST для этого элемента,
например:
добавит атрибут "myattr" с
необязательным префиксом "%MyModule.pfx", с
типом данных CDATA, к элементу "a". Это будет
работать, поскольку XML разрешает
определение или расширение списка
атрибутов элемента в любой точке ОТД. Обсуждение
квалифицированных имён и префиксов
пространства имён см. в Определении
Пространства Имён в Модуле.
Естественно, добавление атрибута в ОТД не
означает, что любое новое поведение
определено для любого клиента. Однако
разработчик содержимого может
использовать дополнительный атрибут для
хранения информации, которая доступна для
ассоциированных скриптов через Document Object Model
(для примера).
Определение дополнительных элементов
лишь немного сложнее, чем добавление
дополнительных атрибутов. В основном
авторы ОТД должны написать только
объявление элемента для каждого элемента:
После того как элементы определены, их
необходимо интегрировать в модель
содержимого. Стратегия интеграции новых
элементов или наборов элементов в модель
содержимого рассматривается в следующем
разделе.
E.3.
Определение коллекции содержимого для
коллекции модулей
Поскольку модель содержимого коллекции
модулей XHTML полностью параметризована,
авторы ОТД могут модифицировать модель
содержимого для каждого элемента в каждом
модуле. Детали интерфейса модуля ОТД
определены в Конструировании
Модулей ОТД. Есть два базовых подхода к
этой модификации:
Переопределить объект параметра ".content"
для каждого элемента.
Переопределить один или более объектов
глобальной модели содержимого (обычно
через объект параметра ".extras").
Конкретная стратегия зависит от природы
комбинируемых модулей и природы
интегрируемых элементов. Далее в этом
разделе описывается техника интеграции
двух различных классов модулей.
Если модуль (помните, что модуль может
быть коллекцией других модулей) содержит
элементы, которые только ссылаются один на
другой в своей модели содержимого, то
говорят, что модуль "внутренне завершён".
В связи с этим модуль может использоваться
как таковой; (например, Вы можете определить
ОТД, которое является этим модулем, и
использовать один из его элементов в
качестве корневого элемента). Интеграция
такого модуля в XHTML - это процесс из трёх
этапов:
Решите, какой(ие) элемент(ы) может быть
корневым(и) в новом модуле.
Определите, где эти элементы необходимо
подключить к дереву содержимого XHTML.
Затем для каждой точки подключения в
дереве содержимого добавьте корневой
элемент(ы) к определению содержимого
элементов XHTML.
Рассмотрим подключение элементов,
определённых выше.
Элемент myelement является корневым. Чтобы
подключить этот элемент под элементом img,
и только элементом img , в XHTML может
сработать следующее:
Важно отметить, что обычно элемент img
имеет модель содержимого EMPTY. Путём
добавления myelement к этой модели
содержимого мы в действительности просто
заместили
EMPTY на myelement.
В случае с элементами, которые уже имеют
определённые модели содержимого,
добавление элемента может потребовать переобъявления
существующей модели содержимого в
дополнение к myelement.
E.3.2. Смешивание
нового модуля с модулями в XHTML
В дополнение к предыдущему примеру: чтобы
подключить этот модуль в любом месте, где
разрешена группа моделей содержимого %Flow.mix,
может потребоваться записать нечто такое:
Поскольку класс моделей содержимого %Misc.extra
используется в объекте параметра %Misc.class и
этот объект параметра используется
повсеместно в модулях XHTML, новый модуль
становится доступным в расширенном типе
документа XHTML.
До сих пор примеры этого раздела
описывали методы расширения XHTML и модели
содержимого XHTML. Поскольку это уже
выполнено, следующим шагом станет
объединение модулей, составляющих ОТД, в
единый драйвер ОТД, включающий новые
определения так, что они соответствующим
образом переопределяют и дополняют базовые
определения XHTML.
Используя простой предыдущий пример,
можно определить новое ОТД, которое
использует и довольно легко расширяет
модули XHTML.
Во-первых, определим в модуле новые
элементы и их модель содержимого:
<!-- Файл simpleml-model-1.mod -->
<!-- Объявляем Parameter Entity (PE)/Объект Параметра, который определяет
любое внешнее пространство имён, используемое этим модулем -->
<!-- Устанавливаем PE, который используется в каждом ATTLIST данного модуля.
NS.prefixed.attrib инициализирован в модуле xhtml-qname,
а SimpleML.ns.noprefix.attrib инициализирован в файле ОТД драйвера SimpleML.-->
<!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;" >
<!-- Теперь вводим Basic content model XHTML -->
<!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;
Затем определяем драйвер ОТД для нового
языка:
<!-- Файл 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 -->
<!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;
При использовании этого ОТД имеется
возможность включить использование
префиксов пространства имён XML. Для этого
начало документа, использующего это новое
ОТД, может выглядеть так:
<!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="Missing image" simpleml:myattr="value"/></p>
</body>
</html>
Теперь создалась ситуация, когда завершённый
дополнительный комплексный модуль добавлен
к XHTML (или к поднабору XHTML). В сущности, это
тот же самый тривиальный вышеприведённый
пример, единственное отличие заключается в
том, что добавляемый модуль встроен в ОТД по
ссылке, а не включает новые определения
непосредственно в ОТД.
Одним из таких сложных модулей является
ОТД для [MATHML]. Чтобы объединить
MathML и XHTML в единое ОТД, автору
понадобится лишь решить, где содержимое MathML
должно легализоваться в документе, и добавить
корневой элемент MathML в модель содержимого в
этой точке.
Во-первых, определим модуль модели
содержимого, устанавливающий ОТД MathML и
подключающий его к модели содержимого:
Затем определим драйвер ОТД,
идентифицирующий наш новый модуль модели
содержимого как модель содержимого для ОТД
и передающий процесс драйверу 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;
E.4.3. Создание ОТД
путём удаления и замены модулей XHTML
Другой способ использования авторами
модулей ОТД XHTML - это определение ОТД,
являющегося поднабором семейства типа
документа XHTML (поскольку, например,
существуют утилиты или
программы, поддерживающие только поднабор XHTML).
Это будет лишь немного сложнее, чем в
предыдущем примере. Базовые шаги таковы:
Взять ОТД семейства XHTML как базу нового
типа документа (мы будем использовать XHTML 1.1).
Выбрать модули для удаления из этого ОТД.
Определить новое ОТД, которое "IGNOREs/ИГНОРИРУЕТ"
модули.
Ввести некоторые новые модули.
Например, рассмотрим устройство,
использующее модули XHTML, но без форм или
таблиц. ОТД для такого устройства может
выглядеть так:
Заметьте, что это не изменяет ОТД модели
содержимого XHTML 1.1. Однако, поскольку XML
игнорирует элементы моделей содержимого,
которые не определены, элементы форм и
таблиц автоматически удаляются из этой
модели.
Наконец, некоторые авторы ОТД захотят начать
с нуля, используя сценарий Модуляризации XHTML
в качестве набора утилит для построения
нового языка разметки. Этот язык обязан
быть построен с минимальным необходимым
количеством модулей из XHTML. Он может также
содержать другие определённые в XHTML модули
или любые другие модули, которые автор
хочет использовать.
В данном примере мы возьмём необходимые
модули XHTML, добавим некоторые определённые
в XHTML модули и добавим всё это в модуль,
определённый нами выше.
Сначала нужно использовать
предоставляемый XHTML шаблон
для нового модуля квалифицированных имён,
изменив его так, чтобы определить
квалифицированные имена и пространство
имён для наших новых элементов:
<!-- Файл myml-qname-1.mod -->
<!-- Вводим типы данных - мы используем PE URI.datatype для объявления
атрибутов xmlns. -->
<!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 "" >
<!-- Объявляем Объект Параметра/Parameter Entity (PE), определяющий любое внешнее
пространство имён, используемое этим модулем -->
<!ENTITY % MyML.xmlns.extra.attrib "" >
<!-- Объявляем PE, определяющий атрибуты 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 Basic,
но является законченным самостоятельным
модулем модели содержимого:
<!-- ...................................................................... -->
<!-- Модуль 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.mix; включает все инлайн не-якоря
-->
<!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 шаблон
для нового ОТД, изменённый соответствующим
образом для нашего нового языка разметки:
<!-- ....................................................................... -->
<!-- ОТД MYML ............................................................. -->
<!-- Файл myml-1_0.dtd -->
<!-- Это драйвер ОТД для myml 1.0.
Используйте этот FPI для его идентификации:
"-//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;
<!-- Модуль Basic Text (необходим) ............................... -->
<!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;
<!-- Модуль Hypertext (необходим) ................................. -->
<!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;
<!-- Модуль Lists (необходим) .................................... -->
<!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 Images ........................................ -->
<!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;
<!-- Модуль Document Metainformation ............................ -->
<!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;
<!-- Модуль Document Structure (необходим) ....................... -->
<!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;
После того как новое ОТД разработано, оно
может быть использовано в любом документе.
ОТД используется просто - ссылкой на него в
объявлении 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="Missing image" 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="Missing image" myml:myattr="value" /></p>
</body>
</html>