Que signifie la directive «autonome» en XML?

272

Que signifie la standalonedirective ' ' dans un document XML?

pseudo
la source

Réponses:

203

La standalonedéclaration est un moyen de dire à l'analyseur d'ignorer toutes les déclarations de balisage dans la DTD . La DTD est ensuite utilisée uniquement pour la validation.

Par exemple, considérons l'humble <img>tag. Si vous regardez la DTD XHTML 1.0 , vous voyez une déclaration de balisage indiquant à l'analyseur que les <img>balises doivent être vides et posséder srcet des altattributs. Lorsqu'un navigateur passe par un document XHTML 1.0 et trouve une <img>étiquette, il faut remarquer que la DTD exige srcet les altattributs et les ajouter si elles ne sont pas présents. Il fermera également automatiquement la <img>balise car elle est censée être VIDE. C'est ce que la spécification XML entend par «les déclarations de balisage peuvent affecter le contenu du document». Vous pouvez ensuite utiliser la standalonedéclaration pour dire à l'analyseur d'ignorer ces règles.

Que votre analyseur le fasse ou non est une autre question, mais un analyseur de validation conforme aux normes (comme un navigateur) devrait le faire.

Notez que si vous ne spécifiez pas de DTD, la déclaration autonome «n'a pas de sens», il n'y a donc aucune raison de l'utiliser à moins que vous ne spécifiiez également une DTD.

nullité
la source
9
L'exemple doit encore être modifié. Avoir "standalone = 'no'" ne fermerait normalement pas les balises XML non fermées (c'est une fonctionnalité de SGML, mais pas de XML). La validation échouera. Il ne fournira pas non plus de valeurs pour les attributs REQUIS.
khaemuaset
2
«La déclaration autonome est un moyen de dire à l'analyseur d'ignorer toutes les déclarations de balisage dans la DTD.» Ce n'est pas correct. Avec standalone=yes, les déclarations de balisage ne sont pas ignorées, au lieu de cela, elles entraînent un XML non valide. Cela vous dérangerait-il si je modifiais cela dans la réponse?
sleske
@sleske Veuillez juste faire le changement. L'auteur peut toujours revenir en arrière s'il n'est pas satisfait.
Stephan
@Stephan: Merci pour vos encouragements. Malheureusement, je ne suis plus au courant de tout le contenu XML, donc je ne peux pas modifier en toute confiance en ce moment. N'hésitez pas à vous modifier si vous avez des connaissances à jour :-).
sleske
106
  • La directive autonome est un attribut facultatif sur la déclaration XML.
  • Les valeurs valides sont yeset no, où noest la valeur par défaut.
  • L'attribut n'est pertinent que lorsqu'une DTD est utilisée. (L'attribut n'est pas pertinent lors de l'utilisation d'un schéma au lieu d'une DTD.)
  • standalone="yes"signifie que le processeur XML doit utiliser la DTD pour la validation uniquement. Dans ce cas, il ne sera pas utilisé pour:
    • valeurs par défaut des attributs
    • déclarations d'entité
    • normalisation
  • Notez que cela standalone="yes"peut ajouter des contraintes de validité si le document utilise une DTD externe. Lorsque le document contient des éléments qui nécessiteraient une modification du XML, tels que des valeurs par défaut pour les attributs, et standalone="yes"est utilisé, le document n'est pas valide .
  • standalone="yes" peut aider à optimiser les performances du traitement des documents.

Source: le pseudo-attribut autonome n'est pertinent que si une DTD est utilisée

Rinke
la source
2
L'utilisation de standalone = "yes" entraîne des contraintes de validité supplémentaires (c'est-à-dire que le document XML peut être invalide). J'ai édité ceci dans la réponse, j'espère que ça va.
sleske
2
@sleske Merci pour votre contribution. J'ai essayé de simplifier votre montage tout en exprimant clairement votre point. N'hésitez pas à modifier à nouveau si je me trompe.
Rinke
20

standalone décrit si le document XML actuel dépend d'une déclaration de balisage externe.

