パラメーター実体参照

引数実体参照 (SGML、XML)

[31] SGML および XML において、マーク付け宣言の一部を予め定義しておいたものを引数実体 (parameter entity) 、 これを参照するものを引数実体参照 (parameter entity reference) といいます。

[46] XML の仕様書では引数実体PE とも略します。また、パラメーター実体とも訳されます。

[32] XML では引数実体参照DTD でのみ使うことができます。 SGML では引数実体参照DTD (文書型宣言) のみならず、連結型宣言文書実現値内のマーク区間宣言でも使うことができます。

[33] 引数実体は、マーク付け宣言の内部、すなわち引数 (パラメーター) として使うことができる実体であることからこの呼称があります。 (XML では引数実体以外で 「引数」という語を使わないことから、この元の意味がわかりにくくなっています。 DTD はその全体が文書型宣言引数です。)

XML における引数実体参照

[34] XML では、引数実体参照はその利用される文脈により次の3種類に大別できます。

[47] 引数実体は1種類で、引数実体参照が使われる文脈が3種類です。 同じ引数実体を同時に別の文脈で使うこともできます。 (ただし3つすべての文脈で構文的に正しい形に展開されるような引数実体を定義することは不可能です。)

[48] アクセスのたびに返す値が異なるような URLシステム識別子として指定した引数実体と、 引数実体参照の展開のたびにシステム識別子で指定された URL にアクセスするようなXML処理器を使えば、各文脈でそれぞれ適切な構文で返すことは原理的には可能です。 実用上の価値は無いでしょう。 (実体参照の展開のたびにアクセスが発生するべきかしないべきなのかについて、 XML 仕様上は規定がありません。)

[39] XML 仕様書の EBNF 構文では >>35>>37 は明記されていますが、 >>36 は明記されておらず、 引数実体参照展開した結果が EBNF 構文により記述されていることになっています。

[38] 内部部分集合で使えるのは >>35 だけです。 >>36>>37 は禁じられています。

[41] >>36>>37 は、外部部分集合外部引数実体では使えるとされています。

[42] >>35 によって参照される内部引数実体の内部で >>36>>37 が使えるのかは明記されていません。

[40] XML処理器は、外部実体への参照展開することが要求されていません。 (妥当性検証のためには展開しなければなりませんが。) しかし内部実体処理展開しなければならないようです。

[43] >>42 は、 (内部部分集合から参照されている内部引数実体内部部分集合の一部でないと解釈するなら) 禁止されていない以上、使えると解釈できます。しかし >>40>>38 によって妥当性検証を行わない処理器の実装を簡易化することが元々の意図と推測されますから、 内部引数実体でも禁止するのが本来の意図である、とも推測できます。

[44] Chrome内部部分集合>>35 すら対応していないようで、実体宣言されていないとの致死的誤りになります。

[45] Firefox>>35 に対応しています。内部部分集合から参照される内部引数実体>>36>>37 が含まれる場合、元の引数実体参照が不正であるとの致死的誤りになります。

メモ

[24]

JISX4151‐1992 3. (209) 引数実体 (parameter entity)
マーク宣言引数から参照することができる実体
WebSGML K.2.5.3 パラメタ実体 (parameter entity)
[4.225 (JIS X 4151 においては、3. (209)) を参照。] 外部部分集合実体であるか、又はパラメタ実体名をつけて宣言された実体。

[25] >>24 じゃあ宣言部分集合の地の部分の引数実体参照はどうなのだと一瞬思いますが、よくみると宣言部分集合自体文書型宣言とかの引数なわけですから、 この定義で全く問題ない。

[26] 引数実体は一般実体と同じく実体宣言を使って宣言しますが、微妙に異なる書式であり、実体名名前空間も異なります。

[27] 内部実体のことも外部実体のこともありますが、一般実体とは異なり必ず解析実体です。また、参照される場合は必ず引数実体参照の形を取り、他に参照する方法はありません。

[28] 有効範囲は宣言の直後からで、宣言部分集合, マーク宣言 (マーク区間宣言を含む。) の適当な (構文上認められた) 場所です。

[29] XML の場合は文書型宣言の宣言部分集合内でのみ有効です。

[30] >>24 素の SGML と Web SGML では定義が違っていますが、この改訂には2つの意味があるでしょう。(1) 見方の違い : 素の SGML では参照する側からみた定義だったのが、 Web SGML では定義する側から見た定義になっている。 (2) 意味の拡大 : 素の SGML では引数実体であるか定義上曖昧であった、外部部分集合実体が Web SGML では引数実体の一種になっています。

[15] SGMLXML では DTDマーク宣言などの表記にパラメーター実体参照が使えます。

[16] XML の仕様書では、他の部分では実体参照が使える部分が EBNF 構文ではっきり示してあるのに、 DTD 中のパラメーター実体参照が書ける場所については自然言語での説明しかありません。

