Cosa significa la direttiva "standalone" in XML?


272

Cosa significa la standalonedirettiva " " in un documento XML?

Risposte:


203

La standalonedichiarazione è un modo per dire al parser di ignorare qualsiasi dichiarazione di markup nel DTD . Successivamente il DTD viene utilizzato solo per la convalida.

Ad esempio, considera l'umile <img>tag. Se guardi il DTD XHTML 1.0 , vedi una dichiarazione di markup che dice al parser che i <img>tag devono essere VUOTI, possedere srce altattributi. Quando un browser sta attraversando un documento XHTML 1.0 e trova un <img>tag, dovrebbe notare che il DTD richiede srce gli altattributi e li aggiunge se non sono presenti. Chiuderà automaticamente il <img>tag poiché dovrebbe essere VUOTO. Questo è ciò che la specifica XML intende per "dichiarazioni di markup possono influenzare il contenuto del documento". È quindi possibile utilizzare la standalonedichiarazione per indicare al parser di ignorare queste regole.

Se il tuo parser lo fa effettivamente è un'altra domanda, ma dovrebbe essere un parser di convalida conforme agli standard (come un browser).

Nota che se non specifichi un DTD, la dichiarazione autonoma "non ha significato", quindi non c'è motivo di usarlo se non specifichi anche un DTD.


9
L'esempio necessita di ulteriori modifiche. Avere "standalone = 'no'" normalmente non chiuderebbe tag XML non chiusi (questa è una caratteristica di SGML, ma non di XML). La convalida fallirà. Non fornirà nemmeno valori per gli attributi NECESSARI.
Khaemuaset,

2
"La dichiarazione autonoma è un modo per dire al parser di ignorare qualsiasi dichiarazione di markup nel DTD." Non è corretto. Con standalone=yes, le dichiarazioni di markup non vengono ignorate, ma causano XML non valido del documento. Ti dispiacerebbe se lo modificassi nella risposta?
sleske,

@sleske Per favore apporta la modifica. L'autore può sempre tornare indietro se non è felice.
Stephan,

@Stephan: Grazie per l'incoraggiamento. Sfortunatamente, non sono più aggiornato su tutto il materiale XML, quindi non posso modificare con sicurezza in questo momento. Sentiti libero di modificarti se hai una conoscenza aggiornata :-).
sleske,

106
  • La direttiva autonoma è un attributo facoltativo sulla dichiarazione XML.
  • I valori validi sono yese no, dove si notrova il valore predefinito.
  • L'attributo è rilevante solo quando viene utilizzato un DTD . (L'attributo è irrilevante quando si utilizza uno schema anziché un DTD.)
  • standalone="yes"significa che il processore XML deve usare il DTD solo per la validazione. In questo caso sarà non essere utilizzato per:
    • valori predefiniti per gli attributi
    • dichiarazioni di entità
    • normalizzazione
  • Si noti che è standalone="yes"possibile aggiungere vincoli di validità se il documento utilizza un DTD esterno. Quando il documento contiene elementi che richiedono la modifica dell'XML, come i valori predefiniti per gli attributi, e standalone="yes"viene utilizzato, il documento non è valido .
  • standalone="yes" può aiutare a ottimizzare le prestazioni dell'elaborazione dei documenti.

Fonte: lo pseudo-attributo autonomo è rilevante solo se si utilizza un DTD


2
L'uso di standalone = "yes" comporta ulteriori vincoli di validità (vale a dire che un documento XML potrebbe non essere valido). Ho modificato questo nella risposta, spero che vada bene.
sleske,

2
@sleske Grazie per il tuo contributo. Ho cercato di semplificare la tua modifica pur affermando chiaramente il tuo punto. Sentiti libero di modificare di nuovo se ho sbagliato.
Rinke


10

