[12] 外部引数実体には application/xml-dtd
を使うべきです >>14。 application/xml
や text/xml
を使ってはなりません >>14。
[18] 文字コードの取り扱いについては、XMLにおける文字コードを参照してください。
[13] RFC 2376 では text/xml
や application/xml
を使うことになっていましたが、 RFC 3023 ではこれが認められなくなり、
application/xml-dtd
が導入されました >>11。
[1] なんとなく、
<!ENTITY % ent SYSTEM "data:,%22EntityValue%22"> <!ENTITY entity %ent;>
みたいのはありかなあ? って気がしますが、 XML 仕様書にはダメとは書いてないので、いいんでしょう。
<!ENTITY % external-text SYSTEM "c.dtd"> <!ENTITY %external-text;> <!-- b.dtd -->
an-external-entity "This is an external entity." <!-- c.dtd -->
を試してみると、「スペースが必要です」と言われます。 b.dtd の2つめの実体宣言を <!ENTITY %external-text; > に変えると、文句言われずに意図したように解釈されました。
[5] で、
<!ENTITY % external-text SYSTEM "c.dtd"> <!ENTITY % xent2 "%external-text; >"> %xent2; <!-- b.dtd -->
<!ENTITY an-external-entity "This is an external entity." <!-- c.dtd -->
ってのはどうでしょう?
WinIE 6.0 も W3CのValidator も、問題ないと言ってくれます。 それに自分で処理系書いてみると、問題ないことにしたい気持ちはよくわかります。 本当に問題ないんでしょうか? ないといいんですが。
[6] というわけでXML//妥当性制約 「PE とマーク宣言が適当に入れ子になっていること」 <http://www.w3.org/TR/REC-xml#vc-PEinMarkupDecl> であります。
Parameter-entity replacement text must be properly nested with markup declarations. That is to say, if either the first character or the last character of a markup declaration (markupdecl above) is contained in the replacement text for a parameter-entity reference, both must be contained in the same replacement text.
外部実体 c.dtd で、 実体宣言 (の一部となるもの) の先頭の文字があって、 最後の文字はありません。どう見ても、同じ置換文中にマーク宣言が完全に含まれてはいません。
でもちょっと待ってください。この実体、つまり external-text が展開されるのは、 別の引数実体 xent2 の宣言時です。 そのときにその実体値, というか置換文の一部となるのです。 で、この時点に於いてその中身はマーク宣言ではありません。 単なる文字列です。
で、 xent2 が参照された時に初めて、 この文字列がマーク宣言として解釈されるのです。 そしてその時、マーク宣言の最初と最後の文字は確かに、 同じ実体の中にあるのです。
・・・と、解釈してもいいんでしょうか? いいですよね? いや、そう解釈しないと、面倒なことになるのでどうか一つ是非・・・