<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">外部実体</anchor>である<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">引数実体</anchor>を、<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>外部引数実体</anchor><rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">external parameter entity</rt></rubyb></dfn>といいます。</p><section><h1>仕様書</h1><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> <cite xml:lang="EN">Extensible Markup Language (XML) 1.0 (Fifth Edition)</cite> (<time>2013-05-28 20:49:56 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.w3.org/TR/xml/#ext-Subset">http://www.w3.org/TR/xml/#ext-Subset</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> <cite xml:lang="en">RFC 7303 - XML Media Types</cite> (<time>2014-07-07 20:56:43 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc7303#section-4.1">http://tools.ietf.org/html/rfc7303#section-4.1</anchor-external></li></ul></refs></section><section><h1>MIME 型</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">外部引数実体</anchor>には <code class="MIME" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">application/xml-dtd</anchor></code>
を使う<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><strong xmlns="http://www.w3.org/1999/xhtml">べき</strong></anchor>です <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;14</anchor-internal></src>。 <code class="MIME" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">application/xml</anchor></code>
や <code class="MIME" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">text/xml</anchor></code> を使っては<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><strong xmlns="http://www.w3.org/1999/xhtml">なりません</strong></anchor> <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;14</anchor-internal></src>。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> なぜか <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><strong xmlns="http://www.w3.org/1999/xhtml">SHOULD</strong></anchor> となっています。</comment-p></section><section><h1>引数</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> 次の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">引数</anchor>があります。</p><figure class="short list"><ul><li><code class="MIME" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">charset</anchor></code></li></ul></figure></section><section><h1>処理モデル</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[18]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の取り扱いについては、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XMLにおける文字コード</anchor>を参照してください。</p></section><section><h1>関連</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> 特定の作法で記述された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">外部引数実体</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DTDモジュール</anchor>などと呼ぶことがあります。</p></section><section><h1>歴史</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 2376</anchor> では <code class="MIME" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">text/xml</anchor></code> や <code class="MIME" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">application/xml</anchor></code>
を使うことになっていましたが、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 3023</anchor> ではこれが認められなくなり、
<code class="MIME" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">application/xml-dtd</anchor></code> が導入されました <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;11</anchor-internal></src>。</p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> <cite xml:lang="en">RFC 3023 - XML Media Types</cite> (<time>2014-07-11 12:46:44 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc3023#section-3">http://tools.ietf.org/html/rfc3023#section-3</anchor-external></li></ul></refs><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 7303</anchor> でも引き継がれています。</p></section><section><h1>メモ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end>  なんとなく、<pre>&lt;!ENTITY % ent SYSTEM &quot;data:,%22EntityValue%22&quot;&gt;
&lt;!ENTITY entity %ent;&gt;</pre><p>みたいのはありかなあ? って気がしますが、 XML 仕様書にはダメとは書いてないので、いいんでしょう。</p></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> 試しに <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WinIE6</anchor> で<pre>&lt;!ENTITY  % external-text SYSTEM &quot;c.dtd&quot;&gt;
&lt;!ENTITY %external-text;&gt;
 <ins>&lt;!-- b.dtd --&gt;</ins></pre><pre>an-external-entity &quot;This is an external entity.&quot;
 <ins>&lt;!-- c.dtd --&gt;</ins></pre><p>を試してみると、「スペースが必要です」と言われます。
<samp class="file">b.dtd</samp> の2つめの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体宣言</anchor>を
<samp class="XML">&lt;!ENTITY %external-text; &gt;</samp>
に変えると、文句言われずに意図したように解釈されました。</p></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">この両者の違いはないはずですから、 M$XML のバグでしょう。
なお、内部実体の場合でも同じエラーが出ます。
外部引数実体の扱いとは無関係のようです。</comment-p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> の <samp class="file">c.dtd</samp> の前に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文宣言</anchor>を入れたら、「無効な文字で名前が始まりました」と言われました。これは間違いなくバグですね。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> でも <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;3</anchor-internal> の動作は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SGML</anchor> 的には適当だと思われる。やっぱり、文宣言は SGML 的には<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">処理指令</anchor>ではなくシステム依存の <weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">(SGML の外の世界の)</weak> データである説は正しいのだろうか?</li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> で、<pre>&lt;!ENTITY % external-text SYSTEM &quot;c.dtd&quot;&gt;
&lt;!ENTITY % xent2 &quot;%external-text; &gt;&quot;&gt;
%xent2;
 <ins>&lt;!-- b.dtd --&gt;</ins></pre><pre>&lt;!ENTITY an-external-entity &quot;This is an external entity.&quot;
 <ins>&lt;!-- c.dtd --&gt;</ins></pre><p>ってのはどうでしょう?</p></p><p>WinIE 6.0 も <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">W3CのValidator</anchor> も、問題ないと言ってくれます。
<weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">それに自分で処理系書いてみると、問題ないことにしたい気持ちはよくわかります。</weak>
本当に問題ないんでしょうか? ないといいんですが。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> というわけで<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XML//妥当性制約</anchor>
「PE とマーク宣言が適当に入れ子になっていること」
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.w3.org/TR/REC-xml#vc-PEinMarkupDecl">http://www.w3.org/TR/REC-xml#vc-PEinMarkupDecl</anchor-external> であります。</p><blockquote><p>Parameter-entity replacement text must be properly nested with markup declarations. That is to say, if either the first character or the last character of a markup declaration (markupdecl above) is contained in the replacement text for a parameter-entity reference, both must be contained in the same replacement text.</p></blockquote><p>外部実体 <samp class="file">c.dtd</samp> で、
実体宣言 <weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">(の一部となるもの)</weak> の先頭の文字があって、
最後の文字はありません。どう見ても、同じ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">置換文</anchor>中にマーク宣言が完全に含まれてはいません。</p><p>でもちょっと待ってください。この実体、つまり
<samp class="XML">external-text</samp> が展開されるのは、
別の引数実体 <samp class="XML">xent2</samp> の宣言時です。
そのときにその<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体値</anchor>, というか置換文の一部となるのです。
で、この時点に於いてその中身はマーク宣言ではありません。
単なる文字列です。</p><p>で、 <samp class="XML">xent2</samp> が参照された時に初めて、
この文字列がマーク宣言として解釈されるのです。
そしてその時、マーク宣言の最初と最後の文字は確かに、
同じ実体の中にあるのです。</p><p>・・・と、解釈してもいいんでしょうか? いいですよね?
<weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">いや、そう解釈しないと、面倒なことになるのでどうか一つ是非・・・</weak><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;3</anchor-internal>-4 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">W3CのValidator</anchor> でも駄目だや。 <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;5</anchor-internal> の例 + 文宣言なら M$XML でも W3C のでも OK みたいだけど。</li></ul></p></section></body></html>