- PR -

standalone宣言の解説について

投稿者投稿内容
コセキ
会議室デビュー日: 2001/12/07
投稿数: 13
投稿日時: 2002-01-15 23:36
いつも参考にさせていただいております。

「技術者のためのXML再入門 第4回」の記事で、standalone宣言の解説の表題が「外部DTDを参照するかどうかの宣言」となっていますが、これは正しくないのではないでしょうか。本文の、

引用:

次のように宣言した場合、XMLプロセッサは、外部DTDを参照する。

<?xml version="1.0" standalone="yes" ?>

 以下のXML宣言のようにstandalone宣言が省略された場合、XMLプロセッサはsatndalone="no"と宣言されたとみなし、外部DTDを参照する。

<?xml version="1.0" ?>



というのも、なんかへんなきがしますが・・。

standalone宣言は「文書の外に文書の内容を変化させるような記述が存在しない」ということを述べる宣言だと思います。外部のDTDを参照するかどうかは、そのプロセサが妥当性を検証するかどうかによるのであって、standaloneの値とは関係がないはずです。

http://www.fxis.co.jp/DMS/sgml/xml/rec-xml.html#sec-rmd

間違っていたらすみません。ご指摘ください。
コセキ
会議室デビュー日: 2001/12/07
投稿数: 13
投稿日時: 2002-01-16 06:53
すいません、ちょっと修正します・・。

引用:
外部のDTDを参照するかどうかは、そのプロセサが妥当性を検証するかどうかによるのであって、standaloneの値とは関係がないはずです。



プロセサには、
  • 妥当性を検証し、外部解析対象実体を読み込むもの。
  • 妥当性を検証せず、外部解析対象実体を読み込むもの。
  • 妥当性を検証せず、外部解析対象実体を読み込まないもの。
の三種類があるんだと理解しています(→5. 適合性)。で、standalone宣言はそのことに影響を与えないのでは、というつもりでした。

[ メッセージ編集済み 編集者: コセキ 編集日時 2002-01-16 07:12 ]
やなぎ
会議室デビュー日: 2001/12/11
投稿数: 12
投稿日時: 2002-01-16 13:28
確かに変ですね。
standalone="yes"は"no"の間違いだと私も思います。
ところで、standalone宣言は外部のDTDを参照するかしないかの宣言だと理解しているのですが、「参照=妥当性検証」ではないのですか?
その辺の所が私は理解できていません。
@IT新野
@ITエディタ
会議室デビュー日: 2001/07/27
投稿数: 66
投稿日時: 2002-01-16 15:45
コセキさん、やなぎさん、編集担当の新野です。
いつもご愛読ありがとうございます。ご指摘、筆者に伝えまして、いまうまい
言い回しなどを検討していただいているところです。とりあえず現状ご報告。
にいの
コセキ
会議室デビュー日: 2001/12/07
投稿数: 13
投稿日時: 2002-01-16 18:29
新野さん、ご対応ありがとうございます。

やなぎさん、
引用:

ところで、standalone宣言は外部のDTDを参照するかしないかの宣言だと理解しているのですが、「参照=妥当性検証」ではないのですか?


たとえば、standaloneが'yes'で、外部DTDがデタラメな文書を作ってみます。
コード:


<?xml version='1.0' standalone='yes'?>
<!DOCTYPE root SYSTEM 'test.dtd'>
<root/>


として、test.dtdにデタラメな内容を書き込みます。これをIEやxercesに入力すると、DTDが整形式ではないというエラーが発生します。standaloneを'no'に変えても同じです。standaloneの値に関わらず外部DTDを読み込んでいるようです。

仕様には、
引用:

妥当性を検証するXMLプロセサは,DTD全体と文書内で参照されているすべての外部解析対象実体とを読み込んで処理しなければならない。


とあります。これは、妥当性を検証するなら内部DTDも外部DTDも読まなければダメだということでしょう。また以下のようにも書いてあります。
引用:

妥当性を検証しないプロセサは,整形式であることを確認するために,DTDの内部サブセット全体を含めた文書実体を調べることだけが義務づけられている。


これは、妥当性を検証しないときは外部DTDは読んでも読まなくてもいいよ、ということですよね。

記事にもありますが、妥当性を検証しないプロセサでも内部DTDは読み込まれます。例えば、
コード:


<?xml version='1.0' standalone='yes'?>
<!DOCTYPE root [<!ENTITY abc 'xyz'>]>
<root>&abc;</root>


とやって、妥当性を検証しないプロセサ(perl/expatとか)に入力すると、&abc;の値('xyz')が取り込まれます。内部DTDの実体宣言が読まれているわけです。

では外部DTDはどうかというと、一番最初のデタラメを書いたtest.dtdの例をperl/expatに入力してもエラーが発生しません。standaloneが'yes'でも'no'でも同じです。standaloneの値に関わらず、外部DTDは読まれていないようです。

ここまでの実験でわかるのは、standaloneの値が、外部DTDを読み込むかどうかに影響を与えることはないようだ、ということです。妥当性を検証するプロセサは、standaloneの値に関わらず外部DTDを読んでいましたし、妥当性を検証しないプロセサは、standaloneの値に関わらず外部DTDを無視しているようでした。

standalone宣言は、たとえ文書の外部に書いてあることが変化しても、文書の内容は変化しませんよ、と主張するものです。具体的に、どんな時に外部の記述が文書の内容に影響をあたえるかが「Validity Constraint: スタンドアロン文書宣言」に書かれています。

[ メッセージ編集済み 編集者: コセキ 編集日時 2002-01-16 19:00 ]
コセキ
会議室デビュー日: 2001/12/07
投稿数: 13
投稿日時: 2002-01-16 19:18
すいません、長々と書いてからなんとなくわかりました。。

「参照するかどうか」というのは、「読み込むかどうか」ではないんですね。「依存するかどうか」というような意味だということでしょうか。

いやでも「参照しない」ことと「依存しない」ことでは意味が違うような気もしますが・・。standalone='yes'でも「参照する」とありますし・・。

うーん、難しいです。。
コセキ
会議室デビュー日: 2001/12/07
投稿数: 13
投稿日時: 2002-01-16 23:19
立て続けにすみません。

以下のXML文書と、
コード:
<?xml version='1.0' standalone='yes'?>
<!DOCTYPE test [
<!ELEMENT test (#PCDATA)>
<!ENTITY % abc SYSTEM "test.dtd">
%abc;
%xyz;]>
<test>&zzz;</test>


以下の外部DTD(test.dtd)の組み合わせで、
コード:
<?xml version="1.0" encoding="US-ASCII"?>
<!ENTITY % xyz '<!ENTITY zzz "external value">'>


&zzz;のところが"external value"で置換されますね・・。Xercesのサンプルのsax.DocumentTracerと、IEで試してみたのですが、エラーにはならないようでした。
また、仕様の日本語訳を見る限り、これを妥当ではないとする個所がみつかりませんでした。

ということは、「文書の外に文書の内容を変化させるような記述が存在しない」のがstandaloneだという考え方は、間違いなのでしょうか。

standaloneが何のためにあるのか、わからなくなってしまいました。
@IT新野
@ITエディタ
会議室デビュー日: 2001/07/27
投稿数: 66
投稿日時: 2002-01-17 01:13
@IT新野です。コセキさん、いろいろご検討ありがとうございます。
この掲示板のURLは筆者にも伝えてあるので、たぶん読んでいただいていると
思います。さきほど、筆者の方が、あらためて修正内容を提案していただいた
ので、それをこちらでも検討してみます。反映しましたら、またお伝えします
ので、よろしくおねがいします。ざっと見ると、やはりXMLプロセッサの動作
になにがしかの影響を与えるようなものではなさそうなことが書いてあります。
とりあえず。

にいの

スキルアップ/キャリアアップ(JOB@IT)