Что означает автономная директива в XML?

272

Что означает standaloneдиректива в документе XML?

Ник
источник

Ответы:

203

standaloneДекларация представляет собой способ сказать парсер игнорировать любые объявления разметки в DTD . После этого DTD используется только для проверки.

В качестве примера рассмотрим скромный <img>тег. Если вы посмотрите на DTD XHTML 1.0 , вы увидите объявление разметки, сообщающее парсеру, что <img>теги должны быть ПУСТОЙ, обладать srcи иметь altатрибуты. Когда браузер просматривает документ XHTML 1.0 и находит <img>тег, он должен заметить, что DTD требует srcи altатрибуты, и добавить их, если их нет. Он также сам закроет <img>тег, поскольку он должен быть ПУСТОЙ. Это то, что спецификация XML подразумевает под «объявлениями разметки, которые могут повлиять на содержимое документа». Затем вы можете использовать standaloneобъявление, чтобы сказать парсеру игнорировать эти правила.

Действительно ли это делает ваш парсер, это другой вопрос, но должен соответствовать стандартизированный валидатор (например, браузер).

Обратите внимание, что если вы не укажете DTD, то автономное объявление «не имеет смысла», поэтому нет смысла использовать его, если вы также не укажете DTD.

допустимость пустых
источник
9
Пример нуждается в дальнейшей модификации. Наличие "standalone = 'no'" обычно не закрывает закрытые теги XML (это особенность SGML, но не XML). Проверка не удастся. Он также не предоставит значения для атрибутов, которые ОБЯЗАТЕЛЬНЫ.
хаемуасет
2
«Автономное объявление - это способ сказать парсеру игнорировать любые объявления разметки в DTD.» Это не правильно. При этом standalone=yesобъявления разметки не игнорируются, вместо этого они приводят к тому, что документ является недействительным XML. Вы не против, если я отредактирую это в ответе?
слеске
@Sleske Пожалуйста, просто внесите изменения. Автор всегда может вернуться, если он / она не счастлив.
Стефан
@ Стефан: Спасибо за поддержку. К сожалению, я больше не в курсе всего XML-материала, поэтому я не могу с уверенностью редактировать прямо сейчас. Не стесняйтесь редактировать себя, если у вас есть современные знания :-).
слеске
106
  • Автономная директива является необязательным атрибутом в декларации XML.
  • Допустимые значения: yesи no, где noэто значение по умолчанию.
  • Атрибут актуален только при использовании DTD . (Атрибут не имеет значения при использовании схемы вместо DTD.)
  • standalone="yes"означает, что процессор XML должен использовать DTD только для проверки. В этом случае он не будет использоваться для:
    • значения по умолчанию для атрибутов
    • объявления объекта
    • нормализация
  • Обратите внимание, что standalone="yes"могут добавить ограничения действительности, если документ использует внешний DTD. Когда документ содержит вещи, которые требуют модификации XML, такие как значения по умолчанию для атрибутов, и standalone="yes"используется, тогда документ недействителен .
  • standalone="yes" может помочь оптимизировать производительность обработки документов.

Источник: автономный псевдоатрибут релевантен, только если используется DTD

Rinke
источник
2
Использование standalone = "yes" приводит к дополнительным ограничениям достоверности (т. Е. Может привести к тому, что документ XML будет недействительным). Я отредактировал это в ответ, надеюсь, что все в порядке.
слеске
2
@Sleske Спасибо за ваш вклад. Я попытался упростить ваше редактирование, все же четко изложив вашу точку зрения. Не стесняйтесь редактировать снова, если я ошибся.
Ринке
20

standalone описывает, зависит ли текущий документ XML от внешнего объявления разметки.

W3C описывает свое назначение в «Расширяемом языке разметки (XML) 1.0 (пятое издание)»:

Стефан Гериг
источник
10

Объявления разметки могут влиять на содержимое документа, передаваемого из процессора XML в приложение; примерами являются атрибуты по умолчанию и объявления сущностей. Объявление отдельного документа, которое может появиться как компонент объявления XML, сигнализирует, существуют ли такие объявления, которые кажутся внешними по отношению к объекту документа или в объектах параметров. [Определение: внешнее объявление разметки определяется как объявление разметки, встречающееся во внешнем подмножестве или в объекте параметра (внешнем или внутреннем, последний включен, потому что не требующие проверки процессоры не обязаны их читать).]

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

Крис Дайвер
источник
12
Что это значит?
Дэн Картер
4
Я понизил голосование, так как это должно быть объяснено обычным людям со средним QI.
Андреа Сильвестри
9

Цель standalone=yesдекларации состоит в том, чтобы гарантировать, что информация внутри документа может быть достоверно извлечена только на основе внутреннего DTD, то есть документ может быть «автономным» без внешних ссылок. Проверка отдельного документа гарантирует, что у не проверяющих процессоров будет вся доступная информация для правильного анализа документа.

Автономное объявление не имеет смысла, если документ не имеет внешнего DTD, а внутреннее DTD не имеет ссылок на объекты параметров, поскольку эти документы уже неявно автономны.

Ниже приведены фактические последствия использования standalone=yes.

  • Заставляет обработчики выдавать ошибку при разборе документов с внешними DTD или ссылками на сущности параметров, если документ содержит ссылки на сущности, не объявленные во внутренней DTD (за исключением текста замены сущностей параметров, поскольку не требующие проверки процессоры не обязаны разбери это); amp, lt, gt, apos, И quotявляются единственными исключениями

  • При синтаксическом анализе документа, не объявленного как автономный, не проверяющий процессор может прекратить анализ внутреннего DTD, как только он обнаружит ссылку на объект параметра. Объявление документа как автономного заставляет не проверяющие процессоры анализировать объявления разметки во внутреннем DTD даже после того, как они игнорируют одну или несколько ссылок на сущности параметра.

  • Вынуждает процессоры проверки выдавать ошибку, если в документе обнаруживается любое из следующего, а их соответствующие объявления находятся во внешнем DTD или в тексте замены сущности параметра:

    • атрибуты со значениями по умолчанию, если их значения не указаны явно
    • ссылки на объекты (кроме amp, lt, gt, apos, и quot)
    • атрибуты с токенизированными типами, если значение атрибута будет изменено путем нормализации
    • элементы с содержимым элементов, если в их содержимом есть пробелы

Не проверяющий процессор может рассмотреть возможность извлечения внешнего DTD и расширения всех ссылок на сущности параметров для документов, которые не являются автономными, даже если он не обязан это делать, т. Е. Настройка standalone=yesможет теоретически улучшить производительность для не проверяющих процессоров (предупреждение от спойлера: это, вероятно, не будет иметь никакого значения).


Другие ответы здесь либо неполные, либо неправильные, основное заблуждение заключается в том, что

Автономное объявление - это способ сказать парсеру игнорировать любые объявления разметки в DTD. После этого DTD используется только для проверки.

standalone = "yes" означает, что процессор XML должен использовать DTD только для проверки.

Напротив, объявление документа как отдельного фактически вынуждает не проверяющий процессор анализировать внутренние объявления, которые он обычно должен игнорировать (т. Е. Те, что после игнорируемой ссылки на объект параметра). Не проверяющие процессоры должны по-прежнему использовать информацию во внутреннем DTD для предоставления значений атрибутов по умолчанию и нормализации токенизированных атрибутов, поскольку это не зависит от проверки.

user657267
источник