D. DTD モジュールの構築 (Building DTD Modules)

内容

本節は規範的

XHTML モジュールは、 DTD 断片として実装される。 これらの断片が、特定の方法(定義済みモジュールと拡張されたモジュールを持つ DTD の開発で定義される)で集められるとき、結果の DTD は完全な文書型を表現する。 この表現は、文書型の実例(インスタンス)の、妥当性検証 (validation) に利用することが出来る。

これらの断片を有意義な DTD に結合する鍵は、断片を定義するために用いられる規則である。 本節は、それらの規則を定義する。 これらの規則に従うとき、 DTD 作者は、自分のモジュールが他の XHTML 互換モジュールと、整合することを確信できる。

また、これらの規則に適合するモジュールは、 XHTML ファミリーモジュール であるために、 XHTML ファミリーモジュール適合性で定義される適合性要求も満たす必要がある。

D.1. パラメタ実体定義の命名 (Parameter Entity Naming)

本仕様書は、パラメタ実体を七つのカテゴリにクラス分けし、一貫して以下の接尾辞を用いてこれらを命名する:

.mod
パラメタ実体を用いて DTD モジュール(要素集合、属性集合、パラメタ実体集合など)を表すとき、それらは接尾辞 .mod を用いる。 本仕様書では、個々のモジュールは中核的な単位を持ち、別々のファイル実体として表されるかもしれない。
.module
選択可能なセクション・キーワード INCLUDEIGNORE の何れかを含めることで、 DTD モジュールを取り込むことを、パラメタ実体を用いて管理するとき、それらは接尾辞 .module を用いる。
.qname
パラメタ実体を用いて、要素の限定名 (qualified name) を表現するとき、それらを接尾辞 .qname を用いる。 限定名に関する詳細は、モジュールの名前空間定義 を見よ。
.content
パラメタ実体を要素タイプの内容モデルを表現するために用いるとき、それらは接尾辞 .content を用いる。
.class
パラメタ実体を同じクラスの要素を表現するために用いるとき、それらは接尾辞 .class を用いる。
.mix
パラメタ実体を別のクラスの要素タイプ集合を表現するために用いるとき、それらは接尾辞 .mix を用いる。
.attrib
ATTLIST 宣言中で一つ以上の完結した属性仕様を表現するトークンのグループを表現するために、パラメタ実体を用いるとき、それらは接尾辞 .attrib を用いる。

例えば、 HTML 4 で、 %block; パラメタ実体はブロック・レベル要素である要素の雑多な集合を表現するように定義されている。 本仕様書では、その結果のパラメタ実体は %Block.mix; である。

ここで定義されたクラス内のパラメタ実体を定義するときは、モジュールは一意的な接頭辞を用いて実体の名前を範囲付けるべきである。 例えば、mymodule 内の要素 myelement の内容モデルは、 MYMODULE.myelement.content と名付けられるかもしれない。 他のスキームも可能である。 使われたスキームに関わらず、モジュール作者は、定義したパラメタ実体が他のパラメタ実体と衝突しないように、またそのインタフェース方法がその利用者に明確なように、それらのパラメタ実体が一意的な名前を持つことを確実とするべく努力すべきである。

D.2. モジュールの名前空間定義 (Defining the Namespace of a Module)

XHTML はモジュール内で定義された要素や属性が定義された XML 名前空間 [XMLNAMES] の内部に存在するように要求する。 この名前空間は任意の URI で識別される。 XHTML は、モジュールが XML DTD を用いて実装されるとき、モジュールが特別な方法でその名前空間を宣言するように要求する。 この目的は、文書の構文解析/妥当性検証の時に、名前空間接頭辞の使用と、モジュールから要素と属性を識別するために使用される 接頭辞 の選択を許すことだ。

混合文書型をベースに文書を開発したいと望むコンテンツ開発者は、 XHTML 名前空間による要素、他の名前空間による要素、及びその両方による要素の XML 名前空間接頭辞の使用を選んでよい。 そのような文書が XHTML 適合であり、非名前空間認識ツールへの後方互換を確実にするためには、 W3C はコンテンツ開発者が XHTML 名前空間による要素の XML 名前空間接頭辞を 使ってはならない と勧告する。 コンテンツ開発者が、そのコンテンツを、名前空間を認識する処理装置によって処理されるようにすることに関心があるときは、 W3C は、メカニズムを履行しない XML 名前空間に依拠するよりも、 XML 名前空間接頭辞を用いて、非 XHTML 名前空間の要素を明示するように更に勧告する。

XML DTD として実装される個々の XHTML 適合モジュールは、初期名前空間接頭辞、文書実例内でこの接頭辞を変更する方法、その接頭辞で処理されるように変える記号セクションを定義するように要求される。

複数モジュールでは、それらが関係するときには、同じ名前空間の部分であることが適正であり、期待されていることに注意せよ。例えば、全ての XHTML モジュールは、同じ名前空間の部分である。

D.2.1. 限定名サブモジュール (Qualified Names sub-module)

