1 |
wakaba |
1.1 |
#?SuikaWiki/0.9
|
2 |
|
|
[1] 【[[XHTMLモジュール]]】 [[名前空間属性]]の[[属性並び宣言]]での定義を入れる[[引数実体]]。
|
3 |
|
|
|
4 |
|
|
[2] ここいらは随分込み入った神業が使われてて分かりにくいんですが、、、。
|
5 |
|
|
まずとりあえず、 XHTML モジュールの作り方の流れについて
|
6 |
|
|
[CODE(WikiPage)[[[XHTML//名前空間]]]]を参照。
|
7 |
|
|
|
8 |
|
|
で、関係する部分だけまとめると、
|
9 |
|
|
|
10 |
|
|
[3] 説明のまえに、 XHTML m12n の DTD
|
11 |
|
|
の注意すべき組み立て方の特性・制限を幾つか挙げておきます。
|
12 |
|
|
- 基本的に、全要素で任意の xmlns:* 属性が使えるようになります。 [WEAK[(固定値属性なので、妥当性を検証する処理系で文書実現値に属性を補うとひどいことになります(藁)。)]]
|
13 |
|
|
- 各名前空間について、接頭辞の文字列、あるいは接頭辞なしにするか、はその文書実現値を通じて一定です。
|
14 |
|
|
途中で変更することは出来ません。 (× [SAMP(XML)[<ns1:parent xmlns="http://1.example/"><ns2:child xmlns:ns2="http://1.example/"/></ns1:parent>]])
|
15 |
|
|
-[6] 同じ接頭辞, あるいは接頭辞無しを、
|
16 |
|
|
複数の名前空間に対して与えることは、 DTD
|
17 |
|
|
駆動器の書き方次第で可能です。
|
18 |
|
|
(○ [SAMP(XML)[<ns1:parent xmlns:ns1="http://1.example/"><ns1:child xmlns:ns1="http://2.example/"/></ns1:parent>]])
|
19 |
|
|
--但し、内容モデルや名前空間属性の宣言で問題が生じないように注意して
|
20 |
|
|
DTD 駆動器を書かないといけません。
|
21 |
|
|
(! [SAMP(XML)[<!ELEMENT ns1:parent (ns1:child)*>]] + [SAMP(XML)[<ns1:parent xmlns:ns1="http://1.example/"><ns1:child xmlns:ns1="http://1.example/"/><ns1:child xmlns:ns1="http://2.example/"/></ns1:parent>]])
|
22 |
|
|
--だから多分、同時に1つの名前空間だけが接頭辞無し、とかとある接頭辞を使うようにしたほうが安全です。
|
23 |
|
|
実際 [[XHTML+MathML+SVG]] は高々1つの名前空間だけを接頭辞なしにできるようにしています。
|
24 |
|
|
|
25 |
|
|
>>4 ではややこしいことは考えずに、
|
26 |
|
|
XHTML + MathML + SVG 式のやり方を説明します。
|
27 |
|
|
|
28 |
|
|
[4] {修飾名モジュール} まず、個々のモジュールのそれぞれの名前空間の属性の属性並び宣言を用意します。
|
29 |
|
|
例: [SAMP(XML)[<!ENTITY % MODULE1.xmlns.decl.attrib "xmlns:MODULE1 %URI.datatype; #FIXED 'http://1.example/'">]],
|
30 |
|
|
[SAMP(XML)[<!ENTITY % MODULE2.xmlns.decl.attrib "xmlns %URI.datatype; #FIXED 'http://2.example/'">]]
|
31 |
|
|
|
32 |
|
|
追加の名前空間を簡単に追加できるように placfolder
|
33 |
|
|
も用意しておきます。
|
34 |
|
|
[SAMP(XML)[<!ENTITY % MODULE1.xmlns.extra.attrib "">]]
|
35 |
|
|
|
36 |
|
|
{修飾名モジュール} 次に、引数実体 [CODE(XML)[NS.decl.attrib]]
|
37 |
|
|
を定義しておきます。
|
38 |
|
|
ここには使える接頭辞名前空間属性
|
39 |
|
|
([CODE(XML)[xmlns]] を除いた、
|
40 |
|
|
[CODE(XML)[xmlns:[VAR[*]]]]) を入れておきます。
|
41 |
|
|
[SAMP(XML)[<!ENTITY % NS.decl.attrib "%MODULE1.xmlns.decl.attrib;%MODULE1.xmlns.extra.attrib;%MODULE2.xmlns.extra.attrib;">
|
42 |
|
|
|
43 |
|
|
もっとも、これは optional で、 XHTML m12n
|
44 |
|
|
附属書の説明にも特に書いてありません。普通
|
45 |
|
|
DTD 駆動器で宣言しちゃうので。でもまあ既定値として書いといて損はないでしょう。
|
46 |
|
|
|
47 |
|
|
{修飾名モジュール} 引数実体 [CODE(XML)[MODULE1.xmlns.attrib]]
|
48 |
|
|
を定義します。ここには [CODE(XML)[xmlns]]
|
49 |
|
|
属性の定義 (必要なら。) と、 [CODE(XML)[NS.decl.attrib]]
|
50 |
|
|
の参照を書いときます。
|
51 |
|
|
[SAMP(XML)[<!ENTITY % MODULE2.xmlns.attrib "%MODULE2.xmlns.decl.attrib;%NS.decl.attrib;">]]
|
52 |
|
|
|
53 |
|
|
{宣言モジュール} 全ての要素型の属性並び宣言で、
|
54 |
|
|
[CODE(XML)[MODULE.xmlns.attrib]] を参照します。
|
55 |
|
|
[SAMP(XML)[<!ATTLIST %MODULE1.etype.qname; attr1 CDATA #IMPLIED %MODULE1.xmlns.attrib;>]]
|
56 |
|
|
これによってこの要素の属性で名前空間属性が使えるようになるというわけです。
|
57 |
|
|
|
58 |
|
|
[5] で、 DTD 駆動器モジュールでは必要に応じてこれを上書きするんです。
|
59 |
|
|
ところが宣言順序の関係から、
|
60 |
|
|
ほとんど全部再定義する羽目になっちゃいます。。。
|
61 |
|
|
この辺は DTD を無理矢理モジュール化して使う無理さが滲み出まくってます。
|
62 |
|
|
|
63 |
|
|
{DTD 駆動器モジュール} 名前空間属性を宣言 : 修飾名モジュールと同じことをします。
|
64 |
|
|
|
65 |
|
|
{DTD 駆動器モジュール} [CODE(XML)[NS.decl.attrib]]
|
66 |
|
|
を定義 : 必須。
|
67 |
|
|
|
68 |
|
|
ここですべての名前空間の宣言を全部入れちゃいます。
|
69 |
|
|
[WEAK[(前述の通り >>6 は無視の方向で。)]]
|
70 |
|
|
XHTML + MathML + SVG では単なる [CODE(XML)[xmlns]]
|
71 |
|
|
属性も気にせずここに入れちゃってます
|
72 |
|
|
(たぶん >>6 を無視すれば気にする必要がないということでしょう)。
|
73 |
|
|
[SAMP(XML)[<!ENTITY % NS.decl.attrib "%MODULE1.xmlns.decl.attrib; %MODULE1.xmlns.decl.attrib; %MODULE2.xmlns.decl.attrib; %MODULE2.xmlns.decl.attrib;">]]
|
74 |
|
|
|
75 |
|
|
{DTD 駆動器モジュール} [CODE(XML)[[VAR[MODULE]].xmlns.attrib]]
|
76 |
|
|
を定義 : 前述。
|
77 |
|
|
|
78 |
|
|
これは普通に定義してあれば再定義する必要はないかも。
|
79 |
|
|
|
80 |
|
|
- [7] >>3 でも、 XHTML + (ry では SVG だけ接頭辞ありで、 MathML と XHTML はなし、っていう選択肢もあった。 |