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