SGML実体

Standard Generalized Markup Language (SGML) における**実体**（）は、プリミティブデータ型の1つであり、固有のエイリアス（ユーザーが指定した名前など）またはSGML予約語（`#DEFAULT` など）を1つの文字列と関連付けるものである。XMLやHTMLにおける実体 (entity) も同様である。

実体はSGML文書の構造と定義の基盤である。SGML仕様では様々な**実体型** (entity type) を定義しており、キーワード修飾子と文脈で決まる。実体文字列の値としては、プレーンテキスト、SGMLタグ、事前定義された実体への参照から成る。外部文書を参照する実体型もある。実体は参照渡しである。

## 実体の種類
実体は包括実体とパラメータ実体に分類される。
* 包括実体 (general entity) はその文書の中からのみ参照できる。
* パラメータ実体 (parameter entity) は DTD の中でのみ参照できる。

また、実体は解析対象と非解析対象に分類される。
* 解析対象実体 (parsed entity) は文書に組み入れられるテキストを含み、その実体を組み入れて参照すると中身のテキストが構文解析される。パラメータ実体は常に解析対象実体である。
* 非解析対象実体 (unparsed entity) は一種のデータを含み、その参照が文書内にあるとアプリケーションには単にその実体の存在が通知されるだけである。実体の中身が単なるテキストだったとしても構文解析されない。非解析対象実体は常に外部実体である。

### 内部実体と外部実体
**内部実体** (internal entity) の値はリテラル文字列か、同一文書内（DOCTYPEや部分文書など）で定義されたマークアップと実体から成る構文解析された文字列である。**外部実体** (external entity) は外部文書を呼び出す宣言を持つため、外部文書への参照を解決するために実体管理系とやりとりする必要がある。

#### システム実体
**システム実体** (system entity) にはオプションの `SYSTEM` パラメータがあるため、SGMLパーサはその実体の中身である文字列をリソース識別子として扱う。

#### SGML文書実体
外部実体が完全なSGML文書を参照している場合、参照されている文書を**SGML文書実体** (SGML document entity) と呼ぶ。SGML文書とは、SGMLプロローグ（DTDと部分文書）に定義されたSGMLマークアップを伴うテキスト文書である。完全なSGML文書は文書インスタンスだけでなく、プロローグとオプションでSGML宣言（その文書でのマークアップ構文を定義し、文字コードを宣言したもの）を備えている。

## 構文
実体は文書のDTD内の「実体宣言 (entity declaration)」で定義される。以下に例を挙げる。

 &lt;!ENTITY greeting1 "Hello world"&gt;
 &lt;!ENTITY greeting2 SYSTEM "file:///hello.txt"&gt;
 &lt;!ENTITY % greeting3 "¡Hola!"&gt;
 &lt;!ENTITY greeting4 "%greeting3; means Hello!"&gt;

このDTDマークアップで宣言されているのは以下の通りである。
* "greeting1" という名前の内部包括実体があり、その内容は "Hello world" という文字列である。
* "greeting2" という名前の外部包括実体があり、URI "file:///hello.txt" で示されるリソースの中のテキストを内容とする。
* "greeting3" という名前の内部パラメータ実体があり、"¡Hola!" という文字列から成る。
* "greeting4" という名前の内部包括実体があり、"¡Hola! means Hello!" という文字列から成る。

実体の名前はSGML名前の規則に従わなければならず、参照できる場所も制限されている。

パラメータ実体は実体名を "`%`" と "`;`" で挟んで参照する。解析対象包括実体は実体名を "`&amp;`" と "`;`" で挟んで参照する。非解析対象実体はENTITY型で宣言された属性の値としてその名前を置くことで参照される。

上の例にある包括実体を文書内で参照した例を以下に示す。

 &lt;content&gt;
   &lt;info&gt;'&amp;greeting1;' is a common test string.&lt;/info&gt;
   &lt;info&gt;The content of hello.txt is: &amp;greeting2;&lt;/info&gt;
   &lt;info&gt;In Spanish, &amp;greeting4;&lt;/info&gt;
 &lt;/content&gt;

これを構文解析するとき、hello.txt の内容が "Salutations" というテキストだったとすると、次のような結果になる。

 &lt;content&gt;
   &lt;info&gt;'Hello world' is a common test string.&lt;/info&gt;
   &lt;info&gt;The content of hello.txt is: Salutations&lt;/info&gt;
   &lt;info&gt;In Spanish, ¡Hola! means Hello!&lt;/info&gt;
 &lt;/content&gt;

宣言されていない実体を参照すると、デフォールトの実体を定義していない限りエラーとなる。例えば、次の通りである。

 &lt;!ENTITY DEFAULT "This entity is not defined">

その他のマークアップ要素や処理オプションによって実体の処理の仕方が影響されることもある。例えば、オプション指定で外部実体を無視して処理することもある。

## 文字実体
SGMLの標準実体群やそこから派生した一部には、タイピングが難しかったり文字コードが特殊などの理由で毎回本文に記述するのが面倒な文字を置き換えるという用途もある。そのような実体の中身は国際符号化文字集合の中の1文字である。どんな文字も数値文字参照で参照できるが、文字実体参照を使えば文字コードを使わずに名前で参照できる。

たとえば HTML 4 には252の文字実体が組み込まれており、宣言する必要はない。XML には5つがある。XHTML にも XML と同じ5つがあるが、DTD を明示的に使えば 253 になる（追加の1文字は `&amp;apos;`）。

## 関連項目
* 宣言型プログラミング
* オブジェクト (プログラミング)

## 脚注

## 参考文献
* Goldfarb, Charles F. (Ed.). ISO 8879 Review: WG8 N1855. WG8 and Liaisons, 1996.
* Goldfarb, Charles F., and Yuri Rubinsky (Ed.). *The SGML Handbook*. Oxford University Press, 1991.

## 外部リンク
* Entity Management in SGML