<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="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体宣言<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">entity declaration</rt></rubyb></dfn>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">宣言</anchor>する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マーク付け宣言</anchor>でした。</p><section><h1>SGML における実体宣言</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> </p><blockquote><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">参照</anchor>を可能にするために、1つの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体</anchor>に <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SGML名</anchor>を指定する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マーク宣言</anchor>。
Entity declaration。 <ins>(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JIS X 4151</anchor>‐1992 3. (116))</ins></p></blockquote><ul><li><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> <code class="ABNF"><dfn>実体宣言</dfn> := <code class="SGML"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mdo</anchor></code>  <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ENTITY</anchor> 1*<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ps</anchor> 実体名 1*ps <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体文</anchor> *ps <code class="SGML"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mdc</anchor></code> ;; (101)</code></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> <code class="ABNF"><dfn>実体名</dfn> := <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">名前</anchor> / (<code class="SGML"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">rni</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DEFAULT</anchor>) / (<code class="SGML"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">pero</anchor></code> 1*<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ps</anchor> 名前) ;; (102), (103), (104)</code></li></ul><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:">規格参照具象構文</anchor>では、 <samp class="SGML">&lt;!ENTITY ent &quot;EntityValue&quot;&gt;</samp> のような記述となります。</p><p><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> SGML <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書実体</anchor>で参照されるほとんどの実体は実体宣言で宣言されているものです。<weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">その例外は、<anchor>文書型宣言</anchor>の<anchor>外部部分集合</anchor>とか、<anchor>連結型宣言</anchor>の外部部分集合とか、幾つかあるにはあります。</weak></p><p><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> 実体名の <code class="SGML">pero</code> 辺りは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">認知</anchor>の特例になっています。
本来 <code class="SGML">pero</code> は文脈上の制約があって、
直後に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">名前文字</anchor>などが続く場合のみ認知しますが、
ここでは特別に制約なしで<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">区切子</anchor>として認知します。また、
その直後の <code class="SGML">ps</code> は必須です。これによって、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">引数実体参照</anchor>と区別しています。</p><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> Web SGML では、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">外部引数実体</anchor>に<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>を参照させることができます。 (K.4.10.2 参照)</p><form xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" ref="comment"></form></section><section><h1>同じ名前に対する複数個の実体宣言</h1><p><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 xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XML</anchor> 仕様書 <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#sec-entity-decl">http://www.w3.org/TR/REC-xml#sec-entity-decl</anchor-external> 曰く:</p><blockquote><p>If the same entity is declared more than once, the first declaration encountered is binding; at user option, an XML processor may issue a warning if entities are declared multiple times.</p></blockquote><p>(同じ実体が複数回宣言されていたなら、最初に現れた宣言が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">束縛</anchor>される。
<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>は実体が複数回宣言されたときに<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">警告</anchor>を出しても良い。)</p><form xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" ref="comment"></form><section><h1>実体宣言の優先順</h1><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><ol><li>1番目に活性状態になった<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">連結型宣言部分集合</anchor>の実体宣言<ol><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">連結型宣言</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内部部分集合</anchor>の実体宣言</li><li>連結型宣言の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">外部部分集合</anchor>の実体宣言</li></ol></li><li>2番目に活性状態になった〜(略) (JIS X 4151‐1992 11.1.4.1 参照。)</li><li>(原始)<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書型宣言部分集合</anchor>の実体宣言<ol><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書型宣言</anchor>の内部部分集合の実体宣言</li><li>文書型宣言の外部部分集合の実体宣言</li></ol></li></ol></p><p>複数の文書型宣言間でどれが採用されるかは、
<code class="WikiPage"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体参照//対応する実体宣言</anchor></code>を参照。</p><form xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" ref="comment"></form></section><section><h1>優先度の低い (無視される) 実体宣言の妥当性</h1><p><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 xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体値</anchor>などに関する制約は課せられるのでしょうか?</p><p>とりあえず、構文的な制約は課せられると考えて間違いないでしょう。
ですから、 <samp class="XML">&lt;!ENTITY ent &quot;foo&quot;&gt;&lt;!ENTITY ent &quot;&amp;&quot;&gt;</samp>
は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">致命的誤り</anchor>となるはずです。</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:">非解析実体</anchor>が参照されている場合:
<samp class="XML">&lt;!ENTITY ent &quot;foo&quot; NDATA defined-notation&gt;&lt;!ENTITY ent &quot;foo&quot; NDATA undefined-notation&gt;</samp>。
妥当性制約「記法が宣言されていること」<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#not-declared">http://www.w3.org/TR/REC-xml#not-declared</anchor-external>
は、
「The Name must match the declared name of a notation.」
(<code class="XML"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Name</anchor></code> は宣言された記法の名前に一致しなければならない。)
と述べています。状況についての言及はなく、構文についてのみの言及ですから、
この妥当性制約は無視される場合も有効と思われます。</p><p>続き (記法がらみ) は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">記法</anchor>辺りへ。</p><p><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 xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書</anchor>全体の整形式性について、 <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#dt-wellformed">http://www.w3.org/TR/REC-xml#dt-wellformed</anchor-external>
は、<ul><li>文書全体として <code class="XML"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Document</anchor></code> に一致すること。</li><li>すべての<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XML//整形式制約</anchor>を満たすこと。</li><li>直接または間接に<em>参照している</em>すべての実体が整形式であること。</li></ul></p><p>と言っています。無視されている実体 (であったであろうもの)
が参照されていないことは明らかです。 (無視されていなくても、
文書中で参照されていなければ整形式でなくてもいいようです。)</p><p><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> 実体についての制限のほとんどは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">置換文</anchor>が対象だから、
無視された宣言や参照されていない実体の宣言はあんまり制約されないのかな。</p><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:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体参照//解決</anchor>に言及がある仕様の修正は重要。この修正がないと、非解析実体への参照がないか無視された宣言や参照されていない実体の宣言もチェックしないといけなかった。</p><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-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;9</anchor-internal> しかし他にも問題はある。 XML 名前空間の仕様
<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/XML/xml-names-19990114-errata#NE08">http://www.w3.org/XML/xml-names-19990114-errata#NE08</anchor-external>
曰く:</p><blockquote><p>All other tokens in the document which are required, for XML 1.0 well-formedness, to match the XML production for Name, must match this specification's production for NCName.</p></blockquote><p>(文書中の全ての他の <weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">(<code xmlns="http://www.w3.org/1999/xhtml" class="XML"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">QName</anchor></code> 以外の)</weak>,
XML 1.0 整形式性のために XML 生成規則 <code class="XML">Name</code>
と一致する必要がある字句は、 
<weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">(名前空間整形式であるためには)</weak> この仕様書の生成規則
<code class="XML"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">NCName</anchor></code> と一致しなければなりません。)</p><p><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal> の1つめの整形式性条件 (構文一致) とこの規定により、
実体値中の一般実体参照も <code class="XML">NCName</code>
である必要があります。</p><p>まあ、もともと一般実体参照以外の <code class="XML">&amp;</code>
をチェックしないといけないのですから、
大した手間ではないのですが。</p><p>実体値中の実体参照の名前だけではなく、 <code class="XML">NDATA</code>
の後の記法名も影響されます。</p><form xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" ref="comment"></form></section></section><section><h1>メモ</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> <weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">2003-09-14 03:08:10 +00:00</weak> <em><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">名無しさん</anchor></em>: 
<samp class="XML">&lt;!ENTITY lt &quot;&amp;#x3C;&quot;&gt;&lt;!-- (正) --&gt; &lt;!-- ... --&gt; &lt;!ENTITY lt &quot;なにか。&quot;&gt;&lt;!-- (誤) --&gt;</samp> 
ってのは高々警告で済ませるべきものですよねぇ。今の 
<code class="perl"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Message::Markup::XML::Parser</anchor></code> 
は致命的誤りにしちゃうんだけど。。。</p><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> なんとなく書いてみたけど途中で面倒になって止めた図:<pre>      mdo
       #
    'ENTITY'
       |
    +--+--+
    |     #
    r    ps
    |     |
    +---+-+
        |
    +--++---+
    |  #    #
    | pero rni
    |  |    |
    | +++   |
    | | |   |
    | r #   |
    | | ps  |
    | | |   |
    +-+-+---+
        |
 +&lt;-r---+--+
 |         #
 |        name
 #         |&lt;----------r------------------+
 +&lt;-r------+--+                           |
 |            #                           |
 |           ps                           |
 #            |                           |
 +---+--------+-+--------+----------+     |
 |   #          #        #          #     |
 | 'CDATA'    'SYSTEM' 'PUBLIC'  keyword -+
 | 'SDATA'      |         |
 | 'PI'         |       +-+-+
 | 'STARTTAG'   |       |   #
 | 'ENDTAG'     |       r   ps
 | 'MS'         |       |   |
 | 'MD'         |       +-+-+
 |   |          |         |
 |   |          |       +-+-+
 |   |          |       |   #
 |   |          |       r publit
 |   |          |       |   |
 |   |          +-+-----+---+
 |   |            |
 |   |            +------+
 |   |            |      #
 |   |            |     ps
 |   |            |      |
 |   |            |      +---+
 |   |            |      |   #
 |   |            |      | syslit
 |   |            |      |   |
 |   |            |      |   +--+---+&lt;-------------+
 |   |            |      |   |      #              |
 |   |            |      | +-+-+   ps              |
 |   |            |      | |   |    |              |
 |   |            |      | | (kwd)  |              |
 |   |            |&lt;-----|-+   r    |              |
 |   |            |      |     |    |              |
 |   |            |      +&lt;----+----+              |
 |   |            |      |                         |
 |   |            |      +-----+----+--+-------+    |
 |   |            |      |     #       #       #    |
 |   |            |      | 'SUBDOC' 'CDATA'   kwd   r
 |   |            |      |    |     'NDATA'    |    |
 |   #            |      |    |     'SDATA'    +----+
 |  ps            |      |    |       #
 |   #            |      |    |      ps
 +-+-+            |    |       #
   |              |    |      name
   |              |    |       |
   #              |    |     +-+--+
  paralit         |    |     |    #
   |              |    |     |   ps
   |          |    |     |    #
   |          |    |     |   dso
   |          |    |     |    #
   |          |    |     |  attrspecs
   |          |    |     |    #
   |          |    |     |   dsc
   |          |    |     |    #
   +---+------+----+-----+----+
       |
     +-+-+
     |   #
     |  ps
     |   |
     +-+-+
       #
      mdc

CDATA	ps paralit
SDATA
PI
STARTTAG
ENDTAG
MS
MD

SYSTEM	[ps syslit]
PUBLIC	[ps publit [ps syslit]]
SUBDOC

CDATA	name [data]
NDATA
SDATA

#	paralit

!ENTITY	(# / cdata / (system / public) [subdoc / cdata / ndata / sdata])</pre></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="207" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[207]</anchor-end> 
<time>西暦1994(平成6)年<attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">1994</attrvalue></time>時点の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Emacs/W3</anchor> が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内部実体宣言</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="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;19</anchor-internal></src></p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> 
<cite><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Emacs/W3</anchor> 2.1p46</cite>,
<time itemprop="published">1994-08-01 11:42<attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">1994-08-01T11:42</attrvalue></time>,
<time>2024-09-11T12:08:47.100Z</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.nic.funet.fi/index/WWW/emacs/html-mode/w3-2.1p46.tar.gz">http://www.nic.funet.fi/index/WWW/emacs/html-mode/w3-2.1p46.tar.gz</anchor-external></li></ul></section></body></html>