内容
本節は規範的。
XHTML モジュールは、 DTD 断片として実装される。 これらの断片が、特定の方法(定義済みモジュールと拡張されたモジュールを持つ DTD の開発で定義される)で集められるとき、結果の DTD は完全な文書型を表現する。 この表現は、文書型の実例(インスタンス)の、妥当性検証 (validation) に利用することが出来る。
これらの断片を有意義な DTD に結合する鍵は、断片を定義するために用いられる規則である。 本節は、それらの規則を定義する。 これらの規則に従うとき、 DTD 作者は、自分のモジュールが他の XHTML 互換モジュールと、整合することを確信できる。
また、これらの規則に適合するモジュールは、 XHTML ファミリーモジュール であるために、 XHTML ファミリーモジュール適合性で定義される適合性要求も満たす必要がある。
本仕様書は、パラメタ実体を七つのカテゴリにクラス分けし、一貫して以下の接尾辞を用いてこれらを命名する:
.mod を用いる。
本仕様書では、個々のモジュールは中核的な単位を持ち、別々のファイル実体として表されるかもしれない。.module を用いる。.qname を用いる。
限定名に関する詳細は、モジュールの名前空間定義 を見よ。.content を用いる。.class を用いる。.mix を用いる。.attrib を用いる。例えば、 HTML 4 で、 %block; パラメタ実体はブロック・レベル要素である要素の雑多な集合を表現するように定義されている。 本仕様書では、その結果のパラメタ実体は %Block.mix; である。
ここで定義されたクラス内のパラメタ実体を定義するときは、モジュールは一意的な接頭辞を用いて実体の名前を範囲付けるべきである。
例えば、mymodule 内の要素 myelement の内容モデルは、 MYMODULE.myelement.content と名付けられるかもしれない。
他のスキームも可能である。
使われたスキームに関わらず、モジュール作者は、定義したパラメタ実体が他のパラメタ実体と衝突しないように、またそのインタフェース方法がその利用者に明確なように、それらのパラメタ実体が一意的な名前を持つことを確実とするべく努力すべきである。
XHTML はモジュール内で定義された要素や属性が定義された XML 名前空間 [XMLNAMES] の内部に存在するように要求する。 この名前空間は任意の URI で識別される。 XHTML は、モジュールが XML DTD を用いて実装されるとき、モジュールが特別な方法でその名前空間を宣言するように要求する。 この目的は、文書の構文解析/妥当性検証の時に、名前空間接頭辞の使用と、モジュールから要素と属性を識別するために使用される 接頭辞 の選択を許すことだ。
混合文書型をベースに文書を開発したいと望むコンテンツ開発者は、 XHTML 名前空間による要素、他の名前空間による要素、及びその両方による要素の XML 名前空間接頭辞の使用を選んでよい。 そのような文書が XHTML 適合であり、非名前空間認識ツールへの後方互換を確実にするためには、 W3C はコンテンツ開発者が XHTML 名前空間による要素の XML 名前空間接頭辞を 使ってはならない と勧告する。 コンテンツ開発者が、そのコンテンツを、名前空間を認識する処理装置によって処理されるようにすることに関心があるときは、 W3C は、メカニズムを履行しない XML 名前空間に依拠するよりも、 XML 名前空間接頭辞を用いて、非 XHTML 名前空間の要素を明示するように更に勧告する。
XML DTD として実装される個々の XHTML 適合モジュールは、初期名前空間接頭辞、文書実例内でこの接頭辞を変更する方法、その接頭辞で処理されるように変える記号セクションを定義するように要求される。
複数モジュールでは、それらが関係するときには、同じ名前空間の部分であることが適正であり、期待されていることに注意せよ。例えば、全ての XHTML モジュールは、同じ名前空間の部分である。
まず、限定名サブモジュール(サブモジュールとは、最終的な DTD の適当な点へ繰り入れられるように分けられたファイル実体。)を定義する必要がある。 限定名サブモジュール (qualified names sub-module) は、以下の手順を用いて構築される(MODULE という語は、新しいモジュールの適当な文字列に置き換えられる):
もし、或るモジュールが、そのモジュールと同じ名前空間を共有しないモジュールで定義される要素に、属性を追加すれば、それらの属性が %MODULE.pfx 接頭辞を用いるように、それらの属性を宣言する。 例:
<ENTITY % MODULE.img.myattr.qname "%MODULE.pfx;myattr" >
仮想的な目録モジュール (Inventory Module) の限定名サブモジュール (qname sub-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"
...................................................................... -->
<!-- Declare the default value for prefixing of this module's elements -->
<!-- Note that the NS.prefixed will get overridden by the XHTML Framework or
by a document instance. -->
<!ENTITY % NS.prefixed "IGNORE" >
<!ENTITY % Inventory.prefixed "%NS.prefixed;" >
<!-- Declare the actual namespace of this module -->
<!ENTITY % Inventory.xmlns "http://www.example.com/xmlns/inventory" >
<!-- Declare the default prefix for this module -->
<!ENTITY % Inventory.prefix "inventory" >
<!-- Declare the prefix for this module -->
<![%Inventory.prefixed;[
<!ENTITY % Inventory.pfx "%Inventory.prefix;:" >
]]>
<!ENTITY % Inventory.pfx "" >
<!-- Declare the xml namespace attribute for this module -->
<![%Inventory.prefixed;[
<!ENTITY % Inventory.xmlns.extra.attrib
"xmlns:%Inventory.prefix; %URI.datatype; #FIXED '%Inventory.xmlns;'" >
]]>
<!ENTITY % Inventory.xmlns.extra.attrib "" >
<!-- Declare the extra namespace that should be included in the XHTML
elements -->
<!ENTITY % XHTML.xmlns.extra.attrib
%Inventory.xmlns.extra.attrib; >
<!-- Now declare the qualified names for all of the elements in the
module -->
<!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" >
次に、一つ以上の「サブモジュール宣言」を定義する必要がある。 これらの ファイル実体 の目的は、 XML DTD 要素と属性のリストを宣言することである。 XHTML 宣言モジュールは、以下の過程で構築すべきである:
もしモジュールが、そのモジュールと同じ名前空間を共有しないモジュール内で定義される要素に属性を追加するならば、それらの要素が %MODULE.pfx 接頭辞を用いるように、宣言する。例えば:
<ENTITY % MODULE.img.myattr.qname "%MODULE.pfx;myattr" >
<!ATTLIST %img.qname;
%MODULE.img.myattr.qname; CDATA #IMPLIED
>
このモジュールは画像モジュール (Image Module) の img 要素に属性を追加するが、その文書実例のための接頭辞が選択されるときは、この属性の名前は限定名 (qualified name) であり、接頭辞を含むことになるだろう。
また、それは、 XML 名前空間認識構文解析装置(パーサ)がその接頭辞に基づく名前空間の解決方法を知ることが出来るように、 img 要素の属性リストに、 xmlns:MODULE_PREFIX 属性を追加する。
下記の例は、仮想的な目録モジュール (Inventory Module) のための宣言サブモジュールを示している。
<!-- ...................................................................... -->
<!-- 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
This module defines a simple inventory item structure
-->
<!-- Define the global namespace attributes -->
<![%Inventory.prefixed;[
<!ENTITY % Inventory.xmlns.attrib
"%NS.decl.attrib;"
>
]]>
<!ENTITY % Inventory.xmlns.attrib
"xmlns %URI.datatype; #FIXED '%Inventory.xmlns;'"
>
<!-- Define a common set of attributes for all module elements -->
<!ENTITY % Inventory.Common.attrib
"%Inventory.xmlns.attrib;
id ID #IMPLIED
>
<!-- Define the elements and attributes of the module -->
<!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 -->
スタンドアローン(ネットワークから切断された) DTD としても利用可能な XHTML モジュールを用意しておくことが望ましいこともある。 この良い例は、われわれの上記の目録モジュールである。 これらのアイテムは、 XHTML 文書に埋め込まれる必要があり、また(例えば)データベースから抽出された自立している文書として利用可能である必要もある。 これを成し遂げる最も簡単な方法は、あなたのモジュールの部品の実例となる DTD ファイルを定義することである。 そのような DTD は、このような構造を持つだろう:
我々の目録モジュール (Inventory Module) のためのこの構造の例は、以下に含まれる:
<!-- ...................................................................... -->
<!-- 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
This module defines a simple inventory item structure
-->
<!-- Bring in the 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;
<!-- Bring in the qualified names -->
<!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 -->
次に、この 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>
最後に、文書実例は、その DOCTYPE ヘッダ内とその内部サブセット内で宣言することで、別の XML 名前空間を利用できる:
<!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>
ここで定義されたアプローチが、 XML と XML 名前空間適合のマークアップ言語の宣言を許す一方で、 XML 名前空間仕様書で定義される幾つかの挙動はサポートされない:
XML 名前空間は、ツリーのどのポイントでも、名前空間のための xmlns 属性を再宣言することを許す。 それは更に、名前空間を、初期化用法と接頭辞をつけられた用法の間で変えるように再宣言することを許し、接頭辞の変更を許す。 本文書で定義されるこの方法は、これを許さない。 文書実例を通して、与えられた名前空間は、(接頭辞が用いられるときは)継続して同じ接頭辞を用いなければならないか、又は継続して初期範囲で用いられなければならない。
XML 名前空間を初期化して用いるときは、要素の名前空間を構文解析装置(パーサ)に知らせるために、文書の DTD に依拠することが適正である。 しかしながら、名前空間を認識できる処理装置は、文書を評価するときに、 DTD を読み込むように要求されないのだから、コンテンツ開発者は、名前空間を変更するときはいつでも、要素の XML 名前空間を宣言すべきである:
... <p> <myelement xmlns="..." /> </p>
この邦訳は、私 SUGAI, Manabu が私的な勉強のために作成したものです。訳文の正確さは保証できません。特に技術的な利用においては、 W3C の原典を参照してください。
last modified: 15th/Aug./2001; Translated by SUGAI, Manabu.