[17] まず、 DOCTYPE 宣言中の内部部分集合のマーク宣言内にパラメーター実体参照は一切書けません (EntityValue 内も書けないみたいです)。 (マーク宣言外、つまり地の部分には書けます。)

[18] で、マーク宣言「内」とはどこからどこまでか、 なのですが、幾つかの XML parser の実装を調べてみました。 (Mozilla外部解析実体を読まないので問題外、 WinIE (MSXML) とか W3CValidator で試してみる。もっとも W3C のは本来 SGML parser だから、あてになるのかは不明。)

[19] こんなのもありだ。 <!ENTITY % include " INCLUDE[<!ENTITY % q '"'><!ENTITY name %q;name=foo%q;> "><![%include;>]]。ところが、ちょっと修正をして <![%include;]> とか <!%include;>]] となるようではうまくいかない。

[20] >>19 ここで思い出されるのが、 U+0020 を補う規則。確かに >>19 の悪い例だと、 <! [ INCLUDE[ とか ] ]> とかになるからおかしい。

[21] >>18 整形式制約というか、XML//妥当性制約 (>>4)だよな。 (パラメーター実体の外に出ている < が整形式制約, 中に入っている (置換文の) > が妥当性制約に引っ掛かる。)

[22] >>16 たしかに完全に BNF で表現するのは困難ではあるのですが...

[23] >>22 全ての組み合わせは実質不可能だけど、せめて SGML 仕様書程度の記述はするべき、というか、 ts, ps, ds 程度の区別はするべきだったと。

[1]SGML/XMLDTD 中でマーク宣言やその引数を値として持つ変数 (というか定数) 的に使用される実体参照パラメーター実体参照, パラメタ実体参照などとも。 Parameter entity reference。

[2] 規格参照具象構文だとして、

<!ENTITY % lt '<'>
<!ENTITY % a "%lt;!ENTITY ent 'entity value'>">
%a;

は適当でしょうか?

JISX4151‐1992 9.1.4 は、 「ds としての引数実体参照は、 0個以上の完全なマーク宣言と ds とからなる実体を参照しなければならない」と述べています。

この例では %a; も、それに含まれる %lt;ds としての引数実体参照とみなされます。 < だけからなるマーク宣言は存在しませんから、 この例は不正です。

[3] それでは

<!ENTITY % q '"'>
<!ENTITY % a "<!ENTITY ent %q;entity value%q;>">
%a;

は適当でしょうか? ちなみに MSXML では通ってしまいます。

JIS X 4151‐1992 9.1.1 には、 「その参照する実体は、その参照が現れた ps の直後に続ける0個以上の完全な引数の列からなっていなければならない」 としています。" だけの実体が「完全な引数」 でないことは明らかですから、この例は不正です。

実はこの例は次のように書くのと同じことです。

<!ENTITY % q '"'>
<!ENTITY ent %q;entity value%q;>

こちらの例を見れば、「完全な引数」になっていないことはますます自明です。 実体値指定内の引数実体参照は宣言時ではなくそれを含む引数実体が参照された時に評価されることを思い出して下さい。

[4]

<!ENTITY % e1 "'Q&#x26;#x26;#x26;A'">
<!ENTITY e2 %e1;>

後者の実体宣言の解釈を試みる。名前 e2 と、その直後の ps である s である文字 SP まで読んだ。 ここで、引数実体参照 %e1; を発見する。 この引数実体参照も、 ps として評価される。

引数実体 e1 の値を得るが、その引数表記"'Q&#x26;#x26;#x26;A'" である。 引数表記は両端が lit 又は lita だが、ここでは前者である。 その間の部分は置換可能引数データである。

置換可能引数データでは、文字参照と引数実体参照が解釈される。 XML では、構文上文字参照でも一般実体参照でもない文字 & を書くことが出来ないが、そうだとしても一般実体参照はまだ認知されない・・・のかなあ。よくわからない。 従って、参照を置換した結果 'Q&#x26;#x26;A' を得る。

結局、先の後者の実体宣言は <!ENTITY e2 'Q&#x26;#x26;A'> と書かれていたことになる。

同様の解釈 (さっきのよりずっと簡単。) により、 e2置換文Q&#x26;A であるとわかる。

文書実現値中で &e2; と参照すると、 今度はその参照の位置で数値文字参照 &#x26; が評価され、結局その参照は文字データ Q&A となる。

[5]

<!ENTITY % e1 "'Q&#x26;#x26;#x26;A'">
<!ENTITY % e2.5 "%e1;">
<!ENTITY e2 %e2.5;>

>>4 の例と大差がないように思えるこの例で、 e2 の置換文を求める。

前例と同様の手順により、 e2 の解釈に必要な e2.5 の置換文を求めることとなった。 e2.5 の引数表記の中身は引数実体参照 %e1; である。前例同様、 e1 の置換文は 'Q&#x26;#x26;A' である。 従って、 <!ENTITY % e2.5 "'Q&#x26;#x26;A'"> と記述されていたとみなせる。

