predefined entities

predefined entities

[19] 定義済実体 (predefined entities) は、 XML実体宣言なく使える5つの実体 (エスケープ構文) です。

XML の定義済実体

[1] XML ではよく使う名前文字参照のための一般実体が 5つ定義済みとされています。

amp
AMPERSAND (&)
apos
APOSTROPHE (')
gt
GREATER-THAN SIGN (>)
lt
LESS-THAN SIGN (<)
quot
QUOTATION MARK (")

[5] これらの実体は、妥当な XML 文書であっても、 DTD宣言することなく参照できます。

<?xml version="1.0"?>
<!DOCTYPE foo [<!ELEMENT foo (#PCDATA)*>]>
<foo>&amp;</foo>
<!-- この文書は整形式であり、かつ妥当です。 -->

[6] しかし、仕様書 >>3相互運用性のために明示的に宣言するべきであると述べています。

[7] なお、これらの実体を DTD で宣言するに当たっては、 他の置換文を持つようにしてはいけません。 例えば、次の宣言は不正です。

<!ENTITY lt "left">

[9] >>3 には、

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).

とあります (強調引用者)

現時点で errata には何もかかれてません。

[10] 正しいのかどうか良くわからない例

<!ENTITY gt ">">

(apos, quotでも同様)

(>>9 のよくわからない規定を無視すれば) この定義でも問題なさそうですが、どうなのか。

[14] 正しいのかどうか良くわからない例

<!ENTITY % gt "&#x3E;"><!-- ">" でも同じ -->
<!ENTITY gt "%gt;">

(apos, quotでも同様)

>>10 がよいならこれもよくないと困りますが、どうなのか。

SGML との関係

[2] SGML 的には、 Web SGML で新たに導入された、 SGML宣言内で実体を宣言する機能を使っています。 (定義済みデータ文字実体, Web SGML K.4.2)

[8] Web SGML では、定義済みデータ文字実体は内部部分集合の前に宣言があったものとして扱います。 ですから、 XML としての >>7 の制約は、 SGML 的にはまったく無害となります (重複している実体宣言は無視されます)

[13] 5つの定義済み実体は、以前から HTML を含めて多くの SGML応用でよく使われてきたものが採用されています。

HTML との関係

[12] 5つの定義済み実体のうち、 apos 以外は以前から HTML でよく使用されていました。

aposHTML 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.0XSLT 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>