XMLで「スタンドアロン」ディレクティブはどういう意味ですか?


272

standaloneXMLドキュメントでの' 'ディレクティブの意味は?

回答:


203

standalone宣言は、のいずれかのマークアップ宣言を無視するパーサを伝えるための方法ですDTDを。その後、DTDは検証にのみ使用されます。

例として、控えめな<img>タグを考えます。あなたが見ればXHTML 1.0 DTD、あなたはそのパーサを伝えるマークアップ宣言参照<img>タグが空であると持たなければならないsrcalt属性を。ブラウザはXHTML 1.0文書を通過し、見つかっている場合は<img>、タグを、それはDTDが必要であることに気づくはずですsrcし、alt属性、それらが存在しない場合は、それらを追加します。また、<img>EMPTYであるため、タグは自動的に閉じられます。これは、「マークアップ宣言がドキュメントのコンテンツに影響を与える可能性がある」というXML仕様の意味です。次に、standalone宣言を使用して、これらのルールを無視するようにパーサーに指示できます。

パーサーが実際にこれを実行するかどうかは別の問題ですが、標準に準拠した検証パーサー(ブラウザーなど)が実行する必要があります。

DTDを指定しない場合、スタンドアロン宣言は「意味がない」ため、DTDも指定しない限り、それを使用する理由はありません。


9
この例には、さらに変更が必要です。「standalone = 'no'」を指定しても、通常は閉じられていないXMLタグは閉じません(これはSGMLの機能ですが、XMLの機能ではありません)。検証は失敗します。また、必須の属性の値も提供しません。
khaemuaset 2015年

2
「スタンドアロン宣言は、DTD内のマークアップ宣言を無視するようにパーサーに指示する方法です。」不正解です。ではstandalone=yes、マークアップ宣言は無視されず、代わりにドキュメントが無効なXMLになります。それを編集して答えにしてもよろしいですか?
sleske 2017

@sleske変更してください。作者は彼/彼女が満足していない場合はいつでも元に戻すことができます。
ステファン

@Stephan:励ましをありがとう。残念ながら、私はもはやXMLのすべてについて最新ではないので、自信を持って現在編集することはできません。最新の知識があれば、自由に編集してください:-)。
sleske

106
  • スタンドアロンディレクティブは、XML宣言のオプションの属性です。
  • 有効な値はyesand noで、noはデフォルト値です。
  • この属性は、DTDが使用されている場合にのみ関係します。(DTDの代わりにスキーマを使用する場合、属性は無関係です。)
  • standalone="yes"つまり、XMLプロセッサは検証にのみDTDを使用する必要があります。その場合、次の場合には使用されません
    • 属性のデフォルト値
    • エンティティ宣言
    • 正規化
  • standalone="yes"文書が外部DTDを使用する場合、妥当性制約が追加される場合があることに注意してください。文書は、そのような属性のデフォルト値としてXMLの変更を必要とするものを、含まれている、とするときstandalone="yes"に使用され、その後、文書は無効です
  • standalone="yes" ドキュメント処理のパフォーマンスを最適化するのに役立ちます。

出典:スタンドアロンの疑似属性は、DTDが使用されている場合にのみ関連します。


2
standalone = "yes"を使用すると、追加の有効性制約が発生します(つまり、XMLドキュメントが無効になる可能性があります)。私はこれを答えに編集しました、それが大丈夫であることを願っています。
sleske 2017

2
@sleskeあなたの貢献に感謝します。あなたの要点をはっきりと述べながら、編集を簡略化しようとしました。間違えた場合は、もう一度編集してください。
リンケ


10

マークアップ宣言は、XMLプロセッサからアプリケーションに渡されるときに、ドキュメントのコンテンツに影響を与える可能性があります。例は属性のデフォルトとエンティティ宣言です。スタンドアロンドキュメント宣言は、XML宣言のコンポーネントとして表示される場合があり、ドキュメントエンティティの外部またはパラメータエンティティに表示されるような宣言があるかどうかを示します。[定義:外部マークアップ宣言は、外部サブセットまたはパラメーターエンティティで発生するマークアップ宣言として定義されます(外部または内部、後者は非検証プロセッサーがそれらを読み取る必要がないため含まれています)。

http://www.w3.org/TR/xml/#sec-rmd


12
どういう意味ですか?
ダンカーター2014年

4
これは中程度のQIで通常の人間が理解できる方法で記述される必要があるため、反対票を投じました。
Andrea Silvestri

8

standalone=yes宣言の目的は、ドキュメント内の情報が内部DTDのみに基づいて忠実に取得できることを保証することです。つまり、ドキュメントは外部参照なしで「スタンドアロン」であることができます。スタンドアロンドキュメントを検証すると、検証を行わないプロセッサが、ドキュメントを正しく解析するために利用できるすべての情報を確実に利用できるようになります。

スタンドアロン宣言は、ドキュメントに外部DTDがなく、内部DTDにパラメータエンティティ参照がない場合、これらのドキュメントはすでに暗黙的にスタンドアロンであるため、意味がありません。

を使用した実際の効果は次のとおりstandalone=yesです。

  • 文書に内部DTDで宣言されていないエンティティへの参照が含まれている場合、外部DTDまたはパラメータエンティティ参照を使用して文書を解析するときに、プロセッサにエラーをスローさせます(非検証プロセッサは必要ないため、パラメータエンティティの置換テキストを除きます)これを解析する); ampltgtapos、そしてquot唯一の例外です

  • スタンドアロンとして宣言されていないドキュメントを解析する場合、非検証プロセッサは、パラメータエンティティ参照に遭遇するとすぐに、内部DTDの解析を停止できます。ドキュメントをスタンドアロンとして宣言すると、1つ以上のパラメーターエンティティの参照を無視した後でも、検証されていないプロセッサが内部DTDのマークアップ宣言を解析します。

  • ドキュメントで次のいずれかが見つかり、それぞれの宣言が外部DTDまたはパラメーターエンティティの置換テキストにある場合、検証プロセッサーにエラーをスローさせます。

    • デフォルト値を持つ属性(明示的に指定された値がない場合)
    • 実体参照(以外のampltgtapos、及びquot
    • トークン化されたタイプの属性(属性の値が正規化によって変更される場合)
    • 要素コンテンツを持つ要素(コンテンツに空白が含まれている場合)

非検証プロセッサは、スタンドアロンではないドキュメントの外部DTDを取得し、すべてのパラメータエンティティ参照を展開することを検討する場合があります。ただし、スタンドアロンではないため、設定standalone=yesによって非検証プロセッサのパフォーマンスが理論的に向上する可能性があります(ネタバレ警告:おそらく違いはありません)。


ここでの他の答えは不完全または不正確です。主な誤解は、

スタンドアロン宣言は、DTD内のマークアップ宣言を無視するようにパーサーに指示する方法です。その後、DTDは検証のみに使用されます。

standalone = "yes"は、XMLプロセッサーが検証のみにDTDを使用する必要があることを意味します。

まったく逆に、ドキュメントをスタンドアロンとして宣言すると、実際には検証されないプロセッサが通常無視する必要がある内部宣言(つまり、無視されたパラメーターエンティティ参照の後の宣言)を解析するよう強制されます。これは検証とは独立しているため、非検証プロセッサーは、内部DTDの情報を使用して、デフォルトの属性値を提供し、トークン化された属性を正規化する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.