Le W3C décrit son objectif dans «Extensible Markup Language (XML) 1.0 (Fifth Edition)»:

Stefan Gehrig
la source
10

Les déclarations de balisage peuvent affecter le contenu du document, tel que transmis d'un processeur XML à une application; les exemples sont les valeurs par défaut des attributs et les déclarations d'entité. La déclaration de document autonome, qui peut apparaître comme un composant de la déclaration XML, signale s'il existe ou non de telles déclarations qui apparaissent à l'extérieur de l'entité de document ou dans des entités de paramètres. [Définition: Une déclaration de balisage externe est définie comme une déclaration de balisage se produisant dans le sous-ensemble externe ou dans une entité de paramètre (externe ou interne, cette dernière étant incluse car les processeurs non validants ne sont pas tenus de les lire).]

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

Chris Diver
la source
12
Qu'est-ce que ça veut dire?
dan carter
4
J'ai rétrogradé car cela devrait être mis d'une manière compréhensible pour les êtres humains normaux avec un QI moyen.
Andrea Silvestri
9

L'intention de la standalone=yesdéclaration est de garantir que les informations contenues dans le document peuvent être fidèlement récupérées uniquement sur la base de la DTD interne, c'est-à-dire que le document peut être "autonome" sans références externes. La validation d'un document autonome garantit que les processeurs non validants disposeront de toutes les informations pour analyser correctement le document.

La déclaration autonome ne sert à rien si un document n'a pas de DTD externe et que la DTD interne n'a pas de référence d'entité de paramètre, car ces documents sont déjà implicitement autonomes.

Voici les effets réels de l'utilisation standalone=yes.

  • Force les processeurs à générer une erreur lors de l'analyse des documents avec une DTD externe ou des références d'entité de paramètre, si le document contient des références à des entités non déclarées dans la DTD interne (à l'exception du texte de remplacement des entités de paramètre car les processeurs non validants ne sont pas tenus de analyser ceci); amp, lt, gt, aposEt quotsont les seules exceptions

  • Lors de l'analyse d'un document non déclaré comme autonome, un processeur non validant est libre d'arrêter l'analyse de la DTD interne dès qu'il rencontre une référence d'entité de paramètre. La déclaration d'un document comme autonome oblige les processeurs non validants à analyser les déclarations de balisage dans la DTD interne même après avoir ignoré une ou plusieurs références d'entité de paramètre.

  • Force les processeurs de validation à générer une erreur si l'un des éléments suivants se trouve dans le document et que leurs déclarations respectives se trouvent dans la DTD externe ou dans le texte de remplacement d'entité de paramètre:

    • des attributs avec des valeurs par défaut, s'ils n'ont pas leur valeur explicitement fournie
    • références à des entités (autres que amp, lt, gt, aposet quot)
    • des attributs avec des types à jetons, si la valeur de l'attribut est modifiée par normalisation
    • éléments avec contenu d'élément, s'il y a un espace blanc dans leur contenu

Un processeur non validant pourrait envisager de récupérer la DTD externe et d'étendre toutes les références d'entité de paramètre pour les documents qui ne sont pas autonomes, même s'il n'est pas obligé de le faire, c'est-à-dire que le réglage standalone=yespourrait théoriquement améliorer les performances des processeurs non validants (alerte de spoiler: cela ne fera probablement pas de différence).


Les autres réponses ici sont soit incomplètes soit incorrectes, la principale idée fausse est que

La déclaration autonome est un moyen de dire à l'analyseur d'ignorer toutes les déclarations de balisage dans la DTD. La DTD est ensuite utilisée uniquement pour la validation.

standalone = "yes" signifie que le processeur XML doit utiliser la DTD pour la validation uniquement.

Au contraire, déclarer un document comme autonome forcera en fait un processeur non validant à analyser les déclarations internes qu'il doit normalement ignorer (c'est-à-dire celles après une référence d'entité de paramètre ignorée). Les processeurs non validants doivent toujours utiliser les informations de la DTD interne pour fournir des valeurs d'attribut par défaut et normaliser les attributs à jetons, car cela est indépendant de la validation.

user657267
la source