Le dichiarazioni di markup possono influire sul contenuto del documento, trasmesso da un processore XML a un'applicazione; esempi sono le impostazioni predefinite degli attributi e le dichiarazioni di entità. La dichiarazione del documento autonomo, che può apparire come un componente della dichiarazione XML, segnala se ci sono o meno tali dichiarazioni che appaiono esterne all'entità del documento o nelle entità dei parametri. [Definizione: una dichiarazione di markup esterna è definita come una dichiarazione di markup che si verifica nel sottoinsieme esterno o in un'entità parametro (esterna o interna, quest'ultima inclusa perché i processori non validanti non sono tenuti a leggerli).]

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


12
Cosa significa?
Dan Carter,

4
Ho annullato il voto poiché questo dovrebbe essere messo in un modo comprensibile agli esseri umani normali con QI medio.
Andrea Silvestri,

8

L'intento del standalone=yes dichiarazione è di garantire che le informazioni contenute nel documento possano essere recuperate fedelmente in base al solo DTD interno, vale a dire che il documento può "essere autonomo" senza riferimenti esterni. La convalida di un documento autonomo garantisce che i processori non convalidanti dispongano di tutte le informazioni disponibili per analizzare correttamente il documento.

La dichiarazione autonoma non serve a nulla se un documento non ha DTD esterno e il DTD interno non ha riferimenti a entità parametro, poiché questi documenti sono già implicitamente autonomi.

Di seguito sono riportati gli effetti reali dell'utilizzo standalone=yes.

  • Obbliga i processori a generare un errore durante l'analisi dei documenti con un DTD esterno o riferimenti a entità parametro, se il documento contiene riferimenti a entità non dichiarate nel DTD interno (ad eccezione del testo sostitutivo di entità parametro in quanto i processori non validanti non sono tenuti a analizzalo); amp, lt, gt, apos, E quotsono le uniche eccezioni

  • Quando analizza un documento non dichiarato come autonomo, un processore non convalidante è libero di interrompere l'analisi del DTD interno non appena incontra un riferimento all'entità parametro. La dichiarazione di un documento come autonoma impone ai processori non convalidanti di analizzare le dichiarazioni di markup nel DTD interno anche dopo aver ignorato uno o più riferimenti di entità parametro.

  • Forza i processori di convalida a generare un errore se nel documento viene rilevata una delle seguenti condizioni e le rispettive dichiarazioni si trovano nel DTD esterno o nel testo di sostituzione dell'entità parametro:

    • attributi con valori predefiniti, se non hanno il loro valore fornito esplicitamente
    • riferimenti ad entità (diverse da quelle amp, lt, gt, apos, e quot)
    • attributi con tipi tokenizzati, se il valore dell'attributo verrebbe modificato dalla normalizzazione
    • elementi con contenuto di elementi, se si verifica uno spazio bianco nel loro contenuto

Un processore non convalidante potrebbe prendere in considerazione il recupero del DTD esterno e l'espansione di tutti i riferimenti di entità parametro per i documenti che non sono autonomi, anche se non è obbligatorio farlo, ad esempio l'impostazione standalone=yespotrebbe teoricamente migliorare le prestazioni per i processori non validanti (avviso spoiler: probabilmente non farà differenza).


Le altre risposte qui sono incomplete o errate, il malinteso principale è quello

La dichiarazione autonoma è un modo per dire al parser di ignorare qualsiasi dichiarazione di markup nel DTD. Successivamente il DTD viene utilizzato solo per la convalida.

standalone = "yes" significa che il processore XML deve utilizzare il DTD solo per la convalida.

Al contrario, la dichiarazione di un documento come autonomo costringerà effettivamente un processore non convalidante a analizzare le dichiarazioni interne che normalmente deve ignorare (cioè quelle dopo un riferimento di entità parametro ignorato). I processori non convalidanti devono comunque utilizzare le informazioni nel DTD interno per fornire i valori degli attributi predefiniti e normalizzare gli attributi tokenizzati, poiché questo è indipendente dalla convalida.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.