[1] 【SGML】 マーク区間宣言の中で、そのマーク区間の目的を識別するのが、 状態見出し語 (Status keyword) です。 (JISX4151‐1992 9.4.2, 定義 (130) 参照。)
状態見出し語 (規格参照具象構文) | 意味 |
IGNORE | 文字がないものとして扱う |
INCLUDE | 無視しない |
CDATA | 文字データとして扱う |
RCDATA | 置換可能文字データとして扱う |
TEMP | いずれ取り除くことになるかもしれない一時的な部分として扱う |
という優先順を持ちます。
[4] IGNORE
が有効な状態であるマーク区間では、
入れ子になったマーク区間宣言の終わりを識別するために、
マーク区間開始及びマーク区間終了の認知だけ行います。
有効な状態見出し語が IGNORE
であるマーク区間には、 Ee
は現れてはなりません。 (というか現れ得ません。)
[5] CDATA
又は RCDATA
が有効な状態であるマーク区間では、
最初に現れたマーク区間終了によってマーク区間は終わります。
(マーク区間開始の認知が行われないので、入れ子にはなり得ません。)
備考
CDATA
又はRCDATA
のマーク区間では、それが1個の実体の中にある限り、 マークの認知を行わないので、その中に入れ子になったマーク区間宣言が表れることはない。
と書いてありますけど、「それが1個の実体の中にある限り」
というのは RCDATA
で、一般実体参照が含まれる場合のみですよね?
で、
<!ENTITY ent " <![ IGNORE [ foo ]]> "> ... <! &ent; >
だったら結局 foo は無視されるんですか?
[8] >>6 W3CのValidator に解釈させてみたら、実体 ent の置換文も RCDATA
と解釈されるみたいです。だから、 foo もそのまわりのマーク区間宣言に見えるものも、文字データとして扱われます。
[9] >>8 <!ENTITY ent PCDATA "..."> として宣言しておけば、、、と思ったら、
この場所で見出し語 PCDATA
は使えないのでした。
状態見出し語指定
の部分は ps
が入る領域ですから、引数実体参照が使えます。例えば: <!ENTITY % systemA "INCLUDE">...<![ %systemA [ <? systemA dependent command ?> ] ]> (都合上 msc
は ] ]>
にしてます。)INCLUDE
として扱われます。TEMP
は状態見出し語ではありませんが、普通状態見出し語の一種として扱われます。当の JIS X 4151 でさえ、 9.4.2 で構文規則を提示したすぐ後で状態見出し語に TEMP
を含めています。TEMP
が、他の見出し語とは異なり SGML 処理系ではなく人間を対象とするものである (単なる備忘である) 点に注意したいところです。[14] XML ではマーク区間宣言はCDATA区間と条件区間の2種類に分かれています。
[15] CDATA区間では、マーク区間宣言の状態見出し語に相当する部分は CDATA
でなければならず、空白や引数実体参照は使えません。
[16] 条件区間では、状態見出し語の前後に S
を挿入したり、
引数実体参照を使ったりすることができます。キーワードは INCLUDE
か IGNORE
のいずれかのみでなければなりません。
[18] HTML は SGML ではありませんが、 XML に由来する CDATA区間を外来要素
(svg
、math
) 内で使うことができます。