Содержание
Этот раздел является нормативным.
Модули XHTML реализуются как фрагменты ОТД (Определения Типа Документа). Когда эти фрагменты ассемблируются особым образом (описано в Разработке ОТД с помощью определённых и расширенных модулей), результирующее ОТД является представлением полного типа документа. Это представление может затем быть использовано для проверки объектов типа документа.
Ключом для комбинирования этих
фрагментов в понятное ОТД являются правила,
используемые для определения фрагментов.
Данный раздел определяет эти правила. Если
эти правила соблюдаются, авторы ОТД могут быть
уверены, что их модули будут чётко
взаимодействовать с другими XHTML-совместимыми
модулями.
Модули, соответствующие этим правилам, должны также удовлетворять требованиям соответствия, определённым в Соответствии Семейству Модулей XHTML, чтобы называться Модулями Семейства XHTML.
Эта спецификация классифицирует объекты параметров по семи категориям и именует их соответственно, используя следующие суффиксы:
.mod
, если они используются для представления
модуля ОТД (коллекции элементов, атрибутов,
объектов параметров и т.д.). Каждый модуль в
этой спецификации является атомарной
единицей и может быть представлен как
отдельный объект файла..module
, если они используются для управления
включением модуля ОТД и содержат ключевое
слово INCLUDE или
IGNORE секции условий..qname
, если они используются для представления
квалифицированного имени элемента. См.
дополнительно о квалифицированных именах Определение
Пространства Имён Модуля..content
, если они используются для представления
модели содержимого типа элемента..class
, если они используются для представления
элементов одного класса..mix
, если они используются для представления
коллекции типов элементов из разных
классов..attrib
, если они используются для представления
группы лексем, представляющих одну или
несколько полных спецификаций атрибутов с
объявлением ATTLIST.Например, в HTML 4 объект параметра %block;
определён для представления разнородной
коллекции типов элементов, которые
являются элементами уровня блока. В этой
спецификации результирующим объектом
параметра является
%Block.mix;.
При определении объектов параметров в
классах, определённых здесь, модули должны
"видеть" имена объектов, используя
уникальные префиксы. Например, модель
содержимого для элемента myelement
в
модуле mymodule может быть именована MYMODULE.myelement.content
.
Возможны и другие схемы. Независимо от
используемой схемы, авторы модулей должны
удостовериться, что объекты параметров,
которые они (авторы) определили, именованы
уникально, что они не конфликтуют с другими
объектами параметров и что методы
интерфейса очевидны для пользователей.
XHTML требует, чтобы элементы и атрибуты, объявленные в модуле, находились внутри определённого XML пространства имён [XMLNAMES]. Идентификатором этого пространства имён служит произвольный URI. XHTML требует, чтобы, если модуль реализован с использованием ОТД XML, то этот модуль объявлял пространство имён специальным способом. Это сделано для того, чтобы разрешить выбор, во время разбора/проверки документа, использования префиксов пространства имён и того префикса, который используется для идентификации элементов и атрибутов модуля.
Разработчики содержимого, желающие
создавать документы на базе гибридных
типов документа, могут выбрать
использование префиксов пространства имён
(ПИ) XML для элементов из ПИ XHTML, для элементов
из других ПИ или обоих.
Чтобы убедиться, что такие документы
соответствуют XHTML и обратно совестимы с
утилитами, не работающими с ПИ, W3C
рекомендует, чтобы разработчики
содержимого не использовали префиксы
ПИ XML в элементах из ПИ XHTML.
Если разработчики содержимого
заинтересованы в обработке своего
содержимого процессорами, работающими с ПИ, W3C
рекомендует специфицировать элементы из не-XHTML
пространств имён и использованием префикса
ПИ XML, а не полагаться на механизмы ПИ XML по
умолчанию.
Необходимо, чтобы каждый соответствующий XHTML модуль, реализованный как ОТД XML, определял префикс ПИ XML по умолчанию, метод изменения этого префикса в объекте документа и маркированный раздел, запускающий обработку префиксов.
Обратите внимание, что верным и ожидаемым для нескольких модулей будет то, что эти модули, если они связаны, будут относиться к одному ПИ. Все модули XHTML, например, являются частями одного пространства имён.
Сначала Вам нужно определить подмодуль квалифицированных имён (подмодуль это обычный файловый объект, который отделён таким образом, что он может быть вставлен в результирующее ОТД в соответствующей точке). Подмодуль квалифицированных имён конструируется с прохождением следующих этапов (где строка MODULE заменена на соответствующую строку нового модуля):
Если модуль добавляет атрибуты к элементам, определённым в модуле, не разделяющем (share) ПИ данного модуля, объявите эти атрибуты так, чтобы они использовали префикс %MODULE.pfx. Например:
<ENTITY % MODULE.img.myattr.qname "%MODULE.pfx;myattr" >
Пример подмодуля qname для гипотетического Inventory Module приведён ниже:
<!-- ...................................................................... --> <!-- Inventory Qname Module ................................................... --> <!-- file: 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 и списков атрибутов. Модуль объявлений XHTML должен конструироваться следующим образом:
Если модуль добавляет атрибуты к тем элементам, определённым в модуле, которые не разделяют пространство имён этого модуля, объявить эти атрибуты так, чтобы они использовали префикс %MODULE.pfx. Например:
<ENTITY % MODULE.img.myattr.qname "%MODULE.pfx;myattr" > <!ATTLIST %img.qname; %MODULE.img.myattr.qname; CDATA #IMPLIED >
Здесь должен быть добавлен атрибут к
элементу img
модуля Image, но имя
атрибута будет квалифицированным именем,
включая префикс, если префиксы выбраны для
объекта документа.
Добавляется также атрибут xmlns:MODULE_PREFIX к
списку атрибутов элемента img, так что
разборщик, понимающий пространство имён XML,
будет "знать", как разбирать
пространство имён на безе его (ПИ) префиксов.
В следующем примере показано объявление подмодуля для гипотетического модуля Inventory:
<!-- ...................................................................... --> <!-- Inventory Elements Module ................................................... --> <!-- file: 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 Module 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; > <!-- end of inventory-1.mod -->
Иногда необходимо, чтобы модуль XHTML
использовался также в качестве отдельного
ОТД (Определения Типа Документа). Хорошим
примером может служить вышеприведённый
модуль Inventory. Его объекты должны быть
внедряемы в документ XHTML и доступны как
отдельные самостоятельные документы,
извлечённые из базы данных (к примеру).
Проще всего сделать это путём определения
файла ОТД, который устанавливает компоненты
Вашего модуля.
Подобное ОТД могло бы иметь такую структуру:
Пример этого для нашего модуля Inventory приведён здесь:
<!-- ...................................................................... --> <!-- Inventory Elements DTD ............................................... --> <!-- file: 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 Module 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 -->
На это ОТД могут затем ссылаться документы, которые используют только элементы из Вашего модуля:
<!DOCTYPE shelf SYSTEM "inventory-1.dtd"> <shelf xmlns="http://www.example.com/xmlns/inventory"> <item> <desc> this is a description. </desc> <sku> this is the price. </sku> <price> this is the 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> this is a description. </inventory:desc> <inventory:sku> this is the sku. </inventory:sku> <inventory:price> this is the 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> this is a description. </i:desc> <i:sku> this is the price. </i:sku> <i:price> this is the price. </i:price> </i:item> </i:shelf>
В то время как определённый здесь подход допускает определение языков разметки, соответствующих ПИ XML и XML, некоторые возможности, определённые спецификацией ПИ XML, не поддерживаются:
Пространство имён XML разрешает
переобъявление атрибута xmlns для ПИ в любой
точке дерева, а также разрешает при
переобъявлении переключение между
использованием ПИ по умолчанию и с
префиксами и изменение префикса.
Метод, определённый в данном документе,
этого не допускает. По всему объекту
документа данное ПИ обязано использовать
один и тот же префикс ПИ (если
префиксирование используется) или обязано
использоваться в области видимости по
умолчанию.
При использовании значений по умолчанию ПИ XML верным будет основываться на ОТД документа для того, чтобы информировать разборщики о ПИ элементов. Однако, поскольку от процессоров, умеющих обрабатывать ПИ, не требуется включать ОТД при обсчёте документа, разработчики содержимого должны объявлять ПИ XML для элемента в тех случаях, когда ПИ изменяется:
... <p> <myelement xmlns="..." /> </p>