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

200

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

Теги:

5 ответов

146
Лучший ответ

Объявление standalone - это способ сообщить синтаксическому анализатору игнорировать любые объявления разметки в DTA . Затем DTD используется только для проверки.

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

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

Обратите внимание: если вы не укажете DTD, то автономная декларация "не имеет смысла" , поэтому нет причин использовать ее, если вы также не укажете DTD.

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

Источник: это удивительное объяснение

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

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

W3C описывает свою цель в "Расширяемый язык разметки (XML) 1.0 (пятое издание)":

12

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

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

  • 11
    Что это значит?
  • 3
    Я понизил голосование, так как это должно быть объяснено обычным людям со средним QI.
1

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

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

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

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

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

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

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

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


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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню