D. Создание Модулей ОТД

Этот раздел является нормативным.

Модули XHTML реализуются как фрагменты ОТД (Определения Типа Документа). Когда эти фрагменты ассемблируются особым образом (описано в Разработке ОТД с помощью определённых и расширенных модулей), результирующее ОТД является представлением полного типа документа. Это представление может затем быть использовано для проверки объектов типа документа.

Ключом для комбинирования этих фрагментов в понятное ОТД являются правила, используемые для определения фрагментов.
Данный раздел определяет эти правила. Если эти правила соблюдаются, авторы ОТД могут быть уверены, что их модули будут чётко взаимодействовать с другими XHTML-совместимыми модулями.

Модули, соответствующие этим правилам, должны также удовлетворять требованиям соответствия, определённым в Соответствии Семейству Модулей XHTML, чтобы называться Модулями Семейства XHTML.


D.1.
Именование объектов параметров

Эта спецификация классифицирует объекты параметров по семи категориям и именует их соответственно, используя следующие суффиксы:

.mod
объекты параметров используют суффикс .mod , если они используются для представления модуля ОТД (коллекции элементов, атрибутов, объектов параметров и т.д.). Каждый модуль в этой спецификации является атомарной единицей и может быть представлен как отдельный объект файла.
.module
объекты параметров используют суффикс .module , если они используются для управления включением модуля ОТД и содержат ключевое слово INCLUDE или IGNORE секции условий.
.qname
объекты параметров используют суффикс .qname , если они используются для представления квалифицированного имени элемента. См. дополнительно о квалифицированных именах Определение Пространства Имён Модуля.
.content
объекты параметров используют суффикс .content , если они используются для представления модели содержимого типа элемента.
.class
объекты параметров используют суффикс .class , если они используются для представления элементов одного класса.
.mix
объекты параметров используют суффикс .mix , если они используются для представления коллекции типов элементов из разных классов.
.attrib
объекты параметров используют суффикс .attrib , если они используются для представления группы лексем, представляющих одну или несколько полных спецификаций атрибутов с объявлением ATTLIST.

Например, в HTML 4 объект параметра %block; определён для представления разнородной коллекции типов элементов, которые являются элементами уровня блока. В этой спецификации результирующим объектом параметра является
%Block.mix;
.

При определении объектов параметров в классах, определённых здесь, модули должны "видеть" имена объектов, используя уникальные префиксы. Например, модель содержимого для элемента myelement в модуле mymodule может быть именована MYMODULE.myelement.content. Возможны и другие схемы. Независимо от используемой схемы, авторы модулей должны удостовериться, что объекты параметров, которые они (авторы) определили, именованы уникально, что они не конфликтуют с другими объектами параметров и что методы интерфейса очевидны для пользователей.


D.2.
Определение пространства имён модуля

XHTML требует, чтобы элементы и атрибуты, объявленные в модуле, находились внутри определённого XML пространства имён [XMLNAMES]. Идентификатором этого пространства имён служит произвольный URI. XHTML требует, чтобы, если модуль реализован с использованием ОТД XML, то этот модуль объявлял пространство имён специальным способом. Это сделано для того, чтобы разрешить выбор, во время разбора/проверки документа, использования префиксов пространства имён и того префикса, который используется для идентификации элементов и атрибутов модуля.

Разработчики содержимого, желающие создавать документы на базе гибридных типов документа, могут выбрать использование префиксов пространства имён (ПИ) XML для элементов из ПИ XHTML, для элементов из других ПИ или обоих.
Чтобы убедиться, что такие документы соответствуют XHTML и обратно совестимы с утилитами, не работающими с ПИ, W3C рекомендует, чтобы разработчики содержимого не использовали префиксы ПИ XML в элементах из ПИ XHTML.
Если разработчики содержимого заинтересованы в обработке своего содержимого процессорами, работающими с ПИ, W3C рекомендует специфицировать элементы из не-XHTML пространств имён и использованием префикса ПИ XML, а не полагаться на механизмы ПИ XML по умолчанию.

Необходимо, чтобы каждый соответствующий XHTML модуль, реализованный как ОТД XML, определял префикс ПИ XML по умолчанию, метод изменения этого префикса в объекте документа и маркированный раздел, запускающий обработку префиксов.

Обратите внимание, что верным и ожидаемым для нескольких модулей будет то, что эти модули, если они связаны, будут относиться к одному ПИ. Все модули XHTML, например, являются частями одного пространства имён.


D.2.1.
Подмодуль Qualified Names/Квалифицированные Имена

