XHTML//名前空間

XHTML//名前空間

[1] XHTML 文書における XML名前空間の使用について。

[2] Modularization of XHTML - Building DTD Modules <http://www.w3.org/TR/xhtml-modularization/dtd_module_rules.html#s_module_namespace> によれば、

XHTML モジュールの作り方 : XML 名前空間まわり

[3] DTDモジュールとして実装する時は、 次のようにします。

  1. まず、修飾名部分モジュールを作ります。
    1. 引数実体 MODULE.prefixed を定義します。
    2. 引数実体 MODULE.xmlns を定義します。 その値は、モジュールで定義するものの名前空間名とします。
    3. 引数実体 MODULE.prefix を定義します。 その値は、既定の名前空間接頭辞とします。
    4. 引数実体 MODULE.pfx を定義します。 この引数実体の値は、名前空間接頭辞を使う場合は %MODULE.prefix;: に、 そうでない場合は (空文字列) にします。
    5. 引数実体 MODULE.xmlns.extra.attrib を定義します。その値は、このモジュールが参照する XML 名前空間属性(群)の宣言とします。
    6. 引数実体 XHTML.xmlns.extra.attrib を定義します。 値は %MODULE.xmlns.extra.attrib; とします。
      • この引数実体は、普通は駆動ファイルで先に定義されているものが使われるので、無視されます。
    7. このモジュールで定義する全ての要素型について、引数実体 MODULE.NAME.qname を用意し、要素型宣言などで使います。その値は %MODULE.pfx;NAME にします。
      • こうすることで、接頭辞を使うときは 接頭辞:NAME が、 使わないときには NAME が得られます。
    8. このモジュールで定義する接頭辞を持つ属性についても同様に MODULE.NAME.ATTRNAME.qname というような名前の引数実体を定義し、その値を %MODULE.pfx;ATTRNAME とします。
      • こうすると、接頭辞を使わないときに属性の接頭辞も消滅しちゃいますけど、そういう仕様ですかね?
  2. 次に、宣言部分モジュールを作成します。 このモジュールでは、要素型及び属性並びを宣言します。
    1. 引数実体 MODULE.xmlns.attrib を定義します。値には %NS.decl.attrib; を含めるべきです。 MODULE.prefixedIGNORE になっている (接頭辞を使わないことになっている) 時には、更に xmlns %URI.datatype; #FIXED '%MODULE.xmlns;' も含めるべきです。
    2. 全ての要素型と属性並びを定義します。 全ての要素型について、属性並び宣言に %MODULE.xmlns.attrib; を含めます。
      • ただし、要素型名及び接頭辞を持つ属性は前述の通り name.qname という引数実体を参照する形とします。
    • 宣言部分モジュールは実際の文書型の語彙を定義する部分ですから、形式的な修飾名部分モジュールほどきちんと規定されていません。 引数実体の名前や使い方などは当たり障りのない範囲でなら好きなようにしてかまいません。
    • 宣言部分モジュールの例が、 <http://www.w3.org/TR/xhtml-modularization/dtd_module_rules.html#declaration> にあります。 前半の名前空間属性に関する部分は定型なのでコピペして使っちゃいましょう。

XHTML モジュール DTD 実装の限界

[6] XHTML モジュールの DTD 実装では、 名前空間の接頭辞を文書実現値の途中で変更したりできません。 例えば、

<!DOCTYPE html
  SYSTEM "http://markup.example/some/xhtml/family/dtd">
<html>
<h:head xmlns:h="http://www.w3.org/1999/xhtml">
  <title>Title</title>
</h:head>
<body/>
</html>

のような文書を、 XHTML モジュールの設計の趣旨にのっとって実現する方法はありません。 (無理矢理宣言の一部を書き換えたりすれば実現できなくもないですが、それでは XHTML モジュールを使う意味が余りないというものです。)