外部引数実体

外部引数実体 (SGML、XML)

[9] 外部実体である引数実体を、外部引数実体 (external parameter entity) といいます。

仕様書

MIME 型

[12] 外部引数実体には application/xml-dtd を使うべきです >>14application/xmltext/xml を使ってはなりません >>14

[15] なぜか SHOULD となっています。

引数

[17] 次の引数があります。

処理モデル

[18] 文字コードの取り扱いについては、XMLにおける文字コードを参照してください。

関連

[10] 特定の作法で記述された外部引数実体DTDモジュールなどと呼ぶことがあります。

歴史

[13] RFC 2376 では text/xmlapplication/xml を使うことになっていましたが、 RFC 3023 ではこれが認められなくなり、 application/xml-dtd が導入されました >>11

[16] RFC 7303 でも引き継がれています。

メモ

[1] なんとなく、

<!ENTITY % ent SYSTEM "data:,%22EntityValue%22">
<!ENTITY entity %ent;>

みたいのはありかなあ? って気がしますが、 XML 仕様書にはダメとは書いてないので、いいんでしょう。

[2] 試しに WinIE6

<!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; > に変えると、文句言われずに意図したように解釈されました。

この両者の違いはないはずですから、 M$XML のバグでしょう。 なお、内部実体の場合でも同じエラーが出ます。 外部引数実体の扱いとは無関係のようです。

[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 が参照された時に初めて、 この文字列がマーク宣言として解釈されるのです。 そしてその時、マーク宣言の最初と最後の文字は確かに、 同じ実体の中にあるのです。

・・・と、解釈してもいいんでしょうか? いいですよね? いや、そう解釈しないと、面倒なことになるのでどうか一つ是非・・・