XHTMLモジュール及び一般的なモジュール化の方法論を定義する第一の目的は,XHTMLに基づく文書型の開発を容易にすることである。これらの文書型は,[SMIL]などの追加的な性能を統合することによってXHTMLを拡張してもよいし,又は,特定の装置で使用するためにXHTMLのサブセットを定義してもよい。ここでは,文書型設計者がこのモジュール化体系のXML DTD実装を利用するために使用しなければならない技術を示す。これは,段階的に複雑な方法で,XHTMLモジュール化技術を適用し,種々のモジュールから完全文書型を生成する際に最も複雑な方法を使用することによって,実行する。
これらの例がXHTML提供のモジュールファイル実体自体の変更を必須とはしない点に注意すること。XHTMLモジュールファイル実体は,完全にパラメタ化されているため,個々のモジュール定義及びドライバファイルを通して,各要素及びその階層について,定義及び内容モデルをカスタム化できる。
最後に, XHTMLの利用者のほとんどがDTD作成者であることは期待されていないことを念頭におくこと。DTD作成者は,一般に,可読性を改善したり,文書のレンダリングを簡単化したり,文書の機械処理を容易にする特殊なマーク付けを定義しているか,又は固有のクライアントに専用のDTDを定義する必要のあるクライアント設計者である。次の場合を考える。
ある組織が, 加入者の情報をウェブインタフェース経由で提供している。この組織は, その加入者情報をXMLベースのデータベースに格納する。その情報をデータペースからウェブに報告する方法の一つに,XHTML文書に,データベースから直接XMLレコードを埋め込むことがある。レコードをほとんど埋め込むことができない場合は,組織は, そのレコードを記述するDTDモジュールを定義し,XHTML DTDにそのモジュールを追加し,それによってページに完全DTDを生成することができる。その後,組織は,文書オブジェクトモデル[DOM]を介して新しい要素内のデータにアクセスし,文書の妥当性を検証し,段階スタイルシート [CSS2]などを使用して, 階層化する要素にスタイル定義を提供することが可能となる。ここで定義された過程を使用して,データの構築を定義し,DTDを生成することに時間を費やせば,この組織は, XMLの利点を十分に享受することができる。
あるインタネットクライアント開発者が, 専門の装置を設計している。その装置はXHTMLのサブセットだけをサポートし,常に, 装置は,クライアントに渡す前に内容の妥当性を検証するプロキシサーバを介して,インタネットにアクセスする。これは,クライアントのエラー処理を最小限にするためである。内容の妥当性を確実にするために,開発者は,ここで定義される過程を使用してXHTMLのサブセットであるDTDを生成する。その後,新しいDTDをプロキシサーバ及び装置で使用し,内容開発者にもDTDを利用できるようにする。その結果,開発者は内容の妥当性を検証してからそれを利用することができるようになる。簡単な過程をいくつか実行することによって,クライアント開発者は,この文書で定義された体系を使用して,非常に簡単にDTD開発コストを抑え,取込みを選択するXHTMLのサブセットを完全にサポートしていることを保証できる。
XHTMLへの拡張が, 追加属性と同じ程度に簡単にすることが可能な場合もある。要素に追加のATTLISTを指定するだけで,その要素に属性を追加することができる。例を次に示す。
<!ATTLIST %a.qname; %MyModule.pfx;myattr CDATA #IMPLIED %MyModule.xmlns.extras.attrib; >
この例は,"%MyModule.pfx"によって定義される任意の接頭辞をもち,属性値がCDATAである"myattr"属性を"a"要素に追加している。XMLがDTDのどの点でも要素の属性リストを定義したり,拡張することができるため,これが有効となる。修飾名及び名前空間接頭辞の議論については,モジュールの名前空間の定義を参照されたい。
通常, 属性をDTDに追加することは,任意のクライアントにあらゆる新しい振る舞いを定義するという意味ではない。しかし,内容開発者は,特別な属性を使用して,例えば文書オブジェクトモデルなどによって,関連スクリプトがアクセスする情報を格納することができる。
追加要素の定義は,追加属性の定義より若干複雑になるにすぎない。基本的に,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 >
要素の定義の後,要素を内容モデルに統合する必要がある。新しい要素又は要素の集合を内容モデルに統合する方法は,次に解説される。
XHTMLモジュールの内容モデルは完全にパラメタ化されているため,DTD作成者はあらゆるモジュールのすべての要素の内容モデルを変更してもよい。 DTDモジュールインタフェースの詳細については,DTDモジュールの構築で定義されている。基本的に,この変更へのアプローチ方法は, 二つ存在する。
選択された方法は,結合されるモジュールの性質及び統合されるモジュールの性質に依存することになる。次の部分では,モジュールの二つの異なるクラスを統合する技術を示す。
モジュール(他のモジュールの集合であることも可能)がその内容モデルで互いに参照されるだけの要素しか含まない場合,"内部的に完全"であるという。モジュールは,単独で,モジュールとして使用することができる。例えば,そのモジュールそのものであり,その要素の一つを根要素として使用するDTDを定義することができる。このようなモジュールの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をその内容モデルに追加するのはEMPTY
をmyelement
で置換しているのと同じである。その他の要素がすでに内容モデルを定義している場合に,要素を追加するときは,myelement
の他に,既存の内容モデルの再記述が必須となる。
%Flow.mix内容モデルグループが使用できるすべての場所でこのモジュールを接続するためには,前述の例を拡張することが必須となる。その例を次に示す。
<!ENTITY % Misc.extra "| %MyModule.myelement.qname;" >
%Misc.extra内容モデルクラスが%Misc.classパラメタ実体で使用され,そのパラメタ実体がXHTMLモジュールの全体に渡って使用されるため,拡張されたXHTML文書型の全体を通して新しいモジュールが利用できるようになる。
ここでのこれまでの例は,XHTML及びXHTMLの内容モデルを拡張する方法を記述していた。一度これを実行すると,次の段階は,DTDを単一のDTDドライバに構成するモジュールを収集し,新しい定義を組み込むことによって,適切なものとして基本のXHTML定義を上書きし,増加させることになる。
前述のごく簡単な例を使用すると,非常に簡単に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>
次に,完全で付加的かつ複雑なモジュールを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;
DTD作成者がXHTMLモジュールを使用するもう一つの方法に,XHTMLファミリ文書型のサブセットであるDTDを定義することがある。これは,作成者がXHTMLのサブセットだけをサポートする装置又はソフトウェアを構築している場合などである。XHTMLファミリ文書型のサブセットであるDTDを定義するのは,前述の例に比べると若干複雑であるにすぎない。基本的な過程を次に示す。
例えば,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要素は,自動的にモデルから消去される。
最後に,新しいマーク付け言語を構築するために,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;
一度新しい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>