[5] HTML 4 仕様書には CDATA
の取り扱いについての言及がありますが、
完全な定義は ISO8879 を参照し、その要約を示すにとどめるとしています。
(<http://www.w3.org/TR/html4/types.html#type-cdata> 参照。)
[6] HTML 4 利用者エージェントが行うべき
(should) CDATA
属性値(表記)の解釈は :
(cf. SGML の規定 : SGML//空白
)
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
型属性でスクリプト・マクロのための構文を予約しています。
この機能は元々 NN4 が実装していたもので、他の UA は実装していなかったので HTML 4 で標準機能として取入れるには至らなかったのだと思われます。
[14] 仕様書:
[15] 適用対象: この構文が予約されているのは、
HTML の
CDATA
属性です。仕様書の例から、
DTD
の属性定義に直に
CDATA
と書かれている属性に限らず、 %Color
のように引数実体参照を介して間接的に
CDATA
であるものも含まれるようです。
[16] 構文: 属性値内の &{マクロ本体}; と書かれた部分がスクリプト・マクロとみなされます。
[17] 意味: HTML 4 仕様書は現在の慣習
として次のように説明しています
HTMl 4 B.7.1.1。
Content-Script-Type
を参照してください。)
による1つ以上の文です。SEMICOLON
は常に必要です。
SEMICOLON
が続かない }
はマクロ本体の一部とみなします。属性値
ではなく属性値表記
で記述しなければなりません。)[23] HTML 4 仕様書には &{...}; の例しか出てきませんが、スクリプト・マクロの評価は SGML 的評価の後ですから、属性値表記に &{...}; と書いてあっても同じことのはずです。
困ったことに、 (稀でしょうが) &{...};
と属性値に書きたい時に、スクリプトを使わずに実現する方法がありません。
{ を SGML の文字参照で書いたとしても、
スクリプト・マクロが評価されるのは SGML
的に解釈した後ですから意味がありません。
JavaScript なら &{'&{...}' + ';'};
とでも書けば良いのでしょうが、 JavaScript 対応の
UAにしか意味が通じないことになります。
[24] スクリプト・マクロの中で };
という文字列が使えるのかどうかは明記されていませんが、
おそらく駄目でしょう
(入れ子の括弧等をチェックしながら構文解析なんてやってられないもん)。
>>23 の例のように適宜工夫する必要があります。
[27] >>23 NC 4.8 で試してみましたが、 &{ には対応していないようです。 (名無しさん)
[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] XSLT の HTML出力方式では、
&{...}; と出力されるはずの時に
&{...}; に置き換えて出力するべきであるとされています
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("widget"))};" alt="logo">
と等価に書き直すことができます。
[10] 要素の内容の型が CDATA
である場合、すなわち style
要素と
script
要素では、
タグで囲まれた文字列がそのまま要素の内容の文字列として解釈されます。
ただし、文字列 </
は etago
になってしまうので、書くことができません。
そこで当該要素は終わりになります。(妥当であるなら、
それは正しい終了タグになっているはずです。)
・・・というような感じのことが仕様書には書いてありますが、
実際には SGML 的には </
の直後に名前開始文字が続く必要があります。
仕様書の記述は要約に過ぎないと明記されていますから、
SGML の規定を上書きするものではもちろんないのでしょうが、
どんな文字が続いても </
は書けないと思っていた方が安全です。
[11] script
や
style
は CDATA
なので、中身に <!--
とか -->
を書いてもそれは注釈宣言とは見なされず、文字データとみなされます。
そういうのを書いても適宜無視してくれるのは実は HTML
の規定ではなく、スタイル言語やスクリプト言語の側の規定に由来します。
そのような規定がない言語では SGML 注釈宣言もどきを書いてはいけないのです。
CDATA
要素型と注釈宣言もどきについて。 WEB相談室にしてはまともなやり取りですね:)[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>
(名無しさん)
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 の場合、
CDATA
と属性値と属性値リテラルについて。CDATA
== Character Data == 文字データ。PCDATA
(解析文字データ == マークを認知する文字データ) や RCDATA
(参照を認知する文字データ) がある。[38] XHTML m12n の抽象モジュール定義における属性型
CDATA
は、 XML 1.0 の定義によっています。
仕様書: