E. 定義モジュール及び拡張モジュールをもつDTDの開発

XHTMLモジュール及び一般的なモジュール化の方法論を定義する第一の目的は,XHTMLに基づく文書型の開発を容易にすることである。これらの文書型は,[SMIL]などの追加的な性能を統合することによってXHTMLを拡張してもよいし,又は,特定の装置で使用するためにXHTMLのサブセットを定義してもよい。ここでは,文書型設計者がこのモジュール化体系のXML DTD実装を利用するために使用しなければならない技術を示す。これは,段階的に複雑な方法で,XHTMLモジュール化技術を適用し,種々のモジュールから完全文書型を生成する際に最も複雑な方法を使用することによって,実行する。

これらの例がXHTML提供のモジュールファイル実体自体の変更を必須とはしない点に注意すること。XHTMLモジュールファイル実体は,完全にパラメタ化されているため,個々のモジュール定義及びドライバファイルを通して,各要素及びその階層について,定義及び内容モデルをカスタム化できる。

最後に, XHTMLの利用者のほとんどがDTD作成者であることは期待されていないことを念頭におくこと。DTD作成者は,一般に,可読性を改善したり,文書のレンダリングを簡単化したり,文書の機械処理を容易にする特殊なマーク付けを定義しているか,又は固有のクライアントに専用のDTDを定義する必要のあるクライアント設計者である。次の場合を考える。

E.1. 追加属性の定義

XHTMLへの拡張が, 追加属性と同じ程度に簡単にすることが可能な場合もある。要素に追加のATTLISTを指定するだけで,その要素に属性を追加することができる。例を次に示す。

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

この例は,"%MyModule.pfx"によって定義される任意の接頭辞をもち,属性値がCDATAである"myattr"属性を"a"要素に追加している。XMLがDTDのどの点でも要素の属性リストを定義したり,拡張することができるため,これが有効となる。修飾名及び名前空間接頭辞の議論については,モジュールの名前空間の定義を参照されたい。

通常, 属性をDTDに追加することは,任意のクライアントにあらゆる新しい振る舞いを定義するという意味ではない。しかし,内容開発者は,特別な属性を使用して,例えば文書オブジェクトモデルなどによって,関連スクリプトがアクセスする情報を格納することができる。

E.2. 追加要素の定義

追加要素の定義は,追加属性の定義より若干複雑になるにすぎない。基本的に,DTD作成者は,各要素に要素宣言を書き込むのが望ましい。

<!-- In the qname sub-module -->
<!ENTITY % MyModule.myelement.qname  "%MyModule.pfx;myelement" >
<!ENTITY % MyModule.myotherelement.qname  "%MyModule.pfx;myotherelement" >

