Що означає "окрема" директива у XML?


272

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

Відповіді:


203

standaloneДекларація являє собою спосіб сказати парсер ігнорувати будь-які оголошення розмітки в DTD . Згодом DTD використовується лише для перевірки.

Як приклад, розглянемо скромний <img>тег. Якщо ви подивитеся на XHTML 1.0 DTD , ви побачите декларацію розмітки, яка повідомляє аналізатору, що <img>теги повинні бути EMPTY, а також володіти srcта altатрибутами. Коли браузер переглядає документ XHTML 1.0 і знаходить <img>тег, він повинен помітити, що DTD вимагає srcі altатрибутів, і додавати їх, якщо їх немає. Він також самостійно закриє <img>тег, оскільки він повинен бути ВИПУСКОВО. Це те, що специфікація XML означає "декларації розмітки можуть впливати на зміст документа". Потім ви можете використовувати standaloneдекларацію, щоб сказати аналізатору ігнорувати ці правила.

Чи справді це робить ваш парсер чи ні, це вже інше питання, але стандартний валідаційний аналізатор (як браузер) повинен відповідати стандартам.

Зауважте, що якщо ви не вказуєте DTD, то окрема декларація "не має значення", тому немає ніяких причин використовувати її, якщо ви також не вказали DTD.


9
Приклад потребує подальшої модифікації. Маючи "standalone = 'no" ", зазвичай не закриваються незакриті теги XML (це особливість SGML, але не XML). Перевірка не вдасться. Він також не надаватиме значення для атрибутів, які ВИМОЖЕНІ.
khaemuaset

2
"Окреме оголошення - це спосіб сказати аналізатору ігнорувати будь-які декларації розмітки в DTD." Це невірно. З standalone=yes, декларації розмітки не ігноруються, натомість вони призводять до недійсного XML документа. Чи не заперечуєте, якщо я відредагую це у відповідь?
sleske

@sleske Будь ласка, просто внесіть зміни. Автор завжди може повернутися, якщо він не задоволений.
Стефан

@Stephan: Дякую за заохочення. На жаль, я більше не в курсі всіх матеріалів XML, тому зараз не можу впевнено редагувати. Ви можете редагувати себе, якщо ви маєте сучасні знання :-).
sleske

106
  • Автономна директива є необов'язковим атрибутом у декларації XML.
  • Дійсні значення є yesі no, де noце значення за замовчуванням.
  • Атрибут є релевантним лише тоді, коли використовується DTD . (Атрибут не має значення при використанні схеми замість DTD.)
  • standalone="yes"означає, що процесор XML повинен використовувати DTD лише для перевірки. У такому випадку він не буде використаний для:
    • значення за замовчуванням для атрибутів
    • декларації суб'єктів господарювання
    • нормалізація
  • Зверніть увагу, що standalone="yes"можуть додавати обмеження дійсності, якщо документ використовує зовнішній DTD. Коли документ містить речі, які потребували б модифікації XML, такі як значення за замовчуванням для атрибутів, і standalone="yes"використовується, тоді документ є недійсним .
  • standalone="yes" може допомогти оптимізувати ефективність обробки документів.

Джерело: Автономний псевдоатрибут є релевантним лише в тому випадку, якщо використовується DTD


2
Використання автономного = "так" спричиняє додаткові обмеження дійсності (тобто може призвести до недійсності документа XML). Я це відредагував у відповідь, сподіваюся, що це нормально.
sleske

2
@sleske Дякуємо за ваш внесок. Я намагався спростити ваше редагування, одночасно чітко викладаючи свою точку зору. Не соромтесь редагувати ще раз, якщо я помилився.
Рінке


10

Декларації розмітки можуть впливати на вміст документа, який передається з процесора XML в додаток; Прикладами є параметри за замовчуванням атрибутів та оголошення сутності. Автономне оголошення документа, яке може з'являтись як компонент декларації XML, сигналізує про те, чи є такі декларації, які з’являються зовні для об'єкта документа або в об'єктах параметрів. [Визначення: Декларація зовнішньої розмітки визначається як декларація розмітки, що виникає у зовнішньому підмножині або в об'єкті параметра (зовнішній або внутрішній; останні включаються через те, що процесорам, що не перевіряють, їх не потрібно читати).]

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


12
Що це означає?
дан картер

4
Я виступаю за те, щоб це було зроблено зрозумілим нормальним людям із середнім рівнем QI.
Андреа Сільвестрі

8

Намір 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 = "так" означає, що процесор XML повинен використовувати DTD лише для перевірки.

Зовсім навпаки, оголошення документа як автономного фактично змусить недійсний процесор аналізувати внутрішні декларації, які він зазвичай повинен ігнорувати (тобто ті, які мають після ігнорування посилання на сутність параметра). Процесори, що не підтверджують, все ще повинні використовувати інформацію у внутрішньому DTD для надання значень атрибутів за замовчуванням та нормалізації акетонів, що мають означення, оскільки це не залежить від перевірки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.