E. Разработка ОТД (определений типа документа)
в определённых и расширенных модулях

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

Главной целью определения модулей 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.

 

E.1. Определение дополнительных атрибутов

В определённых случаях расширение XHTML может быть таким же простым, как создание дополнительных атрибутов. Атрибуты могут быть добавлены к элементу путём спецификации дополнительного ATTLIST для этого элемента, например:

<!ATTLIST %a.qname;
      %MyModule.pfx;myattr   CDATA        #IMPLIED
      %MyModule.xmlns.extras.attrib;
>

добавит атрибут "myattr" с необязательным префиксом "%MyModule.pfx", с типом данных CDATA, к элементу "a". Это будет работать, поскольку XML разрешает определение или расширение списка атрибутов элемента в любой точке ОТД. Обсуждение квалифицированных имён и префиксов пространства имён см. в Определении Пространства Имён в Модуле.

Естественно, добавление атрибута в ОТД не означает, что любое новое поведение определено для любого клиента. Однако разработчик содержимого может использовать дополнительный атрибут для хранения информации, которая доступна для ассоциированных скриптов через Document Object Model (для примера).

 

E.2. Определение дополнительных элементов

Определение дополнительных элементов лишь немного сложнее, чем добавление дополнительных атрибутов. В основном авторы ОТД должны написать только объявление элемента для каждого элемента:

<!-- В субмодуле qname -->
<!ENTITY % MyModule.myelement.qname  "%MyModule.pfx;myelement" >
<!ENTITY % MyModule.myotherelement.qname  "%MyModule.pfx;myotherelement" >

<!-- В объявлении субмодуля -->
<!ELEMENT %MyModule.myelement.qname; 
           ( #PCDATA | %MyModule.myotherelement.qname; )* >
<!ATTLIST %MyModule.myelement.qname;
          myattribute    CDATA    #IMPLIED
>

<!ELEMENT %MyModule.myotherelement.qname; EMPTY >

После того как элементы определены, их необходимо интегрировать в модель содержимого. Стратегия интеграции новых элементов или наборов элементов в модель содержимого рассматривается в следующем разделе.

 

E.3. Определение коллекции содержимого для коллекции модулей

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

  1. Переопределить объект параметра ".content" для каждого элемента.
  2. Переопределить один или более объектов глобальной модели содержимого (обычно через объект параметра ".extras").

Конкретная стратегия зависит от природы комбинируемых модулей и природы интегрируемых элементов. Далее в этом разделе описывается техника интеграции двух различных классов модулей.

E.3.1. Интегрирование отдельных модулей в XHTML

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

  1. Решите, какой(ие) элемент(ы) может быть корневым(и) в новом модуле.
  2. Определите, где эти элементы необходимо подключить к дереву содержимого XHTML.
  3. Затем для каждой точки подключения в дереве содержимого добавьте корневой элемент(ы) к определению содержимого элементов XHTML.

Рассмотрим подключение элементов, определённых выше.
Элемент myelement является корневым. Чтобы подключить этот элемент под элементом img,  и только элементом img , в XHTML может сработать следующее:

<!ENTITY % img.content "( %MyModule.myelement.qname; )*">

ОТД, определённое с этой моделью содержимого, позволяет создать документ, подобный следующему фрагменту:

<img src="...">
<myml:myelement >Это содержимое локально определённого элемента</myml:myelement>
</img>

Важно отметить, что обычно элемент img имеет модель содержимого EMPTY. Путём добавления  myelement к этой модели содержимого мы в действительности просто заместили EMPTY  на  myelement.
В случае с элементами, которые уже имеют определённые модели содержимого, добавление элемента может потребовать переобъявления существующей модели содержимого в дополнение к  myelement.

E.3.2. Смешивание нового модуля с модулями в XHTML

В дополнение к предыдущему примеру: чтобы подключить этот модуль в любом месте, где разрешена группа моделей содержимого %Flow.mix, может потребоваться записать нечто такое:

<!ENTITY % Misc.extra
     "| %MyModule.myelement.qname;" >

Поскольку класс моделей содержимого %Misc.extra используется в объекте параметра %Misc.class и этот объект параметра используется повсеместно в модулях XHTML, новый модуль становится доступным в расширенном типе документа XHTML.

 

E.4. Создание нового ОТД

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

E.4.1. Создание простого ОТД

Используя простой предыдущий пример, можно определить новое ОТД, которое использует и довольно легко расширяет модули 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>

E.4.2. Создание ОТД путём расширения XHTML

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

Одним из таких сложных модулей является ОТД для [MATHML]. Чтобы объединить MathML и XHTML в единое ОТД, автору понадобится лишь решить, где содержимое MathML должно легализоваться в документе, и добавить корневой элемент MathML в модель содержимого в этой точке.
Во-первых, определим модуль модели содержимого, устанавливающий ОТД MathML и подключающий его к модели содержимого:

<!-- Файл 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;" >

Затем определим драйвер ОТД, идентифицирующий наш новый модуль модели содержимого как модель содержимого для ОТД и передающий процесс драйверу 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). Это будет лишь немного сложнее, чем в предыдущем примере. Базовые шаги таковы:

  1. Взять ОТД семейства XHTML как базу нового типа документа (мы будем использовать XHTML 1.1).
  2. Выбрать модули для удаления из этого ОТД.
  3. Определить новое ОТД, которое "IGNOREs/ИГНОРИРУЕТ" модули.
  4. Ввести некоторые новые модули.

Например, рассмотрим устройство, использующее модули XHTML, но без форм или таблиц. ОТД для такого устройства может выглядеть так:

<!-- Файл 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. Однако, поскольку XML игнорирует элементы моделей содержимого, которые не определены, элементы форм и таблиц автоматически удаляются из этой модели.

E.4.4. Создание нового ОТД

Наконец, некоторые авторы ОТД захотят начать с нуля, используя сценарий Модуляризации 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;

E.5. Использование нового ОТД

После того как новое ОТД разработано, оно может быть использовано в любом документе. ОТД используется просто - ссылкой на него в объявлении 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>

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