<!-- In the declaration sub-module -->
<!ELEMENT %MyModule.myelement.qname; 
           ( #PCDATA | %MyModule.myotherelement.qname; )* >
<!ATTLIST %MyModule.myelement.qname;
          myattribute    CDATA    #IMPLIED
>

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

要素の定義の後,要素を内容モデルに統合する必要がある。新しい要素又は要素の集合を内容モデルに統合する方法は,次に解説される。

E.3. モジュールの集合に関する内容モデルの定義

XHTMLモジュールの内容モデルは完全にパラメタ化されているため,DTD作成者はあらゆるモジュールのすべての要素の内容モデルを変更してもよい。 DTDモジュールインタフェースの詳細については,DTDモジュールの構築で定義されている。基本的に,この変更へのアプローチ方法は, 二つ存在する。

  1. 各要素に".content"パラメタ実体を再定義する。
  2. 大域的内容モデル実体を一つ以上再定義する。通常は ".extras"パラメタ実体を介して行う。

選択された方法は,結合されるモジュールの性質及び統合されるモジュールの性質に依存することになる。次の部分では,モジュールの二つの異なるクラスを統合する技術を示す。

E.3.1. 独立モジュールのXHTMLへの統合

モジュール(他のモジュールの集合であることも可能)がその内容モデルで互いに参照されるだけの要素しか含まない場合,"内部的に完全"であるという。モジュールは,単独で,モジュールとして使用することができる。例えば,そのモジュールそのものであり,その要素の一つを根要素として使用するDTDを定義することができる。このようなモジュールのXHTMLへの統合は,次の三つの過程で行う。

  1. どの要素を新しいモジュールの根として考えるかを決定する。
  2. これらの要素をXHTML内容木のどこで接続する必要があるかを決定する。
  3. その後,内容木の各接続点で,根要素をXHTML要素の内容定義に追加する。

ここで定義する要素の接続を検討してみる。この例では,要素myelementが根である。この要素をimg要素の下,すなわち,XHTMLのimg要素だけに接続するためには,次を実行することになる。

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

この内容モデルで定義されるDTDにより,次の素片に類似する文書を利用することができる。

<img src="...">
<myml:myelement >This is content of a locally defined element</myml:myelement>
</img>

通常,img要素にはEMPTYの内容モデルが存在する点に注意することが重要である。myelementをその内容モデルに追加するのはEMPTYmyelementで置換しているのと同じである。その他の要素がすでに内容モデルを定義している場合に,要素を追加するときは,myelementの他に,既存の内容モデルの再記述が必須となる。

E.3.2. XHTMLの全モジュールでの新モジュールの混合

%Flow.mix内容モデルグループが使用できるすべての場所でこのモジュールを接続するためには,前述の例を拡張することが必須となる。その例を次に示す。

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

%Misc.extra内容モデルクラスが%Misc.classパラメタ実体で使用され,そのパラメタ実体がXHTMLモジュールの全体に渡って使用されるため,拡張されたXHTML文書型の全体を通して新しいモジュールが利用できるようになる。

E.4. 新しいDTDの生成

ここでのこれまでの例は,XHTML及びXHTMLの内容モデルを拡張する方法を記述していた。一度これを実行すると,次の段階は,DTDを単一のDTDドライバに構成するモジュールを収集し,新しい定義を組み込むことによって,適切なものとして基本のXHTML定義を上書きし,増加させることになる。

E.4.1. 簡単なDTDの生成

前述のごく簡単な例を使用すると,非常に簡単にXHTMLモジュールを使用し,拡張する新しいDTDを定義することができる。まず,モジュール内にある新しい要素及びその内容モデルを定義する。

<!-- File: simpleml-model-1.mod -->

<!-- Declare a Parameter Entity (PE) that defines any external namespaces 
     that are used by this module -->

<!-- Set the PE that is used in every ATTLIST in this module 
     NS.prefixed.attrib is initialized in the xhtml-qname module, and
     SimpleML.ns.noprefix.attrib is initialized in the SimpleML DTD driver 
     file.-->
<!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
>

<!-- Add our elements to the XHTML content model -->
<!ENTITY % Misc.class
     "| %SimpleML.element.qname;" >

<!-- Now bring in the XHTML Basic content model -->
<!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;

次に,新しい言語にDTDドライバを定義する。

<!-- file: simpleml-1_0.dtd -->

<!-- Bring in the XHTML datatypes -->
<!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;

<!-- Declare the actual namespace of this module -->
<!ENTITY % SimpleML.xmlns "http://www.example.com/xmlns/simpleml1" >

<!-- By default, disable prefixing of new module -->
<!ENTITY % NS.prefixed "IGNORE" >
<!ENTITY % SimpleML.prefixed "%NS.prefixed;" > 

<!-- Default prefix for module elements and attributes -->
<!ENTITY % SimpleML.prefix "simpleml" >

<!-- If this module's namespace is prefixed -->
<![%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;"
>
<!-- Set the content model for our language -->
<!ENTITY % xhtml-model.mod
     SYSTEM "simpleml-model-1.mod" >
<!-- Instantiate xhtml basic's DTD to do all the work -->
<!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;

このDTDを使用すると,XML名前空間接頭辞を使用することができる。XML名前空間接頭辞を使用する際は,この新しいDTDを使用する文書の冒頭は, 次に類似する。

<!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>An example using defaults</title>
</head>
<body>
<p>This is content in the XHTML namespace</p>
<simpleml:element>
  This is content in the SimpleML namespace.
  <simpleml:otherelement />
</simpleml:element>
<p><img src="missing" alt="Missing image" simpleml:myattr="value"/></p>
</body>
</html>

E.4.2. XHTMLの拡張によるDTDの生成

次に,完全で付加的かつ複雑なモジュールをXHTML又はXHTMLのサブセットに追加する場合を示す。本質的には,これは前述のごく簡単な例と同じであり,唯一の違いは,追加されるモジュールがDTDの新しい定義を明示的に含むのではなく,参照によってDTDに取り込まれる点である。

この複雑なモジュールの一つは,[MATHML]のDTDである。MathML及びXHTMLを単一のDTDに結合するために,作成者は,文書でMathMLの内容が合法であるのが望ましい場所を決定し,その点で,MathML根要素を内容モデルに追加することになる。最初に,MathML DTDをインスタンス化し,それを内容モデルに結合する内容モデルモジュールを定義する。

<!-- File: 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;" >

次に,新しい内容モデルモジュールをDTDの内容モデルとして識別し,XHTML1.1ドライバなどに処理を渡すDTDドライバを定義する。

<!-- File: 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モジュールの除去及び置換によるDTDの生成

DTD作成者がXHTMLモジュールを使用するもう一つの方法に,XHTMLファミリ文書型のサブセットであるDTDを定義することがある。これは,作成者がXHTMLのサブセットだけをサポートする装置又はソフトウェアを構築している場合などである。XHTMLファミリ文書型のサブセットであるDTDを定義するのは,前述の例に比べると若干複雑であるにすぎない。基本的な過程を次に示す。

  1. XHTMLファミリDTDを新しい文書型の基礎として認識する。XHTML1.1を使用することになる。
  2. モジュールを選択して,そのDTDから除去する。
  3. モジュールを"無視する"新しいDTDを定義する。
  4. 新しいモジュールをいくつか導入する。

例えば,XHTMLモジュールを使用するが,フォーム又は表は除く装置を検討する。この装置のDTDは, 次に類似する。

<!-- File: xhtml-simple.dtd -->
<!ENTITY % xhtml-form.module "IGNORE" >
<!ENTITY % xhtml-table.module "IGNORE" >
<!ENTITY % xhtml-table.module "IGNORE" >
<!-- Bring in the basic tables module -->
<!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;

これは,実際には,XHTML1.1DTDの内容モデルを変更しない点に注意すること。しかし,XMLが定義されていない内容モデルの要素を無視するため,form要素及びtable要素は,自動的にモデルから消去される。

E.4.4. 新しいDTDの生成

最後に,新しいマーク付け言語を構築するために,XHTMLモジュール化枠組みをツールキットとして使用して,スクラッチを開始したいと考えるDTD作成者もいる。この言語は,XHTMLを基礎とした最小で必須のモジュールから作成されなければならない。同様に,作成者が採用したいと考える他のXHTML定義のモジュール,又は,その他すべてのモジュールを含んでもよい。この例では,XHTML必須モジュールを採用し,XHTML定義のモジュールをいくつか追加し,ここで定義したモジュール内にも追加する。

最初の過程は,XHTML提供のtemplateを新しい修飾名モジュールに使用することとする。この修飾名モジュールは,修飾名及び名前空間を新しい要素に定義するために変更される。

<!-- file: myml-qname-1.mod -->

<!-- Bring in the datatypes - we use the URI.datatype PE for declaring the
     xmlns attributes. -->
<!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;

<!-- By default, disable prefixing of this module -->
<!ENTITY % NS.prefixed "IGNORE" >
<!ENTITY % MyML.prefixed "%NS.prefixed;" >

<!-- Declare the actual namespace of this module -->
<!ENTITY % MyML.xmlns "http://www.example.com/xmlns/myml" >

<!-- Declare the default prefix for this module -->
<!ENTITY % MyML.prefix "myml" >

<!-- If this module's namespace is prefixed -->
<![%MyML.prefixed;[
  <!ENTITY % MyML.pfx  "%MyML.prefix;:" >
]]>
<!ENTITY % MyML.pfx  "" >

<!-- Declare a Parameter Entity (PE) that defines any external namespaces 
     that are used by this module -->
<!ENTITY % MyML.xmlns.extra.attrib "" >

<!-- Declare a PE that defines the xmlns attributes for use by 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;"
>

<!-- Make sure that the MyML namespace attributes are included on the XHTML
     attribute set -->
<![%NS.prefixed;[
<!ENTITY % XHTML.xmlns.extra.attrib
    "%MyML.xmlns.attrib;" >
]]>
<!ENTITY % XHTML.xmlns.extra.attrib
    ""
>
<!-- Now declare the element names -->

<!ENTITY % MyML.myelement.qname "%MyML.pfx;myelement" >
<!ENTITY % MyML.myotherelement.qname "%MyML.pfx;myotherelement" >

次に,XHTML提供のtemplateを使用して,要素及び属性を定義するモジュールを定義する。

<!-- ...................................................................... -->
<!-- My Elements Module ................................................... -->
<!-- file: 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 Module

     myelement
     myotherelement

     This module has no purpose other than to provide structure for some
     PCDATA content.
-->

<!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;
>

<!-- end of myml-elements-1_0.mod -->

次に,新しい要素及び属性を他のXHTML要素にフックする内容モデル記述を構築する。次の例は,XHTMLBasic内容モデルの後にパタン化されるが,完全で自立型の内容モデルモジュールである。

<!-- ...................................................................... -->
<!-- MyML Model Module  ................................................... -->
<!-- file: 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"
     ...................................................................... -->

<!-- Define the content model for Misc.extra -->
<!ENTITY % Misc.class
     "| %MyML.myelement.qname; ">

<!-- ....................  Inline Elements  ...................... -->

<!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; includes all inline elements,
     used as a component in mixes
-->
<!ENTITY % Inline.class
     "%InlStruct.class;
      %InlPhras.class;
      %InlPres.class;
      %Anchor.class;
      %InlSpecial.class;"
>

<!-- %InlNoAnchor.class; includes all non-anchor inlines,
     used as a component in mixes
-->
<!ENTITY % InlNoAnchor.class
     "%InlStruct.class;
      %InlPhras.class;
      %InlPres.class;
      %InlSpecial.class;"
>

<!-- %InlNoAnchor.mix; includes all non-anchor inlines
-->
<!ENTITY % InlNoAnchor.mix
     "%InlNoAnchor.class;
      %Misc.class;"
>

<!-- %Inline.mix; includes all inline elements, including %Misc.class;
-->
<!ENTITY % Inline.mix
     "%Inline.class;
      %Misc.class;"
>

<!-- .....................  Block Elements  ...................... -->

<!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; includes all block elements,
     used as an component in mixes
-->
<!ENTITY % Block.class
     "%BlkStruct.class;
      %BlkPhras.class;
      %BlkPres.class;
      %Block.extra;"
>

<!-- %Block.mix; includes all block elements plus %Misc.class;
-->
<!ENTITY % Block.mix
     "%Heading.class;
      | %List.class;
      | %Block.class;
      %Misc.class;"
>

<!-- ................  All Content Elements  .................. -->

<!-- %Flow.mix; includes all text content, block and inline
-->
<!ENTITY % Flow.mix
     "%Heading.class;
      | %List.class;
      | %Block.class;
      | %Inline.class;
      %Misc.class;"
>

<!-- special content model for pre element -->
<!ENTITY % pre.content
    "( #PCDATA
     | %Inline.class; )*"
>

<!-- end of myml-model-1.mod -->

最後に,XHTML提供のtemplateを新しいDTDに使用する。この新しいDTDは,新しいマーク付け言語用に適切に変更されている。

<!-- ....................................................................... -->
<!-- MYML DTD  ............................................................. -->
<!-- file: myml-1_0.dtd -->

<!-- This is the DTD driver for myml 1.0.

     Please use this formal public identifier to identify it:

         "-//MY COMPANY//DTD XHTML MYML 1.0//EN"

     And this namespace for myml-unique elements:

         xmlns:myml="http://www.example.com/xmlns/myml"
-->
<!ENTITY % XHTML.version  "-//MY COMPANY//DTD XHTML MYML 1.0//EN" >

<!-- reserved for use with document profiles -->
<!ENTITY % XHTML.profile  "" >

<!-- Tell the framework to use our qualified names module as an extra qname
driver -->
<!ENTITY % xhtml-qname-extra.mod
     SYSTEM "myml-qname-1.mod" >

<!-- Define the Content Model for the framework to use -->
<!ENTITY % xhtml-model.mod
     SYSTEM "myml-model-1.mod" >

<!-- Disable bidirectional text support -->
<!ENTITY % XHTML.bidi  "IGNORE" >

<!-- Bring in the XHTML Framework -->
<!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 Module (Required)  ............................... -->
<!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 Module (required) ................................. -->
<!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 Module (required)  .................................... -->
<!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 Module   ........................................ -->
<!ENTITY % MyML-elements.mod
     SYSTEM "myml-elements-1.mod" >
%MyML-elements.mod;

<!-- XHTML Images module  ........................................ -->
<!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 Module  ............................ -->
<!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 Module (required)  ....................... -->
<!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. 新しいDTDの使用

一度新しいDTDを開発すると,すべての文書でそれを使用することができる。DTDを使用するのは簡単であり,文書のDOCTYPE宣言でそれを参照するのと変わらない。

<!DOCTYPE html SYSTEM "myml-1_0.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>An example using defaults</title>
</head>
<body>
<p>This is content in the XHTML namespace</p>
<myelement>
  This is content in the SimpleML namespace.
  <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>An example using defaults</title>
</head>
<body>
<p>This is content in the XHTML namespace</p>
<myml:myelement>
  This is content in the myml namespace.
  <myml:myotherelement />
</myml:myelement>
<p><img src="missing" alt="Missing image" myml:myattr="value" /></p>
</body>
</html>