状態見出し語

状態見出し語

[1]SGMLマーク区間宣言の中で、そのマーク区間の目的を識別するのが、 状態見出し語 (Status keyword) です。 (JISX4151‐1992 9.4.2, 定義 (130) 参照。)

[2]

[3]

指定に重複がある場合、

  1. IGNORE
  2. CDATA
  3. RCDATA
  4. INCLUDE

状態見出し語 (規格参照具象構文)意味
IGNORE文字がないものとして扱う
INCLUDE無視しない
CDATA文字データとして扱う
RCDATA置換可能文字データとして扱う
TEMPいずれ取り除くことになるかもしれない一時的な部分として扱う

という優先順を持ちます。

[4] IGNORE が有効な状態であるマーク区間では、 入れ子になったマーク区間宣言の終わりを識別するために、 マーク区間開始及びマーク区間終了の認知だけ行います。

有効な状態見出し語が IGNORE であるマーク区間には、 Ee は現れてはなりません。 (というか現れ得ません。)

[5] CDATA 又は RCDATA が有効な状態であるマーク区間では、 最初に現れたマーク区間終了によってマーク区間は終わります。 (マーク区間開始の認知が行われないので、入れ子にはなり得ません。)

[6] >>5 について、規格では

備考 CDATA 又は RCDATA のマーク区間では、それが1個の実体の中にある限り、 マークの認知を行わないので、その中に入れ子になったマーク区間宣言が表れることはない。

と書いてありますけど、「それが1個の実体の中にある限り」 というのは RCDATA で、一般実体参照が含まれる場合のみですよね?

で、

<!ENTITY ent "
  <![ IGNORE [
    foo
  ]]>
">
 ...
<!
&ent;
>

だったら結局 foo は無視されるんですか?

[8] >>6 W3CのValidator に解釈させてみたら、実体 ent置換文RCDATA と解釈されるみたいです。だから、 foo もそのまわりのマーク区間宣言に見えるものも、文字データとして扱われます。

[9] >>8 <!ENTITY ent PCDATA "..."> として宣言しておけば、、、と思ったら、 この場所で見出し語 PCDATA は使えないのでした。

XML における状態見出し語

[14] XML ではマーク区間宣言CDATA区間条件区間の2種類に分かれています。

[15] CDATA区間では、マーク区間宣言状態見出し語に相当する部分は CDATA でなければならず、空白引数実体参照は使えません。

[16] 条件区間では、状態見出し語の前後に S を挿入したり、 引数実体参照を使ったりすることができます。キーワードINCLUDEIGNORE のいずれかのみでなければなりません。

[17] どちらの場合も、キーワードは大文字でなければなりません。

HTML における状態見出し語

[18] HTMLSGML ではありませんが、 XML に由来する CDATA区間外来要素 (svgmath) 内で使うことができます。

[19] >>15 と同じで、状態見出し語大文字CDATA のみでなければなりません。