ここで、数値文字参照 &#x26;#x26; がまた評価され、置換文は 'Q&#x26;A' となる。 結局 <!ENTITY e2 'Q&#x26;A'> となり、文書実現値中で参照したときの置換文は Q&A となる。 XML では、整形式エラーとなる。

・・・と思うのだが、試しに MSXML で読ませてみると、 e2 の実体宣言でえらーが出る。 「この場所ではスペースが許可されません」ハァ?

この解釈が間違っているのでしょうか?

(<!ENTITY e2 '%e2.5;'> と宣言すれば、 なんとなく意図したようにはなります。)

[6]

<!ENTITY % AMP0 '&#x26;#x26;#x26;'>
<!ENTITY AMP0 '&#x26;#x26;#x26;'>
<!ENTITY AMPp "%AMP0;">
<!ENTITY AMP "&AMP0;">

文書実現値で &AMP;&AMPp; と参照することを考えます。

まず &AMP; からです。その引数指定は一般実体 AMP0 への参照があるのですが、 実体宣言の段階ではまだ認知されていません。 一般実体 AMP の置換文はそのまま &AMP0; で、これが文書実現値中の参照の場所で評価されます。

一般実体・引数実体ともに、 AMP0 の置換文は &#x26;#x26; です。 (両実体の宣言の引数指定の解釈で1つずつ減ってます。)

一般実体 AMP0 を文書実現値中で評価した結果、 得られる文字データは &#x26; となります。

さて、 &AMPp; の場合です。 こちらは、一般実体 AMPp実体宣言の時点で、 その引数指定内の引数実体 AMP0 への参照が評価されているため、 AMPp の宣言は <!ENTITY AMPp "&#x26;#x26;"> と同じことです。

また引数指定ですから、置換文は &#x26; になります。

これが文書実現値中で評価される時、得られる文字データは & になります。

[7] 頭の体操のような様相を呈してきました。。。

[10] >>3 の「実体値指定内の引数実体参照は宣言時ではなくそれを含む引数実体が参照された時に評価される」というのは、何かの勘違いではないでしょうか。

実体文(実体値指定)が引数表記(実体値)で記述されている場合、表記の中の引数実体参照は単に置換可能引数データの文脈で解釈されます(JISX4151‐1992 表3, XML 4.4.5)。

従って、>>6 の例と同様、>>2>>3 の例での %lt;%q;a の実体宣言の際に展開されてしまうので、dsps として認知されることはありません。結局、%a; はどちらの例でも正当な ds として解釈され、一般実体 ent が正しく宣言されたものと見なされます。

[12] XML では、内部部分集合マーク宣言の内部に引数実体参照を入れることができません。 引数実体参照が使えるのは他のマーク宣言ど同位のところ (「地」の部分) だけです。 (整形式制約 PEs in Internal Subset)

外部引数実体外部部分集合実体ではこの制限はなく、 マーク宣言内に書くことができます。

ということは、内部部分集合で参照されている内部引数実体の中でも使えないということです。 条件区間と同じですね。

(名無しさん)

[13] >>11 の文書は以前から気になっていた整形式制約 In DTD のことを説明してくれています。

そこでは CDATA区間のためだろうという結論になっていますが、 それでも、 XML の構文では文字データ区間に引数実体参照が使える余地はありません。 ですから整形式制約として敢えて立てる必要性の説明にはならないと思います。 (本当はやはり不要で、歴史的なものではないかとにらんでいます。)

関係ありませんが、 SGML でも、 構文的には文書型宣言などで引数実体参照が認められながら、 本文でそれを取消す形になっています。 これはおそらくマーク宣言空白にはすべて ps を使いたかったからでしょう。

(名無しさん)

[14] >>13 意表をついて、 DTD の中では使ってもいいよという制約ではないかと思ったりしましたが、こういう解釈って駄目ですか?

XML の整形式・妥当性制約ってのは EBNF の生成規則で表現できないことを記述しているではないですか。で、マーク宣言内の引数実体参照もうまく表現できていないから・・・。

でももし本当にこういう意味だとしたら、 説明がよくなさすぎる。 (名無しさん 2004-06-06 03:27:37 +00:00)

[49] JIS X 4153:1998 文書スタイル意味指定言語(DSSSL) 解説 , http://www.y-adagio.com/public/standards/jis_dsssl/tutr.txt

訳語選定に際しては,SGMLを規定しているJIS X 4151,SGMLの拡張規格であるJIS X 4155, 及びSGML関連規格であるJIS X 4171との整合を第一に配慮した。しかし次の用語などについては,その後関連分野で普及した訳語表記に従っている。

原語 訳語

------------------------------------------------

parameter entity パラメタ実体