
[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'''[''' ... ''']'''''']'''''']'''''']'''>&gt;<!'''['''CDATA'''[''' ... ''']'''''']'''>]]
とでもするか、 CDATA 区間の使用を諦めるしか方法はありません。

[5] XML では、[[状態見出し語指定]]は正確に [CODE(XML)[CDATA]] 
だけでなければなりません。 [CODE(SGML)[[[ps]]]] を使うことは出来ませんから、
[[引数実体参照]]を使ったり、前後に[[空白]]を入れることは出来ません。
複数或いは空の[[状態見出し語]]を指定することもできません。

[6] XML では、 CDATA 区間が[[文書実現値]]中で使用できる唯一の[[マーク区間]]です。

[11]
一部で [CODE(SGML)[CDATA]] 区間内であっても
[CODE(XML)[''']'''''']'''&gt;]] と書けば
[CODE[''']'''''']'''>]] と解釈されているという解説がありますが、
これは''間違い''です。
[CODE(XML)[CDATA]] 区間内で
[CODE(XML)[''']'''''']'''&gt;]] と書いたら本当に [CODE[''']'''''']'''&gt;]]
([CODE(XML)[CDATA]] 区間の''外''で [SAMP(XML)[''']'''''']'''&amp;gt;]] と書くのと同じこと。) になります。

([[名無しさん]])

[12]
'''いつ使うのか?''':
[Q[[CODE(XML)@en[CDATA]] 区間を必ず使わなければならない場面]]というのは存在しません。
[CODE(XML)@en[CDATA]] 区間はいわゆる[[構文糖]]で、
[Q[あったら便利かもしれないけど無くても困らない]]ものです。

[[XML]] の[[要素]]の[[内容]]では [CODE(char)[<]] や [CODE(char)[&]]
や [CODE(char)[''']'''''']'''>]] を直接書けず、 
[CODE(XML)@en[&lt;]] や [CODE(XML)@en[&amp;]] や
[CODE(XML)@en[''']'''''']'''&gt;]]
などと書かなければなりません
[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[&lt;]] と書くのは面倒なので、
[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[&lt;]] や [CODE(XML)@en[&amp;&amp;]]
に書き直すのは面倒なので、 [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]]


* メモ