/
457.txt
163 lines (128 loc) · 6.14 KB
/
457.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
[1] 【[[SGML]]】 [[マーク区間の有効状態]]が[[文字データ]]
([CODE(SGML)[[[CDATA]]]]) である[[マーク区間]](宣言)。
[2] [[XML]] では、[DFN[CDATA [RUBYB[区間] [section]]]]は[[文字データ]]が出現可能なところにどこにでも出現可能です。
CDATA 区間は、そうしなければ[[マーク]]として認知される[[文字]]を含む[[文]]塊を
[[escape]] するのに使います。 CDATA 区間は文字列
[CODE(XML)[<!'''['''CDATA'''[''']] で始まり、文字列
[CODE(XML)[''']'''''']'''>]] で終わります。
仕様書:
- [[XML 1.0]] <http://www.w3.org/TR/REC-xml#NT-CharData>
- [[XML 1.1]] <http://www.w3.org/TR/xml11#NT-CharData>
[3] CDATA 区間では、[[マーク区間終了]]
([[規格参照具象構文]]や [[XML]] では [CODE(SGML)[''']'''''']'''>]])
だけが[[認知]]されます。
逆に言えば、マーク区間の内容に文字列 [SAMP(SGML)[''']'''''']'''>]]
を書くことは出来ません。
また、 CDATA 区間内では文字列は[[文字データ]]として、
つまり[Q[かかれたままに]]解釈されます。
ですから[[実体参照]]は展開されません。
[4] [SAMP[''']'''''']'''>]] という文字列を書きたいときは、
[SAMP(SGML)[<!'''['''CDATA'''[''' ... ''']'''''']'''''']'''''']'''>><!'''['''CDATA'''[''' ... ''']'''''']'''>]]
とでもするか、 CDATA 区間の使用を諦めるしか方法はありません。
[5] XML では、[[状態見出し語指定]]は正確に [CODE(XML)[CDATA]]
だけでなければなりません。 [CODE(SGML)[[[ps]]]] を使うことは出来ませんから、
[[引数実体参照]]を使ったり、前後に[[空白]]を入れることは出来ません。
複数或いは空の[[状態見出し語]]を指定することもできません。
[6] XML では、 CDATA 区間が[[文書実現値]]中で使用できる唯一の[[マーク区間]]です。
[11]
一部で [CODE(SGML)[CDATA]] 区間内であっても
[CODE(XML)[''']'''''']'''>]] と書けば
[CODE[''']'''''']'''>]] と解釈されているという解説がありますが、
これは''間違い''です。
[CODE(XML)[CDATA]] 区間内で
[CODE(XML)[''']'''''']'''>]] と書いたら本当に [CODE[''']'''''']'''>]]
([CODE(XML)[CDATA]] 区間の''外''で [SAMP(XML)[''']'''''']'''&gt;]] と書くのと同じこと。) になります。
([[名無しさん]])
[12]
'''いつ使うのか?''':
[Q[[CODE(XML)@en[CDATA]] 区間を必ず使わなければならない場面]]というのは存在しません。
[CODE(XML)@en[CDATA]] 区間はいわゆる[[構文糖]]で、
[Q[あったら便利かもしれないけど無くても困らない]]ものです。
[[XML]] の[[要素]]の[[内容]]では [CODE(char)[<]] や [CODE(char)[&]]
や [CODE(char)[''']'''''']'''>]] を直接書けず、
[CODE(XML)@en[<]] や [CODE(XML)@en[&]] や
[CODE(XML)@en[''']'''''']'''>]]
などと書かなければなりません
[WEAK[(そうしなければ[[タグ]]など特別な意味で解釈されてしまいます)]]。
これらが沢山含まれる時は、書き換えが面倒です。
そこで [CODE(XML)@en[CDATA]] 区間を使うと、 [CODE(char)[<]]
や [CODE(char)[&]] をそのまま書くことができるようになります。
([CODE(char)[''']'''''']'''>]]
だけは [CODE(XML)@en[CDATA]] 区間の終わりを表すので、
[CODE(XML)@en[CDATA]] 区間でも書けません。)
([[名無しさん]])
[13]
'''タグが含まれる内容の例''':
[[XHTML]] の [CODE(HTMLe)@en[[[pre]]]] 要素を使って
[[XML]] の使用例を示したいとします。
例の中には [[XML]] の[[タグ]]が沢山含まれます。
一々 [CODE(XML)@en[<]] と書くのは面倒なので、
[CODE(XML)@en[CDATA]] 区間を使います。
[PRE(HTML example code)[
<pre><!'''['''CDATA'''['''
<根>
<葉/>
<節点>
<節点>
<葉/>
</節点>
<葉/>
<節点>
<節点>
<葉/>
<葉/>
</節点>
<葉/>
</節点>
</節点>
</根>
''']'''''']'''></pre>
]PRE]
([[名無しさん]])
[14]
'''スクリプトを書く例''':
[[XHTML]] の [CODE(HTMLe)@en[[[script]]]] 要素で [[JavaScript]]
の[[コード]]を書きますが、[[比較]]演算子の [CODE(JS)[<]]
や[[論理]]演算子の [CODE(JS)[&&]] を沢山使います。一々
[CODE(XML)@en[<]] や [CODE(XML)@en[&&]]
に書き直すのは面倒なので、 [CODE(XML)@en[CDATA]] 区間を使います。
[PRE(HTML example code)[
<script type="text/javascript">
<!'''['''CDATA'''['''
var els = document.getElementsByTagName ('dfn');
var elsLength = el.length;
if ((0 < elsLength) && (elsLength < 100)) {
for (var i = 0; i < elsLength; i++) {
var el = els[i];
index.addItem (el, el.textContent);
}
}
''']'''''']'''>
</script>
]PRE]
([[名無しさん]])
[15]
'''HTML と [CODE(XML)@en[CDATA]] 区間''':
仕様上は [[HTML]] でも [CODE(XML)@en[CDATA]] 区間は使えますが、
対応している [[Webブラウザ]]はほとんどありません。
([[名無しさん]])
[[#comment]]
* 関連
[7] CDATA 区間は、[[マーク区間]]の一種です。
[[XML]] で使用できるマーク区間には、他に[[条件区間]]があります。
[[SGML]] では、 CDATA 区間と似た [CODE(SGML)[[[RCDATA]]]]
区間が利用できます。 [CODE(SGML)[RCDATA]] 区間では、
[[参照]]だけは認知されます。
[8] [[DOM]] では、 CDATA 区間は [CODE(DOM)[[[CDATASection]]]]
節として扱われます。
[[XML情報集合]]や [[XPath]] では、 CDATA 区間は取り扱いません。
CDATA 区間を含む文書実現値に対応する[[木]]では、
CDATA 区間の[[文字データ]]はそのまわりの[[データ]]と一緒に[[文節]]になります。
[10] [[要素型宣言]]で [CODE(SGML)[[[CDATA]]]]
として宣言された[[要素型]]の[[要素]]の[[内容]]は
CDATA 区間と似た状態になります。
[9] [CODE(SGML)[[[CDATA]]]] として宣言された[[実体]]を参照することで、
(文字データを書く場所こそマーク区間内容ではなく[[実体文]]ですが)
似たような結果を得られます。
[[#comment]]
* メモ