Содержание
Данный раздел является нормативным.
Модули XHTML реализуются как фрагменты DTD. Когда эти фрагменты собираются в определенном порядке (описанном в разделе "Разработка DTD с определенными и дополнительными модулями"), результирующее DTD представляет собой полный тип документа. Затем это представление может использоваться для проверки корректности экземпляров этого типа документов.
взаимодействие их модулей с другими XHTML-совместимыми модулями.
Модули, соответствующие этим правилам, должны также удовлетворять требованиям конформности, определенным в разделе "Конформность модулей семейства XHTML", только тогда они смогут называться модулями семейства XHTML.
В настоящей спецификации сущности параметров подразделяются на семь категорий и именуются соответствующим образом с использованием следующих суффиксов:
.mod единицей и может представляться как отдельная сущность файла..module используется, если сущности параметров используются для управления включением модуля DTD путем использования любого из условных ключевых слов - INCLUDE или IGNORE..qname используется, если сущности параметров используются для представления квалифицированного имени элемента. Подробнее о квалифицированных именах см. в разделе "Определение пространства имен модуля"..content используется, если сущности параметров используются для представления модели содержимого типа элемента..class используется, если сущности параметров используются для представления элементов одного и того же класса..mix используется, если сущности параметров используются для представления набора типов элементов различных классов..attrib используется, если сущности параметров используются для представления группы символов, представляющих одну или несколько полных спецификаций атрибутов в объявлении ATTLIST.Например, в HTML 4 сущность параметра %block; определена для представления разнотипного набора типов элементов, относящихся к уровню блока. В настоящей спецификации такой сущностью будет %Block.mix;.
При определении сущностей параметров в определенных здесь классах модули должны включать имена сущностей путем использования уникальных префиксов. Например, модель содержимого элемента myelement в модуле mymodule может называться MYMODULE.myelement.content с другими сущностями параметров и чтобы интерфейсные методы модуля были очевидны его пользователям.
В XHTML объявленные в модуле элементы и атрибуты должны находиться в определенном пространстве имен XML [XMLNAMES] стадии разбора/проверки корректности документа выбора использования префиксов пространства имен и префикса, используемого для идентификации элементов и атрибутов модуля.
пространств имен или и в тех, и в других. Для гарантии конформности таких документов языку XHTML и обратной совместимости со средствами, не работающими с пространствами имен, W3C рекомендует разработчикам контента не имен, W3C также рекомендует определять элементы, не относящиеся к пространствам имен XHTML, с использованием префикса пространства имен XML, а не полагаться на механизмы умолчаний пространства имен XML.
Каждый конформный XHTML модуль, реализованный как XML DTD, должен определять префикс пространства имен XML, используемый по умолчанию, метод изменения этого префикса в экземпляре документа и размеченный раздел для включения обработки этого префикса.
Обратите внимание, что несколько связанных модулей могут и должны быть частью одного пространства имен. Все модули XHTML, например, являются частями одного пространства имен.
Прежде всего следует определить подмодуль квалифицированных имен (подмодуль представляет собой просто файловую сущность, выделенную так, чтобы она могла встраиваться в нужное место DTD). Подмодуль квалифицированных имен строится с помощью последовательности действий (строка MODULE заменяется соответствующей строкой для нового модуля):
<ENTITY % MODULE.img.myattr.qname "%MODULE.pfx;myattr" >
Пример подмодуля qname для гипотетического модуля Inventory:
<!-- ...................................................................... -->
<!-- Модуль Inventory Qname ............................................... -->
<!-- файл: inventory-qname-1.mod
PUBLIC "-//MY COMPANY//ELEMENTS XHTML Inventory Qnames 1.0//EN"
SYSTEM "http://www.example.com/DTDs/inventory-qname-1.mod"
xmlns:inventory="http://www.example.com/xmlns/inventory"
...................................................................... -->
<!-- Объявим значение по умолчанию для префиксации элементов модуля -->
<!-- Обратите внимание, что NS.prefixed будет заменен XHTML Framework
или экземпляром документа. -->
<!ENTITY % NS.prefixed "IGNORE" >
<!ENTITY % Inventory.prefixed "%NS.prefixed;" >
<!-- Объявим фактическое пространство имен данного модуля -->
<!ENTITY % Inventory.xmlns "http://www.example.com/xmlns/inventory" >
<!-- Объявим префикс по умолчанию для данного модуля -->
<!ENTITY % Inventory.prefix "inventory" >
<!-- Объявим префикс для данного модуля -->
<![%Inventory.prefixed;[
<!ENTITY % Inventory.pfx "%Inventory.prefix;:" >
]]>
<!ENTITY % Inventory.pfx "" >
<!-- Объявим атрибут пространства имен xml для данного модуля -->
<![%Inventory.prefixed;[
<!ENTITY % Inventory.xmlns.extra.attrib
"xmlns:%Inventory.prefix; %URI.datatype; #FIXED '%Inventory.xmlns;'" >
]]>
<!ENTITY % Inventory.xmlns.extra.attrib "" >
<!-- Объявим дополнительное пространство имен, которое должно включаться в элементы
XHTML -->
<!ENTITY % XHTML.xmlns.extra.attrib
%Inventory.xmlns.extra.attrib; >
<!-- Теперь объявим квалифицированные имена для всех элементов в
модуле -->
<!ENTITY % Inventory.shelf.qname "%Inventory.pfx;shelf" >
<!ENTITY % Inventory.item.qname "%Inventory.pfx;item" >
<!ENTITY % Inventory.desc.qname "%Inventory.pfx;desc" >
<!ENTITY % Inventory.sku.qname "%Inventory.pfx;sku" >
<!ENTITY % Inventory.price.qname "%Inventory.pfx;price" >
Затем нужно определить один или несколько "подмодулей объявлений". Назначением этих файловых сущностей является объявление списков элементов и атрибутов XML DTD. Модуль объявлений XHTML должен строиться следующим образом:
Если модуль добавляет атрибуты в элементы, определенные в модулях, не имеющих с данным модулем общих пространств имен, объявите эти атрибуты так, чтобы они использовали префикс %MODULE.pfx. Например:
<ENTITY % MODULE.img.myattr.qname "%MODULE.pfx;myattr" >
<!ATTLIST %img.qname;
%MODULE.img.myattr.qname; CDATA #IMPLIED
>
Это приведет к добавлению атрибута в элемент img модуля Image, но именем атрибута будет квалифицированное имя, включая префикс, если для экземпляра документа выбрана префиксация. Кроме того, в список атрибутов элемента img будет добавлен атрибут xmlns:MODULE_PREFIX, так что синтаксические анализаторы с поддержкой пространства имен XML будут знать, как разрешить пространство имен в зависимости от префикса.
В следующем примере показано объявление подмодуля для гипотетического модуля Inventory.
<!-- ...................................................................... -->
<!-- Модуль Inventory Elements ................................................... -->
<!-- файл: inventory-1.mod
PUBLIC "-//MY COMPANY//ELEMENTS XHTML Inventory Elements 1.0//EN"
SYSTEM "http://www.example.com/DTDs/inventory-1.mod"
xmlns:inventory="http://www.example.com/xmlns/inventory"
...................................................................... -->
<!-- Модуль Inventory
shelf
item
sku
desc
price
В этом модуле определяется простая структура инвентаризационной записи
-->
<!-- Определим глобальные атрибуты пространства имен -->
<![%Inventory.prefixed;[
<!ENTITY % Inventory.xmlns.attrib
"%NS.decl.attrib;"
>
]]>
<!ENTITY % Inventory.xmlns.attrib
"xmlns %URI.datatype; #FIXED '%Inventory.xmlns;'"
>
<!-- Определим общий набор атрибутов для всех элементов модуля -->
<!ENTITY % Inventory.Common.attrib
"%Inventory.xmlns.attrib;
id ID #IMPLIED
>
<!-- Определим элементы и атрибуты модуля -->
<!ELEMENT %Inventory.shelf.qname;
( %Inventory.item.qname; )* >
<!ATTLIST %Inventory.shelf.qname;
location CDATA #IMPLIED
%Inventory.Common.attrib;
>
<!ELEMENT %Inventory.item.qname;
( %Inventory.desc.qname;, %Inventory.sku.qname;, %Inventory.price.qname;) >
<!ATTLIST %Inventory.item.qname;
location CDATA #IMPLIED
%Inventory.Common.attrib;
>
<!ELEMENT %Inventory.desc.qname; ( #PCDATA ) >
<!ATTLIST %Inventory.desc.qname;
%Inventory.Common.attrib;
>
<!ELEMENT %Inventory.sku.qname; ( #PCDATA ) >
<!ATTLIST %Inventory.sku.qname;
%Inventory.Common.attrib;
>
<!ELEMENT %Inventory.price.qname; ( #PCDATA ) >
<!ATTLIST %Inventory.price.qname;
%Inventory.Common.attrib;
>
<!-- конец inventory-1.mod -->
Иногда бывает нужно использовать модуль XHTML в качестве автономного DTD. Хорошим примером может служить описанный выше модуль Inventory. Должна существовать возможность внедрения этих элементов в документ XHTML, но кроме этого, они должны быть доступны как свободные документы, извлеченные из базы данных (например). Проще всего достичь этого путем определения файла DTD, инициализирующего компоненты модуля. Такое DTD может иметь следующую структуру:
Вот пример для нашего модуля Inventory:
<!-- ...................................................................... -->
<!-- Inventory Elements DTD ............................................... -->
<!-- файл: inventory-1.dtd
PUBLIC "-//MY COMPANY//DTD XHTML Inventory 1.0//EN"
SYSTEM "http://www.example.com/DTDs/inventory-1.dtd"
xmlns:inventory="http://www.example.com/xmlns/inventory"
...................................................................... -->
<!-- Модуль Inventory
shelf
item
sku
desc
price
В этом модуле определяется простая структура инвентаризационной записи
-->
<!-- Введем типы данных -->
<!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 % Inventory-qname.mod SYSTEM "inventory-qname-1.mod" >
%Inventory-qname.mod;
<!ENTITY % NS.decl.attrib "%Inventory.xmlns.extra.attrib;">
<!ENTITY % Inventory.mod SYSTEM "inventory-1.mod" >
%Inventory.mod;
<!-- end of inventory-1.dtd -->
Это DTD может использоваться в документах, в которых используются только элементы из вашего модуля:
<!DOCTYPE shelf SYSTEM "inventory-1.dtd">
<shelf xmlns="http://www.example.com/xmlns/inventory">
<item>
<desc>
это описание.
</desc>
<sku>
это цена.
</sku>
<price>
это цена.
</price>
</item>
</shelf>
Этот метод позволяет создавать определения элементов и атрибутов, областью действия которых является их собственное пространство имен. Кроме того, он позволяет разработчикам контента использовать префикс по умолчанию для элементов и атрибутов:
<!DOCTYPE inventory:shelf SYSTEM "inventory-1.dtd" [
<!ENTITY % Inventory.prefixed "INCLUDE">
]>
<inventory:shelf xmlns:inventory="http://www.example.com/xmlns/inventory">
<inventory:item>
<inventory:desc>
это описание.
</inventory:desc>
<inventory:sku>
это инвентарный номер.
</inventory:sku>
<inventory:price>
это цена.
</inventory:price>
</inventory:item>
</inventory:shelf>
И, наконец, в экземпляре документа может использоваться другой префикс пространства имен XML путем переобъявления в заголовке DOCTYPE и его внутреннем подмножестве:
<!DOCTYPE i:shelf SYSTEM "inventory-1.dtd" [
<!ENTITY % Inventory.prefixed "INCLUDE">
<!ENTITY % Inventory.prefix "i">
]>
<i:shelf xmlns:i="http://www.example.com/xmlns/inventory">
<i:item>
<i:desc>
это описание.
</i:desc>
<i:sku>
это цена.
</i:sku>
<i:price>
это цена.
</i:price>
</i:item>
</i:shelf>
Хотя определенный здесь подход и дает возможность определения языков разметки, конформных XML и пространствам имен XML, некоторые возможности, определяемые в спецификации пространств имен XML, не поддерживаются:
и пространства имен по умолчанию и изменять префикс. Метод, определенный в данном документе, не поддерживает эти возможности. В одном экземпляре документа одно пространство имен должно использовать один и тот же префикс (если используется префиксация) или область действия по умолчанию.
Если используется область действия по умолчанию, для информирования анализаторов о пространстве имен элемента допускается полагаться на DTD документа. Однако поскольку процессоры с поддержкой пространств имен не обязательно должны включать DTD при рассмотрении документа, разработчикам контента следует объявлять пространство имен XML элемента каждый раз при смене пространства имен:
... <p> <myelement xmlns="..." /> </p>