character data

CDATA (SGML)

[39] CDATA は、文字データ (character data) です。

SGML

[40] 文字データ := *データ文字 ;; JISX4151‐1992 (47)

HTML 4 の場合

属性値の型としての CDATA

[5] HTML 4 仕様書には CDATA の取り扱いについての言及がありますが、 完全な定義は ISO8879 を参照し、その要約を示すにとどめるとしています。 (<http://www.w3.org/TR/html4/types.html#type-cdata> 参照。)

[6] HTML 4 利用者エージェントが行うべき (should) CDATA 属性値(表記)の解釈は : (cf. SGML の規定 : SGML//空白)

  1. 文字実体を文字に置換
  2. 改行 (LF) を無視
  3. 復帰 (CR) とタブを1つの間隔に置換

Must ではなく should なのは、旧来の応用の救済でしょう。 SGML 的には必ずこう正規化しないといけないはずです。 更に、文字実体のみならず文字参照も文字に置換してもらわないと困ります。

[7] HTML 4 利用者エージェントは、更に最初と最後の空白を無視しても構いません (may)。 たとえば myval myval としても構いません。

しかし、著者はそのような値を使うべきではありません (should not)。

この規定は旧来の UA・文書を救済するためのものでしょう。 SGML 的にはこのような扱いはありません。 (SGML 的な属性値を更にどう解釈するかという問題ですから、 SGML 違反ではありません。)

HTML 4 の規定では無視していいのは white space (単数) ですが、実際に仕様書に挙げられている例では最初と最後に複数個の空白があって無視されています。。。

[8] 利用者エージェントの中には連続する空白を1つの間隔にまとめてしまうものがありますが、 そういう話は特に書かれていません。 これについての救済はなしですか。そうですか。別に構いませんが。

[9] なお、 DTD 的に CDATA であっても、 DTD で表現できない更なる制限があることもあります。

スクリプト・マクロ

[13] HTML 4 は、 CDATA 型属性でスクリプト・マクロ (script macro) のための構文を予約しています。

この機能は元々 NN4 が実装していたもので、他の UA は実装していなかったので HTML 4 で標準機能として取入れるには至らなかったのだと思われます。

[14] 仕様書:

[15] 適用対象: この構文が予約されているのは、 HTMLCDATA 属性です。仕様書の例から、 DTD属性定義 (じか) CDATA と書かれている属性に限らず、 %Color のように引数実体参照を介して間接的に CDATA であるものも含まれるようです。

[16] 構文: 属性値内の &{マクロ本体}; と書かれた部分がスクリプト・マクロとみなされます。

[17] 意味: HTML 4 仕様書は現在の慣習 (current practice) として次のように説明しています HTMl 4 B.7.1.1

  • マクロ本体既定スクリプト言語 (Content-Script-Type を参照してください。) による1つ以上の (statement) です。
  • 末尾の SEMICOLON は常に必要です。 SEMICOLON が続かない } はマクロ本体の一部とみなします。
  • スクリプト・マクロを含む属性は常に引用符が必要です。 (SGML 的に言えば、属性値ではなく属性値表記で記述しなければなりません。)
  • CDATA 属性は次のように処理します。
    1. SGML 構文解析器SGML 実体参照を評価します。
    2. スクリプト機関がスクリプト・マクロを評価します。
    3. 評価結果の文字列を以後の処理に使います。
  • スクリプト・マクロの処理は文書(再)読込み時に行います。 表示する大きさを変更した時や再描画時には行いません。

[23] HTML 4 仕様書には &{...}; の例しか出てきませんが、スクリプト・マクロの評価は SGML 的評価の後ですから、属性値表記に &amp;{...}; と書いてあっても同じことのはずです。

困ったことに、 (稀でしょうが) &{...}; と属性値に書きたい時に、スクリプトを使わずに実現する方法がありません。 { を SGML の文字参照で書いたとしても、 スクリプト・マクロが評価されるのは SGML 的に解釈した後ですから意味がありません。 JavaScript なら &{'&{...}' + ';'}; とでも書けば良いのでしょうが、 JavaScript 対応の UAにしか意味が通じないことになります。

[24] スクリプト・マクロの中で }; という文字列が使えるのかどうかは明記されていませんが、 おそらく駄目でしょう (入れ子の括弧等をチェックしながら構文解析なんてやってられないもん)>>23 の例のように適宜工夫する必要があります。

[27] >>23 NC 4.8 で試してみましたが、 &amp;{ には対応していないようです。 (名無しさん)

[28] で、 NC 4.8 は予想通り、 CDATA だろうが NUMBER だろうが ID だろうが構わずスクリプトを実行するようです。 (名無しさん)

[29] あと、属性値でも構わず実行しちゃってくれます。 (名無しさん)

[30] <http://suika.fam.cx/~wakaba/-temp/test/html/script/macro/> (名無しさん)

[31] この機能、構文は記号だし、名前は一般的過ぎるし、検索しても全然意味がある情報が出てきませんよ。。。 (名無しさん)

[32] >>31 マイナーだしも追加しとくか(w (名無しさん 2004-12-12 07:00:29 +00:00)

[33] FAQTs - Knowledge Base - View Entry - Which browsers support JavaScript entities? <http://www.faqts.com/knowledge_base/view.phtml/aid/1378/fid/126> (名無しさん)

[34] 元々 JavaScript entity という名前らしい。結構情報が出てくる。

NN3 以上が実装しているらしい。 (名無しさん)

[35] JavaScript Entities <http://javascriptkit.com/javatutors/entity.shtml> (名無しさん)

[36] [Chapter 10] 10.5 JavaScript Entities <http://www.chinalinuxpub.com/doc/oreillybookself/web/jscript/ch10_05.htm>

Professional JavaScript <http://www.webreference.com/programming/javascript/professional/chap4/2/>

[Appendix E] E.2 Client-side JavaScript <http://www.unix.org.ua/orelly/web/jscript/appe_02.html>

実は注釈宣言内でも使えるらしい (WinIE のあれと発想は同じ)。

(名無しさん)

他との関係

[25] XSLTHTML出力方式では、 &amp;{...}; と出力されるはずの時に &{...}; に置き換えて出力するべきであるとされています XSLT 1.0 16.2。 ただし、 CDATA 属性に限るとの注釈がありません (それどころか }; の存在も確認しなくて良いっぽいです) から、どの属性でもそうなのでしょうか。 (SGML 的には無問題。)

[26] DOM との関係は不明です。 DOM では基本的に構文解析後の文書木を扱うことになっていますから、 スクリプト・マクロを処理した後の木を操作することになるのだと思われます。 (しかし、現実にはほとんどすべての UA がスクリプト・マクロに対応していないので、そのまま属性値となってしまうのでしょうが。。。)

[37] Possible problem generating javascript entities with XSL from Jim Palmer on 1999-07-01 (xsl-editors@w3.org from July to September 1999) <http://lists.w3.org/Archives/Public/xsl-editors/1999JulSep/0000.html>

この指摘で XSLT 1.0 があーいう仕様になったらしい。 (名無しさん)

[18] 文書の背景色を無作為に決定する JavaScript の例 (非推奨) HTML 4 B.7.1.1

<BODY bgcolor='&{randomrgb};'>

[19] 文書の背景色を時刻により決定する JavaScript の例 (非推奨) HTML 4 B.7.1.1

<BODY bgcolor='&{if(Date.getHours > 18)...};'>

[20] クライアント側画像写像の座標やリンク先を JavaScript で決定する例 (非推奨) HTML 4 B.7.1.1

<MAP NAME=foo>
   <AREA shape="rect" coords="&{myrect(imageuri)};" href="&{myuri};" alt="">
 </MAP>

[21] 画像の大きさを文書の特性により決定する例 (非推奨) HTML 4 B.7.1.1

<IMG src="bar.gif" width='&{document.banner.width/2};' height='50%' alt="banner">

[22] 画像やリンク先をスクリプトで決定する例 (非推奨) HTML 4 B.7.1.1

 <SCRIPT type="text/javascript">
   function manufacturer(widget) {
       ...
   }
   function location(manufacturer) {
       ...
   }
   function logo(manufacturer) {
       ...
   }
 </SCRIPT>
  <A href='&{location(manufacturer("widget"))};'>widget</A>
  <IMG src='&{logo(manufacturer("widget"))};' alt="logo">

この例ではアポストロフィを使っていますが、 二重引用符を使って

<IMG src="&{logo(manufacturer(&quot;widget&quot;))};" alt="logo">

と等価に書き直すことができます。

要素の内容としての CDATA

[10] 要素の内容の型が CDATA である場合、すなわち style 要素と script 要素では、 タグで囲まれた文字列がそのまま要素の内容の文字列として解釈されます。

ただし、文字列 </etago になってしまうので、書くことができません。 そこで当該要素は終わりになります。(妥当であるなら、 それは正しい終了タグになっているはずです。)

・・・というような感じのことが仕様書には書いてありますが、 実際には SGML 的には </ の直後に名前開始文字が続く必要があります。 仕様書の記述は要約に過ぎないと明記されていますから、 SGML の規定を上書きするものではもちろんないのでしょうが、 どんな文字が続いても </ は書けないと思っていた方が安全です。

[11] scriptstyleCDATA なので、中身に <!-- とか --> を書いてもそれは注釈宣言とは見なされず、文字データとみなされます。 そういうのを書いても適宜無視してくれるのは実は HTML の規定ではなく、スタイル言語スクリプト言語の側の規定に由来します。 そのような規定がない言語では SGML 注釈宣言もどきを書いてはいけないのです。

[43] 「CDATA 中の ETAGO」@水無月ばけらのえび日記 (2007-05-24 22:22:13 +09:00 版) <http://bakera.jp/ebi/topic/2893> (名無しさん 2007-05-25 01:00:38 +00:00)

[44] d:id:quaa - 2007-09-02 (2007-09-06 00:14:57 +09:00 版) <http://d.hatena.ne.jp/quaa/20070902#p1> (名無しさん)

[45] d:id:quaa - 2007-09-02 (2007-09-06 00:14:57 +09:00 版) <http://d.hatena.ne.jp/quaa/20070902#p1> (名無しさん)

[46] d:id:quaa - 2007-09-02 (2007-09-06 00:14:57 +09:00 版) <http://d.hatena.ne.jp/quaa/20070902#p1> (名無しさん)

[47] >>10-

CDATA 宣言内容CDATA 宣言内容は、 etago 文脈依存区切子または (開始タグnestc で終われば) net をもって終わります JIS X 4151‐1992 6.6

etago文脈的制約 GI が満たされれば認知されます。具体的には、 etago に割当てられた文字列の後に、 名前開始文字 (要素型名)、 (SHORTTAG YES の場合) tagc (空終了タグ)、 (CONCUR YES の場合) grpo (文書型指定) のいずれかが続けば認知されます JIS X 4151‐1992 8.6.2

HTML 4 の場合、

の一番初めに現れたもので内容が終了します。 (名無しさん)

メモ

[38] XHTML m12n抽象モジュール定義における属性型 CDATA は、 XML 1.0 の定義によっています。

仕様書: