- 6.1 エンティティ
- 6.2 内部エンティティ
- 6.3 外部エンティティ
- 6.4 エンティティ宣言に関する注意
- 6.5 解析対象外エンティティとNOTATION宣言
- 6.6 パラメーターエンティティ
- 6.7 まとめ
- (参考1) standalone文書
- (参考2) 他のスキーマ言語
6.5 解析対象外エンティティとNOTATION宣言
今まで解説してきたエンティティは、文字列であれ、ファイルであれ、すべてXML文書の一部として認識できるものでした。XML文書内では、さらにグラフィックイメージや図など、さらにはテキストでもTexやポストスクリプトなど、XMLの構文に従わないファイルを実体として参照することができます。このように、XMLの構文に従わないエンティティのことを解析対象外エンティティといいます。(これに対し、XML文書の一部として、XMLプロセッサにより処理可能なエンティティを解析対象エンティティといいます。)
解析対象外エンティティは、外部エンティティであるため、宣言の書式は、似ています。ただし、解析対象外エンティティは、XMLの構文に従わないため、どのようなファイル形式なのか、明記する必要があります。この「ファイル形式」を知るために使用する名前を、記法といいます。解析対象外エンティティを宣言する場合には、最後に記法を記述する必要があります。
システム識別子を使用してファイルの場所を特定する場合の構文は以下のとおりです。
<!ENTITY エンティティ名 SYSTEM "ファイルのURI名" NDATA "記法名">
公開識別子を使用してファイルの場所を特定する場合の構文は以下のとおりです。
<!ENTITY エンティティ名 PUBLIC "公開識別子" "ファイルのURI名" NDATA "記法名">
記法は、DTD内で宣言します。記法宣言の書式は、以下のとおりです。
<!NOTATION 記法名 SYSTEM "ファイルのURI名" > <!NOTATION 記法名 PUBLIC "公開識別子" "ファイルのURI名">
ここで、問題になるのが、記法宣言では、何のファイルのURIを指定するのか、ということです。実は、XMLでは、記法宣言で指定するURIの内容についての規定はありません。指定されているものは、ファイルの規格が記述してあるものかもしれませんし、ファイルを処理するアプリケーションかもしれません。URIはそのまま、アプリケーションに引き渡されます。アプリケーションは、この値などから、その解釈と利用方法を決定します。
以下に解析対象外エンティティとNOTATION宣言の例を記述します。
<!NOTATION GIF SYSTEM "GIF"> <!ENTITY 4ddlogo SYSTEM "http://www.4dd.co.jp/4ddlogo.gif" NDATA "GIF"> <!ATTLIST 画像 file ENTITY #REQUIRED> <画像 file="4ddlogo"/>
上の例では、記法GIFを宣言した後に、解析対象外エンティティ4ddlogoを記法はGIFであるとして宣言しています。そしてXML文書の中のfile属性の値で、解析対象外エンティティを参照しています。ところで、属性のデータ型のところで、ENTITY型とENTITIES型があることを記述しましたが、解析対象外エンティティはENTITYあるいはENTITIES型の属性値からのみ参照が可能です。
6.6 パラメーターエンティティ
DTD内のみで参照するエンティティは、他とは区別して「パラメータエンティティ」と呼びます。パラメータエンティティを宣言する場合、以下の通りエンティティ名の前に"%"を記述します。
<!ENTITY % エンティティ名 "エンティティ参照の際に置き換えられる文字列" > <!ENTITY % エンティティ名 SYSTEM "ファイルのURI名" > <!ENTITY % エンティティ名 PUBLIC "公開識別子" "ファイルのURI名">
パラメータエンティティの参照を行う場合は、エンティティ名の前に&ではなく%を記述します。
%エンティティ名;
以下に例を示します。
<!ENTITY % isolate2 SYSTEM "http://www.utj.co.jp/iso/isolat2-xml.entities" > %isolat2;
上の例ではまず、「ラテン文字を表すエンティティ」が宣言されているファイルを外部パラメーターエンティティとして宣言しています。その直後に、パラメータエンティティを参照しています。さて、DOCTYPE宣言の章で、DTDには、内部サブセットと外部サブセットがあるというお話をしたと思います。パラメータエンティティの参照に関して、内部サブセットと外部サブセットでは異なります。内部サブセットでパラメータエンティティを参照する場合は、そのエンティティに、マークアップ宣言が1個あるいは複数、完全に含まれている必要があります。例を示します。以下の例はエラーになります。
<!DOCTYPE root [ ... <!ENTITY % para "(#PCDATA|emph)*"> <!ELEMENT p %para;>
以上の例では、内部サブセットの要素型宣言の一部でパラメータ参照を行っています。内部サブセットで参照する場合、エンティティは要素宣言の"<!ENTITY"から">"までを含む必要があります。外部サブセット内では、以下のような参照も可能です。
<!ENTITY % para "(#PCDATA|emph)*"> <!ELEMENT p %para;> <!ELEMENT p2 %para;> ...
6.7 まとめ
- エンティティは、XML文書の物理構造を定義するもの
- 宣言内にエンティティの内容が記述してある内部エンティティとエンティティの内容が外部ファイルとして存在する外部エンティティがある。
- XML文書の一部として処理可能な解析対象エンティティと、XML文書の構文で記述されていない解析対象外エンティティがある。
- ルート要素の内容で参照する一般エンティティと、DTD内で参照するパラメータエンティティがある。