Сначала Вам нужно определить подмодуль квалифицированных имён (подмодуль это обычный файловый объект, который отделён таким образом, что он может быть вставлен в результирующее ОТД в соответствующей точке). Подмодуль квалифицированных имён конструируется с прохождением следующих этапов (где строка MODULE заменена на соответствующую строку нового модуля):

  1. Определить объект параметра MODULE с префиксом, извещающим о том, используются ли элементы модуля с именами с префиксами ПИ XML, или нет. Значение по умолчанию этого объекта параметра должно быть "%NS.prefixed;". Объект параметра NS.prefixed определён каркасом XHTML как IGNORE по умолчанию и может использоваться в объекте документа для запуска (switch on) префиксирования для всех включённых пространств имён (в том числе и ПИ модулей XHTML).
  2. Определить объект параметра MODULE.xmlns, содержащий идентификатор ПИ для этого модуля.
  3. Определить объект параметра MODULE.prefix, содержащий строку префикса по умолчанию для использования при запущенном префиксировании (enabled).
  4. Определить объект параметра MODULE.pfx, являющийся "%MODULE.prefix;:", если префиксирование запущено, и ""  -  если не запущено.
  5. Определить объект параметра MODULE.xmlns.extra.attrib, содержащий объявление любых атрибутов ПИ XML для ПИмён, на которые ссылается данный модуль (напр., xmlns:xlink).
    Если %MODULE.prefixed установлен в INCLUDE, этот атрибут должен включать также объявление xmlns:%MODULE.prefix;.
  6. Определить объект параметра XHTML.xmlns.extra.attrib как MODULE.xmlns.extra.attrib. Обычно это переопределяется файлом драйвера типа документа, но если это не так, то данное определение принимается как определение по умолчанию.
  7. Для каждого элемента, определённого модулем, создать объект параметра в форме "MODULE.NAME.qname", в котором будет содержаться квалифицированное имя. Значение этого объекта параметра обязано быть "%MODULE.pfx;NAME". Таким образом, разобранное значение будет "PREFIX:NAME", если префиксирование запущено, и "NAME" - в противном случае.

    Если модуль добавляет атрибуты к элементам, определённым в модуле, не разделяющем (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" >

D.2.2. Подмодуль(и) объявлений

Далее вам необходимо определить один или более "подмодулей объявлений". Задачей этих файловых объектов является объявление элементов ОТД XML и списков атрибутов. Модуль объявлений XHTML должен конструироваться следующим образом:

  1. Определить объект параметра для использования с ATTLIST каждого объявленного элемента. Этот объект параметра должен содержать %NS.decl.attrib;, если %MODULE.prefixed; установлен в INCLUDE, и %NS.decl.attrib; плюс "xmlns %URI.datatype; #FIXED '%MODULE.xmlns;'", если %MODULE.prefixed; установлен в IGNORE.
  2. Объявить все элементы и атрибуты модуля. В каждый ATTLIST элемента включить объект параметра, определённый выше, так, чтобы все необходимые атрибуты xmlns были доступны каждому элементу модуля.
  3. Если модуль добавляет атрибуты к тем элементам, определённым в модуле, которые не разделяют пространство имён этого модуля, объявить эти атрибуты так, чтобы они использовали префикс %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 -->

D.2.3. Использование модуля как отдельного (stand-alone) ОТД

Иногда необходимо, чтобы модуль XHTML использовался также в качестве отдельного ОТД (Определения Типа Документа). Хорошим примером может служить вышеприведённый модуль Inventory. Его объекты должны быть внедряемы в документ XHTML и доступны как отдельные самостоятельные документы, извлечённые из базы данных (к примеру). Проще всего сделать это путём определения файла ОТД, который устанавливает компоненты Вашего модуля.
Подобное ОТД могло бы иметь такую структуру:

  1. Включить модуль XHTML Datatypes (Ваш модуль qnames скорее всего использует некоторые из этих типов данных - он обычно использует тип данных URI для атрибута xmlns).
  2. Включить модуль Qnames для Вашего модуля.
  3. Определить объект параметра NS.decl.attrib как %MODULE.xmlns.extra.attrib;.
  4. Включить модуль(и) Declaration для Вашего модуля.

Пример этого для нашего модуля 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>

D.2.4. Идиосинкразии пространства имён

В то время как определённый здесь подход допускает определение языков разметки, соответствующих ПИ XML и XML, некоторые возможности, определённые спецификацией ПИ XML, не поддерживаются:

  1. Пространство имён XML разрешает переобъявление атрибута xmlns для ПИ в любой точке дерева, а также разрешает при переобъявлении переключение между использованием ПИ по умолчанию и с префиксами и изменение префикса.
    Метод, определённый в данном документе, этого не допускает. По всему объекту документа данное ПИ обязано использовать один и тот же префикс ПИ (если префиксирование используется) или обязано использоваться в области видимости по умолчанию.

  2. При использовании значений по умолчанию ПИ XML верным будет основываться на ОТД документа для того, чтобы информировать разборщики о ПИ элементов. Однако, поскольку от процессоров, умеющих обрабатывать ПИ, не требуется включать ОТД при обсчёте документа, разработчики содержимого должны объявлять ПИ XML для элемента в тех случаях, когда ПИ изменяется:

    ...
    <p>
       <myelement xmlns="..." />
    </p>
    

Электронные Книги по компьютерным программам
На правах рекламы:
Логин
Пароль
Запомнить меня