まず、限定名サブモジュール(サブモジュールとは、最終的な DTD の適当な点へ繰り入れられるように分けられたファイル実体。)を定義する必要がある。 限定名サブモジュール (qualified names sub-module) は、以下の手順を用いて構築される(MODULE という語は、新しいモジュールの適当な文字列に置き換えられる):

  1. モジュール内の要素が XML 名前空間接頭辞と共に使われているかどうか知らせる、パラメタ実体 MODULE.prefixed を定義する。 このパラメタ実体の初期値は、 "%NS.prefixed;" であるべきである。 NS.prefixed パラメタ実体は、 XHTML フレームワークによって、初期状態では IGNORE となるように定義されており、文書実例内で、全ての包摂される名前空間(その XHTML モジュールの名前空間を含む)のための接頭辞のスイッチを入れるために用いることが出来る。
  2. このモジュールのための名前空間識別子を含む、パラメタ実体 MODULE.xmlns を定義する。
  3. 接頭辞をつけることが可能なときに用いる、初期接頭文字列を含む、パラメタ実体 MODULE.prefix を定義する。
  4. 接頭辞を付けることが可能なときは "%MODULE.prefix;:" であり、そうでないときは "" である、パラメタ実体 MODULE.pfx を定義する。
  5. そのモジュールで参照される名前空間のための XML 名前空間属性(すなわち xmlns:xlink)の宣言を含む、パラメタ実体 MODULE.xmlns.extra.attrib を定義する。 %MODULE.prefixed が INCLUDE に設定されているときは、この属性は xmlns:%MODULE.prefixed; 宣言もまた、含めるべきである。
  6. パラメタ実体 XHTML.xmlns.extra.attrib を、 MODULE.xmlns.extra.attrib として定義する。 これは通常、文書型のドライバファイルに上書きされるが、そうでないときは、この定義が初期値として肩代わりするだろう。
  7. モジュールで定義された個々の要素に対して、その限定名を保持するために、パラメタ実体 "MODULE.NAME.qnama" の形を創る。このパラメタ実体の値は、 "%MODULE.pfx;NAME" でなければならない。 このようにして、解析される値は、接頭辞が使えるときは "PREFIX:NAME" となり、そうでないときは "NAME" になるだろう。

    もし、或るモジュールが、そのモジュールと同じ名前空間を共有しないモジュールで定義される要素に、属性を追加すれば、それらの属性が %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" >

D.2.2. サブモジュール宣言 (Declaration sub-module(s))

次に、一つ以上の「サブモジュール宣言」を定義する必要がある。 これらの ファイル実体 の目的は、 XML DTD 要素と属性のリストを宣言することである。 XHTML 宣言モジュールは、以下の過程で構築すべきである:

  1. 個々の宣言された要素の ATTLIST で用いるためにパラメタ実体を定義する。 このパラメタ実体は、 %MODULE.prefixed; が INCLUDE に設定されているときは %NS.decl.attrib を含み、 %MODULE.prefixed; が IGNORE に設定されているときは %NS.decl.attrib; plus "xmlns %URI.datatype; #FIXED '%MODULE.xmlns;'" を含むべきである。
  2. モジュールの全ての要素と属性を宣言する。 或る要素のための個々の ATTLIST 内で、要求される全ての xmlns 属性が、モジュールの各々の要素で利用できるように、上記で定義されるパラメタ実体を含む。
  3. もしモジュールが、そのモジュールと同じ名前空間を共有しないモジュール内で定義される要素に属性を追加するならば、それらの要素が %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 -->

D.2.3. スタンドアローン DTD としてのモジュールの利用 (Using the module as a stand-alone DTD)

スタンドアローン(ネットワークから切断された) DTD としても利用可能な XHTML モジュールを用意しておくことが望ましいこともある。 この良い例は、われわれの上記の目録モジュールである。 これらのアイテムは、 XHTML 文書に埋め込まれる必要があり、また(例えば)データベースから抽出された自立している文書として利用可能である必要もある。 これを成し遂げる最も簡単な方法は、あなたのモジュールの部品の実例となる DTD ファイルを定義することである。 そのような DTD は、このような構造を持つだろう:

  1. XHTML データベースモジュールを含める(あなたの限定名モジュール (qname module) は、これらのデータ型の幾つかを多分使う - それは xmlns 属性のために URI データ型を確かに使う)。
  2. あなたのモジュールのための限定名モジュール (Qname Module) を含める。
  3. パラメタ実体 NS.decl.attrib が %MODULE.xmlns.extra.attrib; となるように定義する。
  4. あなたのモジュールのための宣言モジュール (Declaration Module(s)) を含める。

我々の目録モジュール (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>

D.2.4. 名前空間特異性 (Namespace Idiosyncrasies)

ここで定義されたアプローチが、 XML と XML 名前空間適合のマークアップ言語の宣言を許す一方で、 XML 名前空間仕様書で定義される幾つかの挙動はサポートされない:

  1. XML 名前空間は、ツリーのどのポイントでも、名前空間のための xmlns 属性を再宣言することを許す。 それは更に、名前空間を、初期化用法と接頭辞をつけられた用法の間で変えるように再宣言することを許し、接頭辞の変更を許す。 本文書で定義されるこの方法は、これを許さない。 文書実例を通して、与えられた名前空間は、(接頭辞が用いられるときは)継続して同じ接頭辞を用いなければならないか、又は継続して初期範囲で用いられなければならない。

  2. XML 名前空間を初期化して用いるときは、要素の名前空間を構文解析装置(パーサ)に知らせるために、文書の DTD に依拠することが適正である。 しかしながら、名前空間を認識できる処理装置は、文書を評価するときに、 DTD を読み込むように要求されないのだから、コンテンツ開発者は、名前空間を変更するときはいつでも、要素の XML 名前空間を宣言すべきである:

    ...
    <p>
       <myelement xmlns="..." />
    </p>
    


この邦訳は、私 SUGAI, Manabu が私的な勉強のために作成したものです。訳文の正確さは保証できません。特に技術的な利用においては、 W3C の原典を参照してください。

last modified: 15th/Aug./2001; Translated by SUGAI, Manabu.

SEO [PR] !uO z[y[WJ Cu