[19] 定義済実体は、 XML で実体宣言なく使える5つの実体 (エスケープ構文) です。
[1] XML ではよく使う名前文字参照のための一般実体が
5つ定義済み
とされています。
[5] これらの実体は、妥当な XML 文書であっても、 DTD で宣言することなく参照できます。
<?xml
version
="1.0"?> <!DOCTYPE
foo
[<!ELEMENT
foo
(#PCDATA
)*>]> <foo
>&
;</foo
><!-- この文書は整形式であり、かつ妥当です。 -->
[6] しかし、仕様書 >>3 は相互運用性のために明示的に宣言するべきであると述べています。
[7] なお、これらの実体を DTD で宣言するに当たっては、 他の置換文を持つようにしてはいけません。 例えば、次の宣言は不正です。
<!ENTITY
lt
"left">
If the entities lt or amp are declared, they must be declared as internal entities whose 3 replacement text is a 1 character reference to the respective character (less-than sign or ampersand) being 2 escaped; the double escaping is required for these entities so that references to them produce a well-formed result. If the entities gt, apos, or quot are declared, they must be declared as internal entities whose 3 replacement text is the single character being 2 escaped (or a 5 character reference to that character; the double escaping here is unnecessary but harmless).
とあります (強調引用者)。
1
の「それぞれの文字の文字参照」
とは、 &
なら &
などです。2
で、1
の文字参照が escape されます。
例えば、 &
なら &#x26;
になります。"
なら "
です。3
で、&
の場合の置換文が
&#x26;
なのですから、
表記実体値は &#x26;#x26;
です。"
の場合の置換文が
"
なのですから、
表記実体値は &#x22;
です。5
で、後者の群について、3
で間違って「置換文」
と書いてしまったことと、 5
の部分が曖昧なことです。現時点で errata には何もかかれてません。
[10] 正しいのかどうか良くわからない例
<!ENTITY gt ">">
(>>9 のよくわからない規定を無視すれば) この定義でも問題なさそうですが、どうなのか。
[14] 正しいのかどうか良くわからない例
<!ENTITY % gt ">"><!-- ">" でも同じ --> <!ENTITY gt "%gt;">
>>10 がよいならこれもよくないと困りますが、どうなのか。
[2] SGML 的には、 Web SGML で新たに導入された、 SGML宣言内で実体を宣言する機能を使っています。 (定義済みデータ文字実体, Web SGML K.4.2)
[8] Web SGML では、定義済みデータ文字実体は内部部分集合の前に宣言があったものとして扱います。 ですから、 XML としての >>7 の制約は、 SGML 的にはまったく無害となります (重複している実体宣言は無視されます)。
[13] 5つの定義済み実体は、以前から HTML を含めて多くの SGML応用でよく使われてきたものが採用されています。
[12] 5つの定義済み実体のうち、 apos
以外は以前から HTML でよく使用されていました。
apos
は HTML 4 までには含まれていませんでしたが、
XML 1.0 に取り込まれたことをうけて XHTML 1.0
以降使えるようになっています。ただし XHTML 1.0
の互換性指針は、旧来の HTML
利用者エージェントとの互換性が必要であるなら apos
は使うべきではないと述べています。
[16] XML情報集合との関係:
XML情報集合では、要素の内容の一部である定義済実体は通常のデータ文字や文字参照と同様に文字情報項目
として、
属性値の一部である定義済実体は正規化値
の一部として表されます。
[15] DOMとの関係: DOMの仕様書 (<IW:DOM1:"introduction.html#ID-E7C30824">, <IW:DOM2:"introduction.html#ID-E7C30824">, <IW:DOM3:"introduction.html#ID-E7C30824">) によれば、
ということになっています。EntityReference
界面を有するDOM
XMLモジュールを使う場合にどうなるのかは定かではありません。
仮にXMLモジュールを使う場合であっても定義済実体はDOMでは必ず文字として扱うとすると、
createEntityReference
に引数lt
(など) を与えた時にどうなるのかは、やはり定かではありません。
[17] >>15 XML モジュールを使う場合でも、定義済実体への参照は展開されてDOM木に現れません。
[11] XPath 1.0データ・モデル: XPath 1.0やXSLT 1のデータ・モデルでは、 定義済実体は通常のデータ文字や文字参照同様に、 テキスト節点の文字列値の一部、 または属性節点の文字列値の一部となります。
[18] XQuery 3.0: An XML Query Language ( ( 版)) <http://www.w3.org/TR/xquery-30/#dt-predefined-entity-reference>
[20] XQuery 3.1: An XML Query Language () <https://www.w3.org/TR/2017/REC-xquery-31-20170321/#dt-predefined-entity-reference>