[an error occurred while processing this directive]
Данный документ представляет собой перевод спецификации Extensible Markup Language (XML) 1.0
(Second Edition) (W3C Recommendation) на русский язык. При этом нормативным документом
считается оригинальная спецификация на английском языке, которую можно найти по адресу
Представленный документ может содержать ошибки перевода. |
Copyright © 2000 W3C® (MIT, INRIA, Keio), Все права защищены. В отношении данного документа действуют правила W3C, касающиеся обязательств, торговой марки, использования документа и лицензирования программного обеспечения.
Расширяемый язык разметки (The Extensible Markup Language, XML) - подмножество SGML, целиком описанное в представленном документе. Язык должен дать возможность передавать, получать и обрабатывать в Web общие документы SGML так же, как сейчас это можно делать с документами HTML. Язык XML спроектирован так, чтобы упростить реализацию и обеспечить взаимодействие SGML и HTML.
Данный документ был рассмотрен членами W3C, другими заинтересованными сторонами и был утвержден Директором в качестве рекомендации от W3C. Документ является окончательным и его можно использовать как материал для ссылки или цитировать в других документах в качестве стандарта. Участие W3C в разработке этой спецификации заключается в привлечении к ней внимания и содействии ее широкому распространению. Принятие стандарта способствует наращиванию функциональных возможностей и повышению уровня взаимодействия в Сети.
В данном документе формулируется синтаксис, пригодный для использования в World Wide Web и построенный как подмножество уже имеющегося и широко используемого международного стандарта обработки текстов (Standard Generalized Markup Language, SGML, ISO 8879:1986(E) улучшенного и исправленного). Данный документ является результатом работ по проекту W3C XML Activity, детальное описание которого можно найти по адресу http://www.w3.org/XML/. Нормативную силу имеет только английская версия спецификации, однако по адресу http://www.w3.org/XML/#trans можно найти перевод этого документа на другие языки. На странице http://www.w3.org/TR/ можно найти перечень текущих рекомендаций W3C и других технических документов.
Вторая редакция не является новой версией языка XML (первая была опубликована 10 февраля 1998 года). Она всего лишь учитывает изменения, продиктованные удобством читателей и выявленными ошибками (которые можно увидеть по адресу http://www.w3.org/XML/xml-19980210-errata). Перечень ошибок, обнаруженных во второй версии спецификации, можно увидеть по адресу http://www.w3.org/XML/xml-V10-2e-errata.
Об ошибках, обнаруженных в данном документе, просьба сообщать по адресу xml-editor@w3.org; Доступен архив переписки.
Замечание:
Со времени публикации первой редакции C. M. Sperberg-McQueen поменял место работы. Теперь он работает в World Wide Web Consortium и с ним можно связаться по адресу cmsmcq@w3.org.
1 Введение
1.1 Возникновение языка XML и его задачи
1.2 Терминология
2 Документы
2.1 Корректные XML документы
2.2 Символы
2.3 Общие синтаксические конструкции
2.4 Символьные данные и разметка
2.5 Комментарии
2.6 Инструкции обработки
2.7 Секции CDATA
2.8 Пролог и декларация типа документа
2.9 Декларация одиночного документа
2.10 Обработка пробельных символов
2.11 Обработка концов строк
2.12 Идентификация языка
3 Логические структуры
3.1 Начальные тэги, конечные тэги и тэги пустых элементов
3.2 Декларации типа элемента
3.2.1 Содержимое элемента
3.2.2 Смешанный контент
3.3 Декларации списков атрибутов
3.3.1 Типы атрибутов
3.3.2 Значения атрибутов по умолчанию
3.3.3 Нормализация значения атрибута
3.4 Условные секции
4 Физические структуры
4.1 Ссылки на символ и сущность
4.2 Декларации сущности
4.2.1 Внутренние сущности
4.2.2 Внешние сущности
4.3 Разобранные сущности
4.3.1 Декларация текста
4.3.2 Корректные разобранные сущности
4.3.3 Кодирование символов в сущностях
4.4 Обработка XML процессором сущностей и ссылок
4.4.1 Не распознается
4.4.2 Включается
4.4.3 Включается при проверке
4.4.4 Запрещен
4.4.5 Включается как строка
4.4.6 Уведомление
4.4.7 Пропускается
4.4.8 Включается как сущность параметра
4.5 Построение текста замены для внутренней сущности
4.6 Предопределенные сущности
4.7 Декларирование нотаций
4.8 Сущность документа
5 Соответствие
5.1 Проверяющие и непроверяющие процессоры
5.2 Использование XML процессоров
6 Нотация
A Ссылки
A.1 Нормативные ссылки
A.2 Остальные ссылки
B Классы символов
C XML и SGML (Пояснения к спецификации)
D Обработка ссылок на сущность и символ (Пояснения к спецификации)
E Детерминистические модели содержания (Пояснения к спецификации)
F Автоматическое определение кодировки символов (Пояснения к спецификации)
F.1 Определение без внешней информации о кодировке
F.2 Приоритеты при наличии внешней информации о кодировке
G Рабочая группа W3C XML (Пояснения к спецификации)
H Основная группа W3C XML (Пояснения к спецификации)
I Рабочие заметки (Пояснения к спецификации)
J Словарь (Пояснения к спецификации) |
Расширяемый язык разметки (Extensible Markup Language, аббревиатура - XML) описывает класс объектов XML document, а также частично описывает работу компьютерных программ, обрабатывающих объекты с данными, реализующими этот класс. XML - это прикладной уровень или усеченная форма SGML, Стандартного Обобщенного языка разметки [ISO 8879]. По своему построению, XML документ является полноценным SGML документом.
XML документы состоят из единиц размещения, называемых сущностями, которые содержат разобранные или неразобранные данные. Разобранные данные состоят из набора символов, часть которых образуют символьные данные, часть - разметку. Разметка образует описание схемы размещения и логической структуры документа. Язык XML дает механизм создания ограничений для указанной схемы размещения и логической структуры.
[Определение: Для чтения XML документа, доступа к его содержимому и структуре используется программный модуль, называемый XML процессором.] [Определение: Предполагается, что XML процессор выполняет свою работу по заданию другого модуля, называемого приложением.] Данная спецификация формулирует требования к работе XML процессора, указывая как именно он должен читать данные XML и какую информацию в результате он должен предоставить приложению.
Язык XML был разработан группой XML Working Group (первоначально называемой SGML Editorial Review Board), сформированной в 1996 году под патронажем World Wide Web Consortium (W3C). Председательствует в группе Jon Bosak из Sun Microsystems, принимающий также активное участие в работе группы XML Special Interest Group (ранее известной как SGML Working Group), которая тоже была сформирована W3C. Список членов XML Working Group представлен в Приложении. Связь группы с W3C обеспечивает Dan Connolly.
При разработке языка XML ставились следующие задачи:
XML должен быть пригоден для непосредственного использования в Интернет.
XML должен иметь широкий круг применения.
XML должен быть совместим с SGML.
Обработчики документов XML должны быть просты в написании.
Количество факультативных свойств в XML должно быть сведено к абсолютному минимуму, в идеале число их вообще должно быть нулевым.
XML документы должны быть удобны для чтения и достаточно понятны.
Подготовка XML документа должна осуществляться быстро.
Процедура построения XML документа должна быть формальной и точной.
Процедура создания XML документов должна быть проста.
Краткость при разметке XML документа имеет минимальное значение.
Данная спецификация в сочетании с остальными связанными с нею стандартами (Unicode и ISO/IEC 10646 для символов, Internet RFC 1766 для тэгов идентификации языка, ISO 639 для кодов с названием языка и ISO 3166 для кодов с названием страны) дает всю необходимую информацию для понимания языка XML (версия 1.0) и создания компьютерных программ для его обработки.
Данная версия спецификации XML может распространяться свободно при условии, что весь текст и замечания правового характера остаются нетронутыми.
Терминология, используемая для описания XML документов, также дается в данной спецификации. При построении определений и описании функций XML процессора используются термины из следующего перечня:
[Определение: Документы и XML процессоры, отвечающие этому условию, могут, но не обязаны действовать именно так, как было описано.]
[Определение: Документы и XML процессоры обязаны действовать именно так, как было описано. В противном случае имеет место ошибка.]
[Определение: Отступление от правил данной спецификации, результат не определен. Программное обеспечение, отвечающее требованиям спецификации, может обнаруживать такую ошибку, сообщать о ней и обрабатывать ее.]
[Определение: Ошибка, которую XML процессор, отвечающий требованиям спецификации, должен зафиксировать и сообщить об этом приложению. После обнаружения фатальной ошибки процессор может продолжить обработку данных с тем, чтобы найти остальные ошибки и, возможно, сообщить о них приложению. Помогая обрабатывать ошибки, процессор может предоставить приложению доступ к необработанным материалам исходного документа (символьным данным и разметке). После обнаружения фатальной ошибки процессор должен приостановить нормальную обработку данных (то есть, он должен прекратить передачу приложению символьных данных и сведений о логической структуре документа обычным образом).]
[Определение: Программное обеспечение, отвечающее требованиям спецификации, может или должно (в зависимости от степени долженствования в предложении) поступать так, как было указано в спецификации. Если это сделано, пользователю должна быть предоставлена возможность разрешать или запрещать описанные действия.]
[Определение: Правило, относящееся ко всем действительным XML документам. Нарушение ограничения корректности классифицируется как ошибка, о которой (по выбору пользователя) должны сообщать проверяющие XML процессоры.]
[Определение: Правило, относящееся ко всем корректным XML документам. Нарушение ограничения корректности классифицируется как фатальная ошибка.]
[Определение: (Для строк или имен:) Две сравниваемые строки или имени должны быть идентичны. Символы с несколькими возможными представлениями в ISO/IEC 10646 (например, символы, имеющие обе формы представления precomposed и base+diacritic) считаются совпадающими только тогда, когда в обеих строках они имеют одну и ту же форму представления. Преобразование регистра не производится. (Для строк и правил грамматики:) Строка отвечает сценарию грамматики если она принадлежит языку, генерируемому по этому сценарию. (Для содержимого и моделей содержимого:) Элемент соответствует своей декларации если он отвечает положениям, описанным в соответствующем ограничении [VC: Действительный элемент].]
[Определение: Выделяет фразу, описывающую функцию языка XML, которая была включена в спецификацию исключительно для того, чтобы убедиться в том, что XML сохраняет совместимость с языком SGML.]
[Определение: Выделяет фразу, описывающую необязательную рекомендацию, которая была включена в спецификацию для увеличения возможности обработки XML документов с помощью уже установленных SGML процессоров, указанных в Приложении WebSGML Adaptations к ISO 8879.]
[Определение: Объект данных становится XML документом если, в соответствии с определениями обсуждаемой спецификации, он является корректным. Корректный XML документ также может стать действительным, если отвечает некоторым дополнительным ограничениям.]
Каждый XML имеет логическую и физическую структуру. Физически документ состоит из элементов, называемых сущностями. Любая сущность может ссылаться на другие сущности, обеспечивая их включение в данный документ. Документ начинается с "корня" или сущности документа. С логической точки зрения, документ строится из деклараций, элементов, комментариев, ссылок на символ и инструкций обработки. Все они размечаются в документе явным образом. Логические и физические структуры должны иметь корректную вложенность, как было описано в главе 4.3.2 Корректные разобранные сущности.
[Определение: Текстовый объект становится корректным (well-formed) XML документом, если:]
как единое целое, он соответствует сценарию document.
отвечает всем ограничениям корректности, представленным в этой спецификации.
Все разобранные сущности, на которые в данном документе прямо или косвенно делается ссылка, являются корректными (well-formed).
Соответствие сценарию document подразумевает следующее:
В данном объекте содержится один или несколько элементов.
[Определение: В объекте имеется в точности один элемент, называемый корневым или элементом документа, ни одна из частей которого не попадает в содержимое какого-либо еще элемента.] Для всех остальных элементов действует правило, что если начальный тэг находится в содержимом некого элемента, то и конечный тэг должен находиться среди содержимого того же элемента. Проще говоря, элементы, маркируемые начальными и конечными тэгами, должны быть вложены друг в друга правильным образом.
[Определение: Из вышесказанного следует что в документе для любого некорневого элемента C
имеется другой элемент P
из этого же документа, такой что C
находится в содержимом P
, но при этом не попадает в содержимое какого-либо третьего элемента, также находящегося в содержимом элемента P
. В таком случае об элементе P
говорят как о родителе элемента C
, а элемент C
называют непосредственным потомком элемента P
.]
[Определение: Разобранная сущность (parsed entity) содержит текст - последовательности символов, образующие разметку и символьные данные.] [Определение: символ - это элементарная единица текста, описанная в ISO/IEC 10646 [ISO/IEC 10646] (см. также [ISO/IEC 10646-2000]). Допустимы символы табуляции, возврата каретки, конца строки, а также разрешенные символы из наборов Unicode и ISO/IEC 10646. Последние версии указанных стандартов, актуальные на момент подготовки данного документа, перечислены в Приложении A.1 Нормативные ссылки. Перечисленные стандарты могут быть дополнены новыми символами в ходе обновления или при написании для них новых редакций. Соответственно, XML процессоры должны принимать любой символ из диапазона, указанного для Char. Использовать "символы совместимости", описанные в главе 6.8 из [Unicode] (см. также D21 в главе 3.6 из [Unicode3]), нежелательно.]
Механизм шифрования символьных кодов использует битовые шаблоны, которые могут меняться от сущности к сущности. Все XML процессоры должны иметь возможность работать с кодировками UTF-8 и UTF-16 из набора 10646. Механизм для указания используемой кодировки и подключения новых кодировок обсуждается позднее в главе 4.3.3 Кодирование символов в сущностях.
В данной главе определяются некоторые символы, широко используемые в грамматике XML.
S (пробельный символ, white space) состоит из одного или нескольких символов пробела (#x20), возврата каретки, конца строки или табулятора.
Для удобства символы делятся на буквы, цифры и остальные символы. Буквы состоят из алфавитных, слоговых и идеографических символов. Полное определение конкретных символов из каждого класса дается в Приложении B Классы символов.
[Определение: Имя (name) - это лексема (token), начинающаяся с буквы, либо одного из нескольких символов пунктуации, за которыми следуют буквы, цифры, дефисы, символы подчеркивания, двоеточия или точки (все они называются name character - символами имени).] Имена, начинающиеся с комбинации "xml
" или какой-либо из строк, соответствующих шаблону (('X'|'x') ('M'|'m') ('L'|'l'))
, зарезервированы под стандартизацию в этой спецификации и ее последующих версиях.
Замечание:
Интерпретация имен, содержащих символ двоеточия, задается в документе Namespaces in XML Recommendation [XML Names]. Поэтому авторам не следует использовать символ двоеточия в именах XML, если это не связано с обращением к пространству имен. Вместе с тем, сами XML процессоры должны воспринимать двоеточие в имени как обычный символ.
Nmtoken (лексема имени) - это произвольное сочетание символов имени.
Строковые данные (literal data) - это любая заключенная в кавычки строка, внутри которой нет кавычек, которые можно было бы принять за разделители этой строки. Строковые данные, или литералы (literals), применяются для указания содержимого внутренних сущностей (EntityValue), значений атрибутов (AttValue) и внешних идентификаторов (SystemLiteral). Заметим, что идентификатор SystemLiteral может быть обработан без проверки разметки.
Замечание:
Хотя сценарий EntityValue и позволяет определить сущность, состоящую из одного единственного простого символа <
в строке данных (имеется ввиду <!ENTITY mylt "<">
), настоятельно рекомендуется избегать подобной практики, поскольку любая ссылка на указанную сущность приведет к появлению ошибки корректности.
Текст документа образуется сочетанием символьных данных и разметки. [Определение: Разметка принимает форму начальных тэгов, конечных тэгов, тэгов пустых элементов, ссылок на сущности, ссылок на символы, комментариев, разделителей секций CDATA, объявлений типов документов, инструкций обработки, деклараций XML, деклараций текста и любых пробельных символов, которые располагаются на верхнем уровне сущности документа (то есть, вне элемента document и за пределами иных элементов разметки).]
[Определение: Текст, который не относится к разметке, формирует символьные данные документа (character data).]
Символ амперсанта (&) и левая угловая скобка (<) могут появиться в своем обычном текстовом виде только в том случае, если используются в качестве ограничителя разметки, либо находятся в пределах комментария, инструкции обработки или секции CDATA. Если же эти символы потребовались в документе где-либо еще, их следует маскировать, воспользовавшись для этого либо соответствующей числовой ссылкой на символ (numeric character reference), либо строками "&
" и "<
" соответственно. Правая угловая скобка (>) может быть представлена в виде строки ">
". Кроме того, если правая угловая скобка в содержимом элемента попадает в комбинацию символов "]]>
", которая не соответствует окончанию секции CDATA, то, в целях совместимости, эту скобку необходимо заменить ссылкой на символ либо комбинацией ">
".
Символьные данные в содержимом элемента - это любая строка символов, которая не содержит начальных ограничителей какой-либо разметки. Символьные данные в секции CDATA - это любая строка символов, которая не содержит закрывающего ограничителя секции CDATA (комбинации символов "]]>
").
Если в значение атрибута необходимо поместить символ одинарной или двойной кавычки, то апостроф или символ одинарной кавычки (') следует представить комбинацией "'
", а символ двойной кавычки (") - как ""
".
[
Определение:
Комментарий может размещаться в любом месте документа при условии, что он не попадает в границы какого-либо элемента разметки. Комментаций может также появляться в тех местах декларации типа документа, где это разрешено грамматикой. Комментарии не относятся к символьным данным документа, однако XML процессоры могут (но не обязаны) передавать приложению текст полученных комментариев. Для сохранения совместимости, в комментарии не следует пользоваться комбинацей символов "--
" (двойной дефис).] Ссылка на сущность параметра в комментариях не распознается.
Пример комментария:
Заметим, что, согласно требованиям обсуждаемой грамматики, комментарий не может завершаться комбинацией символов --->
. Поэтому следующий пример корректным уже не будет.
[Определение: Инструкции обработки (processing instruction, PI) позволяют размещать в документе инструкции для приложений.]
Хотя PI не относятся к символьным данным документа, они точно так же должны быть переданы приложению. Инструкция PI начинается с указания адреса (PITarget), используемого для идентификации приложения, которому предназначается эта инструкция. Адреса с названиями "XML
", "xml
" и аналогичными зарезервированы для стандартизации в текущей и последующих версиях спецификации. Для формального декларирования адресата инструкции PI может использоваться механизм нотаций XML. Ссылки на сущность параметра в инструкциях обработки не распознаются.
[Определение:
Секция CDATA может находиться повсюду, где могут размещаться символьные данные. Использование секции CDATA позволяет избежать обработки блока текста, содержащего символы, которые в других случаях распознавались бы как разметка. Секция CDATA начинается со строки "<![CDATA[
" и заканчивается строкой "]]>
":]
В секции CDATA распознается только один элемент разметки - строка CDEnd. Поэтому все символы левой угловой скобки и амперсанта могут предстать здесь в своем обычном текстовом виде. Эти символы не нужно (да и невозможно) маскировать с помощью комбинаций "<
" и "&
". Секции CDATA не могут быть вложенными.
Пример секции CDATA, в которой строки "<greeting>
" и "</greeting>
" будут распознаваться не как разметка, а как обычные символьные данные:
[Определение: Документ XML должен начинаться с декларации XML, указывающей версию используемого языка XML.] Например, в следующем примере представлен полноценный XML документ, корректный, но недействительный:
таким образом, имеем:
Для обозначения совместимости с данной версией спецификации, необходимо указывать номер версии "1.0
". Если в документе используется значение "1.0
", но он не отвечает требованиям данной версии спецификации, это будет ошибкой. Выбор номера для тех версий спецификации XML, которые последуют за "1.0
", остается за рабочей группой по XML, однако это не подразумевает что она обязуется разработать новые версии языка XML или придерживаться какой-либо конкретной схемы при их нумерации, если таковые будут созданы. Поскольку появление новых версий не исключается, то принятие упомянутой схемы нумерации позволило бы реализовать автоматическое распознавание версии, которое должно стать необходимым. Если получен документ с меткой о версии, которую процессор не в состоянии поддерживать, последний может сигнализировать об ошибке.
Задачей разметки XML документа должно быть описание схемы его размещения и логической структуры, а также связывание пар атрибут-значение с их логической структурой. XML предоставляет механизм для определения логических ограничений для логической структуры и формирования предопределенных единиц размещения - декларацию типа документа. [Определение: XML документ является действительным, если с ним связана декларация типа документа и если этот документ отвечает представленным в ней ограничениям.]
Декларация типа должна располагаться в документе до первого элемента.
[Определение: В языке XML декларация типа документа либо сама содержит, либо ссылается на декларации разметки, которые определяют грамматику некого класса документов. Такую грамматику называют декларацией типа документа, или DTD (document type definition). Декларация типа документа может ссылаться на внешний набор, который также содержит декларацию разметки (специальный тип - внешняя сущность), может содержать свой внутренний набор деклараций разметки, а может сочетать оба варианта. DTD документа формируется из обоих этих наборов, обрабатываемых совместно.]
[Определение: Декларация разметки - это декларация типа документа, декларация списка атрибутов, декларация сущности или декларация нотации.] Перечисленные декларации могут целиком, либо частично располагаться в сущности параметра в соответствии с приводимыми далее ограничениями корректности и действительности. Дальнейшие подробности см. в главе 4 Физические структуры.
Отметим, что можно создать корректный документ, который включал бы doctypedecl, не ссылающийся на внешний набор деклараций и не содержащий своего внутреннего набора.
Декларации разметки могут полностью или частично состоять из текста замены для сущностей параметров. Сценарии, приводимые далее в спецификации для конкретных неграничных элементов (elementdecl, AttlistDecl и так далее), описывают декларации уже после подстановки всех сущностей параметров.
Ссылка на сущность параметра распознается в любом месте DTD (внутреннем и внешнем наборах, внешних сущностях параметров) за исключением текстовых данных, инструкций обработки, комментариев и содержимого игнорируемых условных секций (см. главу 3.4 Условные секции). Распознается она также и в тексте значения сущности. Использование сущностей параметров во внутреннем наборе деклараций подчиняется следующим ограничениям:
Ограничение действительности: тип корневого элемента
Параметр Name в декларации типа документа должен соответствовать типу корневого элемента.
Ограничение действительности: Правильная декларация/вложенность сущности параметра
Текст замены для сущности параметра должен быть правильным образом вложен в декларации разметки. Иначе говоря, если первый или последний символ декларации разметки (см. выше markupdecl) находится в тексте замены для ссылки на сущность параметра, то в этом тексте должен находиться и второй из указанных символов.
Ограничение корректности: Сущности параметров во внутреннем наборе
Во внутреннем наборе DTD ссылка на сущность параметра может появляться только в тех местах, где могут расположиться декларации разметки, но не в самой декларации разметки. (Это не относится к ссылкам во внешних сущностях параметров или во внешнем наборе.)
Ограничение корректности: Внешний набор
Внешний набор, если таковой имеется, должен соответствовать сценарию для extSubset.
Ограничение корректности: Сущность параметра между декларациями
Текст замены для ссылки на сущность параметра в DeclSep должен соответствовать сценарию extSubsetDecl.
Вслед за внутренним набором, внешний набор и любые внешние сущности параметров, на которые делается ссылка в DeclSep, должны состоять из полных наборов деклараций разметки для типов, которые разрешены неграничным символом markupdecl, в сочетании с пробельными символами и ссылками на сущности параметров. При этом отдельные фрагменты содержимого внешнего набора или сущностей внешних параметров при определенных условиях могут игнорироваться в случае построения условных секций. Во внутреннем наборе использовать такие секции не разрешается.
Внешний набор и внешние сущности параметров отличаются от внутреннего набора также и тем, что для них ссылка на сущность параметра может появляться не только в интервалах между декларациями разметки, но и в границах самих этих деклараций.
Пример XML документа с декларацией типа документа:
Системный идентификатор "hello.dtd
" указывает адрес DTD этого документа (ссылку URI).
Декларации также могут быть представлены локально, как это делается в следующем примере:
Если используются и внешний, и внутренний наборы деклараций, то внутренний набор рассматривается прежде внешнего. Как следствие этого, декларации сущностей и списка атрибутов во внутреннем наборе имеют приоритет над аналогичными декларациями во внешнем наборе.
Декларации разметки, которые XML процессор передает приложению, могут оказывать влияние на содержимое документа. Примером могут служить атрибуты по умолчанию и декларации сущностей. Декларация одиночного документа, которая может быть представлена в составе XML декларации, указывает, могут ли возникать декларации в сущностях параметров, а также декларации, внешние по отношению к сущности документа. [Определение: Внешняя декларация разметки определяется как декларация разметки, встретившаяся во внешнем наборе или в сущности параметра (внешней или внутренней, последний вариант был включен в спецификацию только потому, что непроверяющие процессоры читать их не обязаны).]
Значение "yes" в декларации одиночного документа говорит об отсутствии внешних деклараций разметки, которые оказывали бы влияние на информацию, которую XML процессор передает приложению. Значение "no" указывает на то, что такие внешние декларации разметки имеются, либо могут быть появиться. Заметим, что декларация одиночного документа всего лишь свидетельствует о присутствии внешних деклараций. Наличие же в документе ссылок на внешние сущности, если последние уже были декларированы в самом документе, статуса одиночного документа не отменяет.
Если внешние декларации разметки отсутствуют, то декларация одиночного документа теряет смысл. Если присутствуют внешние декларации разметки, но отсутствует декларация одиночного документа, подразумевается что она имеет значение "no".
Любой XML документ, для которого было указано standalone="no"
, может быть алгоритмическим путем приведен к одиночному документу, что может потребоваться для некоторых приложений, получающих данные по сети.
Ограничение действительности: Декларация одиночного документа
Декларация одиночного документа должна иметь значение "no", если какие-либо внешние декларации разметки включают декларацию для:
атрибутов со значением по умолчанию, если элементы, к которым эти атрибуты относятся, были представлены в документе без уточнения значений для указанных атрибутов,
сущностей (кроме amp
, lt
, gt
, apos
и quot
), если в документе встретились ссылки на эти сущности,
атрибутов со значением, подлежащим нормализации, если этот атрибут появился в документе со значением, которое в результате этой нормализации будет изменено,
типов элементов с содержимым, если в каком-либо экземпляре такого типа был обнаружен пробельный символ.
Пример декларации XML с декларированием одиночного документа:
В ходе редактирования XML документов часто бывает удобно воспользоваться "пробельными символами" (white space - пробелы, табуляторы и пустые строки) для выделения разметки для лучшей читаемости. Такие пробельные символы обычно не должны попадать в ту версию документа, которая передается в приложение. С другой стороны, часто встречаются "значимые" пробельные символы, которые должны быть оставлены в передаваемом документе, например если это стихи или исходный код программы.
XML процессор должен всегда передавать приложению все символы документа, не относящиеся к разметке. Проверяющий XML процессор дополнительно должен проинформировать приложение о том, какие из этих символов соответствуют пробельным символам в содержимом элемента.
К элементу может быть приставлен специальный атрибут, называемый xml:space
, для того чтобы показать, что пробельные символы в этом элементе должны быть сохранены. Если этот атрибут используется в действительных документах, то, как и любой другой, он должен быть декларирован. Будучи декларирован, он должен быть представлен как перечислимый тип, значениями которого являются одно или оба значения "default" и "preserve". Например:
Значение атрибута "default" говорит о том, что для данного элемента используется режим обработки пробельных символов, применяемый в приложениях по умолчанию. Значение "preserve" говорит о том, что приложения должны сохранить все пробельные символы. Декларированное таким образом правило относится ко всем элементам, находящимся среди содержимого того элемента, которому был назначен данный атрибут (при условии что это правило не было затем переопределено другим экземпляром атрибута xml:space
).
Считается что корневой элемент любого документа не имеет указаний о том, каким образом приложение будет обрабатывать пробелы, если для этого атрибута не было дано соответствующего значения и этот атрибут не был представлен среди значений по умолчанию.
Часто разобранные сущности XML, помещенные в компьютерные файлы, для удобства редактирования представляются в виде набора строк. В качестве разделителя для таких строк обычно используется некая комбинация символов возврата каретки (#xD) и конца строки (#xA).
Чтобы облегчить работу приложений, текст, который им передает XML процессор, должен быть таким, как если бы этот процессор при выводе перед обработкой нормализовал все концы строк во внешних разобранных сущностях (а также сущности самого документа). Осуществляться это должно путем замены последовательности из двух символов #xD #xA (а также одиночного #xD, за которым не следует #xA) одним символом #xA.
В ходе обработки документа часто бывает полезным идентифицировать, на каком из естественных или формальных языков он был записан. Для идентификации языка, который использовался при записи содержимого и значений атрибутов любого элемента, в документе может быть указан специальный атрибут с названием xml:lang
. Если этот атрибут используется в действительном документе, то, как и любой другой, он должен быть декларирован. Значением этого атрибута являются идентификаторы языков, определенные в документе [IETF RFC 1766] (Тэги для идентификации языков) или наследующих его стандартах IETF.
Замечание:
В [IETF RFC 1766] указанные тэги строятся из двухсимвольного кода языка, заданного в [ISO 639], двухсимвольного кода страны, определенного в [ISO 3166] или же языкового идентификатора, зарегистрированного в Internet Assigned Numbers Authority [IANA-LANGCODES]. Предполагается, что для идентификации языков, которые в настоящий момент не упомянуты в спецификации [ISO 639], стандарты, наследующие [IETF RFC 1766], будут дополнены трехсимвольными кодами.
(Сценарии грамматики с 33 по 38 изъяты из спецификации.)
Например:
Предполагается, что информация, представленная в xml:lang
, относится ко всем атрибутам и всему содержимому элемента, где этот атрибут был указан (при условии, что в содержимом этого элемента она не была затем переопределена новым экземпляром атрибута xml:lang
в другом элементе).
Простая декларация атрибута xml:lang
может иметь вид
Если это необходимо, для этого атрибута могут быть представлены значения по умолчанию. В сборнике французской поэзии (poem) для английских студентов, содержащем глоссарий (gloss) и пометки на английском языке (note), атрибут xml:lang
может быть декларирован следующим образом:
[Определение: Каждый XML документ содержит один или несколько элементов, границы каждого из которых обозначены либо парой начальный тэг - конечный тэг, либо (если это пустой элемент) тэгом пустого элемента. Каждый элемент имеет определенный тип, который идентифицируется по имени и иногда называется "общим идентификатором" этого элемента (generic identifier - GI), а также может иметь набор спецификаций к атрибутам.] Каждая спецификация атрибута содержит его имя и значение.
Данная спецификация не ограничивает семантику, порядок использования (за исключением синтаксиса), выбор имен для атрибутов и типов элементов. Ограничение заключается в том, что имена, чье начало соответствует шаблону (('X'|'x')('M'|'m')('L'|'l'))
, зарезервированы для стандартизации в текущей и последующих версиях данной спецификации.
Ограничение корректности: Соответствие типов элементов
Параметр Name в конечном тэге элемента должен соответствовать типу элемента в начальном тэге.
Ограничение действительности: Действительность элемента
Элемент считается действительным, если имеется декларация, соответствующая elementdecl, в которой параметр Name соответствует типу элемента, а также выполняется одно из следующих условий:
Декларация соответствует EMPTY, а элемент не имеет содержимого.
Декларация соответствует непосредственному потомку элемента, а последовательность его непосредственных элементов - потомков, принадлежит языку, генерируемому регулярным выражением в модели содержимого с необязательным пробельным символом (символами, соответствующими неграничному S) между начальным тэгом и первым из непосредственных элементов-потомков, между элементами-потомками, между последним элементом-потомком и закрывающим тэгом. Заметим, что в секция CDATA, содержащая лишь пробельный символ, не соответствуют нетерминальному S, а следовательно в указанных позициях появиться не может.
Декларация соответствует Mixed, а содержимое состоит из символьных данных и элементов-потомков, тип которых соответствует именам в модели содержимого.
Декларация соответствует ANY, и был декларирован тип всех элементов-потомков.
[Определение: Начало любого непустого XML элемента помечается начальным тэгом.]
Параметр Name в начальном и конечном тэгах определяет тип элемента. [Определение: Пара Name - AttValue называется спецификацией атрибута для данного элемента], [Определение: Параметр Name в каждой такой паре называется именем атрибута], а [Определение: содержимое поля AttValue - текст в одинарных ('
) или двойных ("
) кавычках - называется значением атрибута.] Заметим, что очередность появления спецификаций атрибутов в начальном тэге или тэге пустого элемента значения не имеет.
Ограничение корректности: Уникальность спецификации атрибута
В границах одного начального тэга (или тэга пустого элемента) одно и то же имя атрибута не может появляться более одного раза.
Ограничение действительности: Тип значения атрибута
Атрибут должен быть декларирован, его значение должно иметь тот тип, который был декларирован для него. (Описание типов атрибутов см. в главе 3.3 Декларации списков атрибутов.)
Ограничение корректности: Отсутствие ссылок на внешние сущности
Значение атрибута не может иметь содержать прямых или косвенных ссылок на внешние сущности.
Ограничение корректности: Отсутствие символов <
в значениях атрибута
Символ <
не может содержаться в тексте замены для сущностей, на которые в значении атрибута прямо или косвенно дается ссылка.
Пример начального тэга:
[Определение: Любой элемент, чье начало отмечено начальным тэгом, должен завершиться конечным тэгом, имя которого повторяет тип элемента, указанный в начальном тэге:]
Пример конечного тэга:
[Определение: Текст, заключенный между начальным и конечным тэгами, называется содержимым элемента:]
[Определение: Элемент без содержимого называется пустым элементом.] Пустой элемент может быть представлен либо в виде начального тэга, за которым сразу же следует конечный тэг, либо как тэг пустого элемента. [Определение: Тэг пустого элемента имеет специальный формат:]
Тэг пустого элемента может быть использован для любого элемента, не имеющего содержимого, независимо от того, был ли последний декларирован с ключевым словом EMPTY. В целях совместимости, тэг пустого элемента должен использоваться для элементов, которые были декларированы как EMPTY, и только для них.
Примеры пустых элементов:
Для достижения действительности, на структуру элементов в XML документе могут быть наложены ограничения в виде деклараций типов используемых элементов и списков атрибутов. Декларирование типа элемента накладывает ограничение на его содержание.
Декларация типа элемента часто конкретизирует тип его непосредственных потомков. По выбору пользователя, XML процессор может генерировать предупреждение если в декларации был упомянут тип элемента, для которого не было предоставлено соответствующей декларации, однако ошибочной эта ситуация не считается.
[Определение: Декларация типа элемента имеет вид:]
где параметр Name определяет декларируемый тип элемента.
Ограничение действительности: Уникальность декларации типа элемента
Ни один тип элемента не может быть декларирован более одного раза.
Примеры деклараций типа элемента:
[Определение: Тип элемента определяет содержимое элемента, если элементы указанного типа обязаны не иметь символьных данных, а только непосредственные элементы-потомки, которые могут отделяться друг от друга пробельными символами (символами, соответствующими неграничному S).] [Определение: В этом случае накладываемое на элемент ограничение содержит модель содержимого - простую грамматику, управляющую допустимыми типами непосредственных элементов-потомков и порядком, в котором им разрешено появляться.] Указанная грамматика строится из фрагментов содержания (cp), которые содержат название, списки выбора и последовательные списки фрагментов содержания:
где каждая запись Name - это тип элемента, который может выступить в роли непосредственного потомка. Любой фрагмент содержимого в списке выбора может быть помещен в содержимое элемента в то место, где согласно грамматике располагался соответствующий список выбора. Все фрагменты содержимого в последовательном списке должны быть вставлены в содержимое элемента и именно в том прядке, как они были представлены в исходном списке. Необязательный символ, следующий за именем (или списком), указывает, должен ли данный элемент (или фрагменты из данного списка) быть повторен один или более раз (+
), нуль или более раз (*
), либо нуль или один раз (?
). Отсутствие такого оператора означает, что данный элемент (или фрагмент) должен появиться ровно один раз. Представленный синтаксис и его значение те же самые, что используются в сценариях самой спецификации.
Содержимое элемента соответствует модели содержания тогда и только тогда, когда можно проследить способ его получения из этой модели в соответствии с операторами последовательности, выбора и повторения, а также такой, что каждый элемент в содержании соответствует типу элемента в модели содержания. Если какой-либо элемент в документе может быть сопоставлен нескольким типам элементов в модели содержания, то для сохранения совместимости процессор должен фиксировать ошибку. За дополнительной информацией обращайтесь к Приложению E Детерминистические модели содержания.
Ограничение действительности: Правильная вложенность Group/PE
Текст замены для сущности параметра должен иметь правильно вложенные группы скобок. Иными словами, если в конструкциях choice, seq или Mixed открывающая или закрывающая скобка была включена в текст замены для сущности параметра, то в этот текст должна попадать и вторая парная скобка.
Если в конструкциях choice, seq или Mixed обнаружена ссылка на сущность параметра, то, для совместимости, ее текст замены должен содержать хотя бы один символ, отличный от пробела. И ни первый, ни последний символ в тексте замены, отличный от пробела, не должен быть соединителем (|
или ,
).
Примеры моделей содержимого элемента:
[Определение: Какой-либо тип элемента имеет смешанный контент, если элементы этого типа могут содержать символьные данные, возможно чередуемые с элементами-потомками.] В таком случае ограничения модели могут касаться лишь типа непосредственных элементов-потомков, но не порядка их следования и количества экземпляров:
где параметр Name определяет тип элементов, которые могут быть использованы в роли непосредственных потомков. Ключевое слово #PCDATA исторически унаследовано от термина "parsed character data".
Ограничение действительности: Отсутствие дублирования типов
Одно и то же имя не может быть представлено в декларации смешанного контента более одного раза.
Примеры деклараций смешанного контента:
Атрибут используется для того, чтобы связать с элементом пару имя-значение. Спецификация атрибута может быт дана только в начальном тэге, либо тэге пустого элемента. Таким образом, сценарии ее обработки следует искать в главе 3.1 Начальные тэги, конечные тэги и тэги пустых элементов. Декларация списка атрибутов может быть использована для:
формирования перечня атрибутов, относящихся к определенному типу элементов.
ограничения по типу атрибутов.
формирования значений по умолчанию для атрибутов.
[Определение: для каждого атрибута, относящегося к элементам определенного типа, в соответствующей декларации списка атрибутов определяются имя, тип данных и, возможно, значение по умолчанию:]
В поле Name в правиле AttlistDecl указывается тип элемента. По выбору пользователя, XML процессор может генерировать предупреждение, если атрибуты, декларированные для такого типа элементов, сами декларированы не были, однако ошибкой такая ситуация не считается. Параметр Name в правиле AttDef соответствует имени описываемого атрибута.
Если для какого-либо из типов элементов было дано несколько деклараций AttlistDecl, то содержимое всех их суммируется. Если для некого типа элементов было дано несколько деклараций одного и того же атрибута, то использоваться должна только первая декларация, а все последующие будут игнорироваться. Для сохранения совместимости, авторы DTD могут придерживаться правила давать для любого типа элементов не более одной декларации списка атрибутов, не более одной декларации для каждого имени атрибута, представленного в декларации списка атрибутов и, по крайней мере, одну декларацию атрибута в каждой из деклараций списка атрибутов. В целях совместимости, XML процессор по выбору пользователя может генерировать предупреждение, если для какого-либо типа элементов было представлено более одной декларации списка атрибутов, или для какого-либо атрибута было представлено более одной декларации, однако описанные ситуации ошибочными не являются.
Все типы XML атрибутов делятся на три класса: строковый тип, набор символьных (tokenized) типов и перечислимые (enumerated) типы. Строковый тип может иметь в качестве значения одну строку. Символьные типы содержат различные лексические и семантические ограничения. Ограничения действительности, обсуждаемые в данной грамматике, начинают действовать после того, как значение атрибута было нормализовано в соответствии с описанием в главе 3.3 Декларации списков атрибутов.
Ограничение действительности: ID
Значения типа ID должны соответствовать сценарию для Name. Имя, соответствующее значению этого типа, должно появляться в XML документе не более одного раза. Иными словами, значения ID должны уникальным образом идентифицировать элементы, в которых они находятся.
Ограничение действительности: Один ID для каждого типа элементов
Любой тип элемента не может иметь более одного атрибута ID.
Ограничение действительности: Значение по умолчанию для атрибута ID
Для атрибута ID должно быть декларировано значение по умолчанию #IMPLIED или #REQUIRED.
Ограничение действительности: IDREF
Значения типа IDREF должны соответствовать сценарию Name, а значения типа IDREFS должны соответствовать Names. При этом каждое Name должно соответствовать значению атрибута ID в каком-либо элементе XML документа, то есть, значение IDREF должно соответствовать значению какого-либо из атрибутов ID.
Ограничение действительности: Имя сущности
Значения типа ENTITY должны соответствовать сценарию Name, значения типа ENTITIES должны соответствовать Names. Каждое Name при этом должно соответствовать названию одной из неразобранных сущностей, декларированных в DTD.
Ограничение действительности: Лексема имени
Значения типа NMTOKEN должны соответствовать сценарию Nmtoken, значения типа NMTOKENS должны соответствовать Nmtokens.
[Определение: Перечислимый атрибут может выбирать одно значение из перечня, предоставленного в декларации]. Существует два вида перечислимых типов:
Атрибут NOTATION идентифицирует нотацию, которая была декларирована в DTD вместе с ассоциированными с нею системными и/или общими (public) идентификаторами, и которую следует использовать для интерпретации элемента, в котором был указан данный атрибут.
Ограничение действительности: Атрибуты нотации
Значения указанного типа должны соответствовать одному из представленных в декларации названий нотации. Все названия нотаций в декларации в свою очередь также должны быть декларированы.
Ограничение действительности: Одна нотация для каждого типа элемента
Для типа элемента не может указываться более одного атрибута NOTATION.
Ограничение действительности: Отсутствие нотаций для пустого элемента
Для сохранения совместимости, для элемента, объявленного как EMPTY, атрибут типа NOTATION декларироваться не должен.
Ограничение действительности: Перечисление
Значения этого типа должны соответствовать одной из лексем Nmtoken, указанных в декларации.
Чтобы обеспечить взаимодействие, один и тот же Nmtoken должен появляться среди перечислимых типов атрибутов, относящихся к одному типу элементов, не более одного раза.
Декларация атрибута предоставляет сведения о том, обязательно ли присутствие в элементе данного атрибута и, если нет, то как XML процессор должен реагировать на отсутствие в документе декларированного атрибута.
Запись #REQUIRED в декларации атрибута означает, что этот атрибут должен присутствовать в элементе всегда, #IMPLIED означает, что значения по умолчанию для атрибута не предоставляется. [Определение: Если в декларации нет ни #REQUIRED, ни #IMPLIED, то значение AttValue содержит значение, декларированное по умолчанию. Ключевое слово #FIXED устанавливает, что данный атрибут обязан всегда иметь значение по умолчанию. Если было декларировано значение по умолчанию, то когда XML процессор не обнаруживает этого атрибута, он должен поступать так, словно атрибут присутствует и имеет значение, декларированное по умолчанию.]
Ограничение действительности: Обязательный атрибут
Если для атрибута декларировано по умолчанию ключевое слово #REQUIRED, то в декларации списка атрибутов этот атрибут должен быть указан во всех элементах указанного типа.
Ограничение действительности: Допустимость значения по умолчанию для атрибута
Декларированное значение по умолчанию должно отвечать всем лексическим ограничениям для декларируемого типа атрибута.
Ограничение действительности: Фиксированное значение атрибута по умолчанию
Если атрибут по умолчанию имеет значение, декларированное с ключевым словом #FIXED, то все экземпляры данного атрибута должны соответствовать этому значению по умолчанию.
Примеры деклараций списка атрибутов:
Перед передачей значения атрибута приложению или проверкой его корректности XML процессор должен выполнить нормализацию полученного значения атрибута по описанному далее алгоритму либо как-нибудь иначе, например передав это значение отдельному приложению, реализующему указанный алгоритм.
Все концы строк при выводе должны быть приведены к #xA, как было описано в главе 2.11 Обработка концов строк, поэтому остальная часть данного алгоритма оперирует текстом, уже нормализованным подобным образом.
Начинается с нормализованного значения, состоящего из пустой строки.
Для каждого символа, ссылки на сущность и ссылки на символ в ненормализованном значении атрибута, с первого до последнего, должны выполняться следующие действия:
Для ссылки на символ к нормализованное значение поместить символ, на который делалась ссылка.
Для ссылки на сущность над текстом замены для указанной сущности рекурсивно выполнять третий шаг обсуждаемого алгоритма.
В случае пробельного символа (#x20, #xD, #xA, #x9) в нормализованное значение помещать символ пробела (#x20).
Остальные символы просто помещать в нормализованное значение.
Если тип атрибута - не CDATA, то следующим шагом XML процессор должен обработать нормализованное значение атрибута, отбросив начальные и заключительные символы пробела (#x20), а также заменив любую встреченную последовательность пробелов (#x20) одним символом пробела (#x20).
Заметим, что если ненормализованное значение атрибута имело ссылку на пробельный символ, иной нежели символ пробела (#x20), то его нормализованное значение будет содержать сам символ, на который делалась ссылка (т.е. #xD, #xA или #x9). Это иной случай, чем когда в ненормализованном значении атрибута обнаружен пробельный символ (а не просто ссылка на него), который в нормализованном значении будет заменен символом пробела (#x20), а также когда в ненормализованном значении имеется ссылка на сущность, чей текст замены содержит пробельный символ, который в ходе рекурсивной обработки тоже будет заменен в нормализованном значении пробелом (#x20).
Все атрибуты, для которых не было представлено декларации, должна обрабатываться непроверяющим процессором так, как если бы были декларированы CDATA.
Далее следуют примеры нормализации атрибутов. Даны следующие декларации:
Атрибут, указанный в левой колонке следующей таблицы, в ходе нормализации будет преобразован в последовательность символов, представленную в средней колонке, если атрибут a
был декларирован как NMTOKENS, или же в последовательность символов из правой колонки, если a
декларирован как CDATA.
Спецификация атрибута | a является NMTOKENS | a является CDATA |
---|---|---|
x y z
#x20 #x20 x y z
A #x20 B
#x20 #x20 A #x20 #x20 B #x20 #x20
#xD #xD A #xA #xA B #xD #xA
#xD #xD A #xA #xA B #xD #xD
Заметим, что последний пример недействителен (хотя и корректен), если объявлено, что a
имеет тип NMTOKENS.
[Определение: Условная секция является фрагментом внешнего набора для декларации типа документа, которая включается или исключается из логической структуры DTD в зависимости от значения управляющего ею ключевого слова.]
Ограничение действительности: Правильная вложенность условной секции/PE
Если какая-либо из конструкций условной секции ("<![
", "[
" или "]]>
") находится в тексте замены для ссылки на сущность параметра, то в этом тексте должны находиться и все остальные конструкции.
Подобно внутреннему и внешнему наборам DTD, условная секция тоже может содержать одну или несколько полных деклараций, комментариев, инструкций обработки или же вложенных условных секций, перемежаемых пробельным символом.
Если ключевым словом условной секции является INCLUDE, то содержимое этой секции становится частью DTD. Если же ключевым словом условной секции является IGNORE, то содержимое секции логической частью DTD не становится. Если условная секция с ключевым словом INCLUDE была представлена в составе более крупной условной секции с ключевым словом IGNORE, то игнорируются обе внутренняя и внешняя секции. Содержимое игнорируемой условной секции обрабатывается путем изъятия всех символов, стоящих после скобки "[
", следующей за ключевым словом, и до того как будет найден конец условной секции (исключение составляет условная секция, начинающияся с "<![
" и заканчивающаяся "]]>
"). При этом ссылки на сущности параметров не распознаются.
Если ключевое слово условной секции является ссылкой на сущность параметра, то данную сущность параметра необходимо заменить его содержимым до того, как процессор будет решать, включать или игнорировать данную условную секцию.
Например:
[Определение: XML документ может состоять из одной или нескольких единиц размещения, называемых сущностями. Все сущности имеют содержание (исключение составляют сущность документа и внешний набор DTD) и идентифицируются по имени.] Каждый XML документ имеет ровно одну сущность, называемую сущностью документа, которая служит стартовой точкой для XML процессора и может содержать документ целиком.
Сущности могут быть разобранными либо неразобранными. [Определение: Содержимое разобранной сущности (parsed entity) называется ее текстом замены. Этот текст рассматривается как составная часть документа.]
[Определение: Неразобранная сущность (unparsed entity) - это ресурс, содержимым которого может быть текст, либо что-нибудь другое. Даже если это текст, это не обязательно должно быть XML. С каждой неразобранной сущностью связана нотация, идентифицируемая по имени. Помимо того, что XML процессор должен предоставить приложению идентификаторы сущности и ее нотацию, спецификация XML не предъявляет никаких требований к содержимому неразобранной сущности.]
Разобранные сущности вызываются по имени посредством ссылки на сущность, а неразобранные сущности - по имени, указанному в значении атрибута ENTITY или ENTITIES.
[Определение: Общая сущность (general entity) - это сущность для использования в содержимом документа. В рамках данной спецификации общие сущности часто обозначаются неформальным термином сущность (entity), если это не приводит к двусмысленности.] [Определение: Сущность параметра - это разобранная сущность для использования в DTD.] Существует два типа сущностей, использующих различный формат ссылки и распознаваемых в различном контексте. Более того, эти типы занимают разные пространства имен. Сущность параметра и общая сущность с тем же самым именем в действительности являются различными сущностями.
[Определение: Ссылка на символ относится к определенному символу из набора ISO/IEC 10646, например, к такому символу, который невозможно получить непосредственно с имеющихся устройств ввода.]
Ограничение корректности: Допустимый символ
Символ, на который дается ссылка, должен отвечать сценарию Char.
Если ссылка на символ начинается с комбинации "&#x
", то все последующие цифры и буквы вплоть до завершающего символа ;
образуют шестнадцатеричное представление для кода этого символа, указанного в ISO/IEC 10646. Если же ссылка начинается с комбинации "&#
", то все последующие цифры вплоть до завершающего ;
образуют десятичное представление кода символа.
[Определение: Ссылка на сущность обращается к содержимому именованной сущности.]
[Определение: Ссылка на разобранные общие сущности использует в качестве ограничителей амперсант (&
) и символ точки с запятой (;
).]
[Определение: Ссылка на сущность параметра используют в качестве ограничителей символы процента (%
) и точки с запятой (;
).]
Ограничение корректности: Декларированная сущность
Для документа без какого-либо DTD, для документа, имеющего лишь внутренний набор DTD, который не содержит ссылок на сущность параметра, а также для документа с декларацией "standalone='yes'
": для каждого Name в ссылке на сущность, которая не попадает ни во внешний набор, ни в сущность параметра, должен иметься соответствующий Name в одной из деклараций сущности, которые также не располагаются ни во внешнем наборе, ни в сущности параметра. Исключение составляют корректные (well-formed) документы, для которых нет нужды декларировать сущности amp
, lt
, gt
, apos
и quot
. Декларация общей сущности должна предшествовать всем ссылкам на нее, которые могут иметься в декларации списка атрибутов в составе значения по умолчанию.
Заметим, что если сущность была декларирована во внешнем наборе или во внешней сущности параметра, то непроверяющий процессор не обязан читать и обрабатывать ее декларацию. Для подобных документов требование декларировать сущности становится условием корректности только если было указано standalone='yes'.
Ограничение действительности: Декларированная сущность
В документе с внешним набором или внешними сущностями параметра, который имеет декларацию "standalone='no'
", лексема Name в ссылке на сущность должна соответствовать Name в одной из деклараций сущности. Чтобы обеспечить взаимодействие, действительные документы должны декларировать сущности amp
, lt
, gt
, apos
, quot
в том формате, который описан в главе 4.6 Предопределенные сущности. Декларация сущности параметра должна предшествовать любым ссылкам на нее. Точно так же декларация общей сущности должна предшествовать любым декларациям списка атрибута, содержащим значение по умолчанию с прямой либо косвенной ссылкой на эту общую сущность.
Ограничение корректности: Разобранная сущность
Ссылка на сущность не должна содержать имени неразобранной сущности. Ссылаться на неразобранные сущности можно только в тех значениях атрибута, которые были декларированы как имеющие тип ENTITY или ENTITIES.
Ограничение корректности: Отсутствие рекурсии
Разобранная сущность не должна иметь рекурсивной ссылки саму на себя, прямой либо косвенной.
Ограничение корректности: В DTD
Ссылка на сущность параметра может присутствовать только в DTD.
Примеры ссылок на символ и сущность:
Пример ссылки на сущность параметра:
[Определение: Сущности декларируются следующим образом:]
Name используется для идентификации сущности в соответствующей ссылке на сущность, а также идентифицирует неразобранную сущность в значении атрибута ENTITY или ENTITIES. Если одна и та же сущность была декларирована несколько раз, то используется лишь первая из найденых деклараций. По выбору пользователя, XML процессор может генерировать предупреждение в случае, если имеет место многократное декларирование сущностей.
[Определение: Если сущность декларирована как EntityValue, то она называется внутренней сущностью. Для этой сущности отсутствует размещаемый отдельно физический объект, а нее содержание определяется в декларации.] Заметим, что в строковом значении сущности для создания приемлемого текста замены может потребоваться некоторая обработка ссылок на сущность и символ: см. главу 4.5 Построение текста замены для внутренней сущности.
Внутренняя сущность является разобранной сущностью.
Пример декларации внутренней сущности:
[Определение: Если сущность не является внутренней, это внешняя сущность, декларируемая следующим образом:]
Если в декларации присутствует NDataDecl, то это общая неразобранная сущность. В противном случае, сущность является разобранной.
[Определение: Литерал SystemLiteral называется системным идентификатором сущности. Он представляет собой ссылку URI (чье определение было дано в [IETF RFC 2396], а затем дополнено в [IETF RFC 2732]), которую необходимо разобрать, чтобы получить данные на вход XML процессора и сформировать текст замены для указанной сущности.] Если идентификатор фрагмента (начинающийся с символа #
) окажется в составе системного идентификатора, фиксируется ошибка. Для обработки относительных адресов URI в качестве базового берется адрес того источника, в котором была обнаружена декларация данной сущности, если обратное не было указано в ином источнике информации помимо данной спецификация (например, когда специальный тип XML элемента был определен в отдельном DTD или инструкция обработки определена спецификацией конкретного приложения). Таким образом, URI может вычисляться относительно сущности документа, относительно сущности, содержащей внешний набор DTD, или какой-либо другой внешней сущности параметра.
Ссылки URI требуют кодирования и маскирования (escaping) определенных символов. Среди запрещенных символов числятся все не-ASCII символы, а также исключенные символы, перечисленные в главе 2.4 документа [IETF RFC 2396]. Исключение составляют символы решетки (#
) и процента (%
), а также символы квадратных скобок, разрешенные документом [IETF RFC 2732]. Запрещенные символы необходимо маскировать следующим образом:
Каждый из запрещенных символов преобразуется в один или два байта в кодировке UTF-8 [IETF RFC 2279].
Все октеты, относящиеся к запрещенным символам, маскируются с помощью соответствующего механизма URI (то есть преобразуются в формат %
HH, где HH - шестнадцатеричное представление для соответствующего байтового значения).
Исходный символ замещается полученной последовательностью символов.
[Определение: Помимо системного, внешний идентификатор может включать также и публичный идентификатор.] XML процессор, пытающийся извлечь содержимое сущности, может воспользоваться публичным идентификатором с тем, чтобы сгенерировать альтернативную ссылку URI. Если процессор не сможет сделать этого, он должен воспользоваться ссылкой URI, указанной в системном литерале. Перед проверкой все сочетания пробельных символов в публичном идентификаторе должны быть нормализированы, т.е. заменены на одиночные символы пробела (#x20), начальные и завершающие пробельные символы должны быть удалены.
Примеры деклараций внешней сущности:
Каждая внешняя разобранная сущность должна начинаться с декларации текста.
Декларация текста должна быть предоставлена строкой, а не ссылкой на разобранную сущность. Декларация текста не может находиться где-либо еще, кроме как в начале внешней разобранной сущности. Декларация текста во внешней разобранной сущности не является частью текста замены последней.
Сущность документа является корректной, если она соответствует сценарию document. Внешняя общая разобранная сущность является корректной, если она соответствует сценарию extParsedEnt. Все внешние сущности параметров являются корректными по определению.
Внутренняя общая разобранная сущность является корректной если ее текст замены соответствует сценарию content. Все внутренние сущности параметров являются корректными по определению.
Следствием корректности сущностей является правильная вложенность логических и физических структур в XML документе: начальный тэг и конечный тэг, тэг пустого элемента, элемент, комментарий, инструкция обработки, ссылка на символ, а также ссылка на сущность не могут начинаться в одной сущности и заканчиваться в другой.
Каждая из внешних разобранных сущностей в XML документе для своих символов может использовать собственную кодировку. Все XML процессоры должны уметь читать сущности в кодировках UTF-8 и UTF-16. В данной спецификации термины "UTF-8" и "UTF-16" не имеют отношения к кодировкам символов с какими-либо иными названиями, даже если эти кодировки и названия очень похожи на UTF-8 или UTF-16.
Сущности с кодировкой UTF-16 должны начинаться с Byte Order Mark, описанного в Приложении F документа [ISO/IEC 10646], Приложении H документа [ISO/IEC 10646-2000], главе 2.4 документа [Unicode] и главе 2.7 документа [Unicode3] (символ ZERO WIDTH NO-BREAK SPACE, #xFEFF). Причем это сигнатура кодировки, а не фрагмент разметки или символьных данных XML документа. XML процессоры должны уметь с помощью этого символа различать документы в кодировках UTF-8 и UTF-16.
Хотя от XML процессор обязуется читать сущности в кодировках UTF-8 и UTF-16, в мире существует и иные кодировки. Поэтому XML процессору потребуется читать сущности и в других кодировках. В отсутствие внешней информации о кодировке символа (например, в MIME заголовке), разобранные сущности, представленные в иной кодировке, нежели UTF-8 и UTF-16, должны начинаться с декларации текста (см. главу 4.3.1 Декларация текста), содержащей декларацию кодировки:
В сущности document декларация кодировки является частью декларации XML. EncName здесь - название используемой кодировки.
Значения "UTF-8
", "UTF-16
", "ISO-10646-UCS-2
" и "ISO-10646-UCS-4
" в декларации кодировки должны относиться к различным кодировкам и трансформациям из набора Unicode / ISO/IEC 10646, значения "ISO-8859-1
", "ISO-8859-2
", ... "ISO-8859-
n" (где n - номер раздела) - к соответствующим разделам кодировки ISO 8859, а значения "ISO-2022-JP
", "Shift_JIS
" и "EUC-JP
" - к различным кодированным формам набора JIS X-0208-1997. Желательно, чтобы обращение к остальным кодировкам символов, зарегистрированным (как наборы символов) в Internet Assigned Numbers Authority [IANA-CHARSETS], осуществлялось через официальное название. Для названий остальных кодировок должны использоваться префиксы "x-". XML процессоры должны игнорировать верхний и нижний регистр в названии кодировки. Процессор должен либо интерпретировать зарегистрированное в IANA название как указание на использование зарегистрированной под этом именем кодировки, либо считать кодировку неизвестной (разумеется, один процессор не обязуется поддерживать все кодировки, которые были зарегистрированы в IANA).
Если сущность, содержащая декларацию кодировки, предоставлена XML процессору в иной кодировке, чем было заявлено в этой декларации, или сущность, которая не начинается ни с Byte Order Mark, ни с декларации кодировки, была представлена в иной кодировке, нежели UTF-8, а внешний транспортный протокол (например, HTTP или MIME) не предоставил требуемой информации, будет зафиксирована ошибка. Заметим, что поскольку ASCII - является подмножеством UTF-8, то ASCII сущности обычно не нуждаются в декларации кодировки.
Если TextDecl обнаружена не в начале внешней сущности, фиксируется фатальная ошибка.
Если XML процессор сталкивается с сущностью, чью кодировку он не может обработать, фиксируется фатальная ошибка. Фатальная ошибка фиксируется также если было указано (значением по умолчанию, декларацией кодировки или протоколом верхнего уровня), что XML сущность использует определенную кодировку, но в то же время содержит последовательности октетов, которые для этой кодировки недопустимы. Ну и наконец, фатальная ошибка фиксируется, если XML сущность не имеет декларации кодировки, а ее содержимое не относится ни к UTF-8, ни к UTF-16.
Примеры деклараций текста, содержащих декларацию кодировки:
В представленной далее таблице собраны сведения о контексте, в котором могут появиться ссылки на символы, ссылки на сущность, а также вызовы неразобранных сущностей, и какая в каждом случае потребуется реакция от XML процессора. Записи в левой колонке описывают распознаваемый контекст:
Ссылка в любом месте элемента в интервале между начальным и конечным тэгами. Соответствует незавершенному (nonterminal) контенту.
Ссылка либо в значении атрибута начального тэга, либо в значении по умолчанию из декларации атрибута. Соответствует незавершенному AttValue.
Это не ссылка, а лексема типа Name. Выступает либо как значение атрибута, декларированного с типом ENTITY, либо как одна из лексем, перечисленных через пробел в значении атрибута, декларированного с типом ENTITIES.
Ссылка из параметра или строкового значения внутренней сущности, находящихся в декларации сущности. Соответствует незавершенной EntityValue.
Ссылка во внутреннем или внешнем наборе DTD, не попавшая в конструкции EntityValue, AttValue, PI, Comment, SystemLiteral, PubidLiteral, а также содержимое игнорируемой условной секции (см. главу 3.4 Условные секции).
Тип сущности | Символ | ||||
Ссылка в содержимом Не распознается Включается Включается при проверке Запрещен Включается | |||||
Ссылка в значении атрибута Не распознается Включен в строку Запрещен Запрещен Включается | |||||
Значение атрибута Не распознается Запрещен Запрещен Уведомление Не распознается | |||||
Ссылка в значении сущности Включается как строка Пропускается Пропускается Запрещен Включается | |||||
Ссылка в DTD Включается как сущность параметра Запрещен Запрещен Запрещен Запрещен |
За пределами DTD символ %
теряет специальное значение, поэтому в DTD могут появляться ссылки на сущность параметра, которые в содержимом элемента не распознаются как разметка. Аналогично, названия неразобранных сущностей распознается только в значении соответствующим образом декларированного атрибута.
[Определение: Сущность называется включенной, если вместо первоначальной ссылки был взят соответствующий текст замены и затем обработан так, словно это был фрагмент документа, находящийся в том месте, где располагалась исходная ссылка.] Текст замены может включать и символьные данные, и (за исключением сущностей параметров) разметку, которые должны распознаваться обычным образом. (Например, строка "AT&T;
" преобразуется в "AT&T;
", а оставшийся в ней амперсант рассматривается не как ограничитель ссылки на сущность.) Ссылка на символ считается включенной, если вместо этой ссылки обрабатывается указываемый ею символ.
Если XML процессор обнаруживает ссылку на разобранную сущность, то для проверки действительности документа, он должен осуществить подстановку соответствующего текста замены. Если же сущность является внешней, и процессор не предпринимает попыток проверить XML документ, то он хотя и может, но уже не обязан включать в документ текст замены для этой сущности. Если непроверяющий процессор не выполнял подстановки текста замены, он должен информировать приложение о том, что данную сущность он обнаружил, но не прочел.
Представленное положение исходит из того, что автоматическая подстановка, предоставляемая механизмом обработки сущностей SGML и XML, первоначально предназначалась для поддержки модульности при авторизации и не должен был использоваться другими приложениями, например для просмотра данного документа. Например, программа просмотра, встречаясь со ссылкой на внешнюю разобранную сущность, может использовать визуальную индикацию имеющейся ссылки, а саму сущность выводить на экран только по требованию пользователя.
Следующие ситуации относятся к разряду запрещенных и соответствуют фатальной ошибке:
появление ссылки на неразобранную сущность.
появление в DTD символа или ссылки на общую сущность за пределами EntityValue и AttValue.
ссылка на внешнюю сущность в значении атрибута.
Если в значении атрибута обнаружена ссылка на сущность, или в строчном значении сущности обнаружена ссылка на сущность параметра, то вместо этой ссылки обрабатывается ее текст замены, словно это был фрагмент документа, находившийся в том месте, где была обнаружена исходная ссылка. Исключение составляют символы одинарной или двойной кавычки, которые в тексте замены всегда воспринимаются как обычный символ данных, а не как завершение соответствующей строки. Например, следующий пример является корректным:
а этот - нет:
Если название неразобранной сущности было представлено в качестве лексемы в значении атрибута с декларированным типом ENTITY или ENTITIES, то проверяющий процессор должен передать приложению сведения о системных и публичных (если таковые имеются) идентификаторах данной сущности и связанной с нею нотации.
Если в декларации сущности в поле EntityValue обнаружена ссылка на общую сущность, она пропускается и оставляется без изменений.
Поскольку это внешняя разобранная сущность, то потребность в подстановке сущности параметра должна появляться только при проверке. Если в DTD обнаружена ссылка на сущность параметра и выполняется подстановка ее текста замены, то к последнему в начале и конце должно быть приставлено по одному символу пробела (#x20). Этим гарантируется, что текст замены для сущностей параметров будет содержать полный набор грамматических лексем DTD. Описанное положение не относится к ссылкам на сущность параметра в значении сущности - ситуации, описанной в главе 4.4.5 Включается как строка.
Обсуждая процедуру обработки внутренних сущностей, полезно различать два вида значений сущности. [Определение: Строковое значение сущности - это строка в кавычках, которая реально присутствует в декларации сущности и соответствует незавершенному EntityValue.] [Определение: Текст замены - это содержимое сущности после подстановки всех ссылок на символ и сущность параметра.]
Строковое значение сущности, данное в декларации внутренней сущности (EntityValue), может содержать ссылки на символ, на сущность параметра и на общую сущность. Такие ссылки должны целиком содержаться в строковом значении сущности. Реально подставляемый текст замены должен содержать текст замены для всех сущностей параметров и все символы, на которые делалась ссылка, причем в тех местах строкового значения сущности, где эти ссылки находились. Вместе с тем, ссылки на общие сущности должны оставаться без изменений. Например, даны следующие декларации:
тогда текст замены для сущности "book
":
Ссылка на общую сущность "&rights;
" должна расшифроваться только тогда, когда ссылка "&book;
" попадает в содержимое документа или значение атрибута.
Эти простые правила могут иметь сложные взаимоотношения. Детальное обсуждение сложного примера этого см. в Приложении D Обработка ссылок на сущность и символ.
[Определение: Ссылки на сущность и символ могут быть использованы для маскирования левой угловой скобки, амперсанта и других ограничителей. Для этой цели сформирован целый набор общих сущностей (amp
, lt
, gt
, apos
, quot
). Также может использоваться числовая ссылка на символ, которая должна обрабатываться как символьные данные и заменяться соответствующим символом сразу по обнаружении. Таким образом, числовые ссылки "<
" и "&
" могут быть использованы для маскирования символов <
и &
, встречающихся среди символьных данных.]
Независимо от того, были ли указанные сущности декларированы, они должны распознаваться всеми XML процессорами. Чтобы обеспечить взаимодействие, действительные XML документы перед использованием должны декларировать эти сущности, как и любые другие. Если сущности lt
или amp
были декларированы, то они должны быть объявлены как внутренняя сущность, чей текст замены - это ссылка на соответствующий маскируемый символ (знак меньше или амперсант). Для этих сущностей необходимо двойное маскирование, чтобы ссылка на них давала корректный результат. Если декларируются сущности gt
, apos
или quot
, то они должны быть представлены как внутренняя сущность, текст замены которой - это одиночный маскируемый символ (либо ссылка на этот символ, двойное маскирование здесь хотя и допустимо, но необязательно). Например:
[Определение: Нотация идентифицирует по имени формат неразобранных сущностей, формат элементов, обеспечивающих атрибут нотации, или же приложение, которому адресуется инструкция обработки.]
[Определение: Декларация нотации дает этой нотации название, используемое при декларировании сущности, списка атрибутов или в спецификациях атрибутов, а также внешний идентификатор этой нотации, который может позволить XML процессору или его клиентскому приложению найти вспомогательную программу, способную обработать данные, представленные в этой нотации.]
Ограничение действительности: Уникальность имени нотации
Любое Name может быть использовано только в одной декларации.
XML процессор должен передать приложению название и внешний идентификатор(ы) всех нотаций, которые были декларированы и на которые имеется ссылка в значениях атрибутов, определениях атрибутов, либо декларациях сущностей. Кроме того, процессор может преобразовывать внешний идентификатор в системный идентификатор, имя файла или иную информацию, необходимую приложению чтобы вызвать процессор для обработки данных в описываемой нотации. (Впрочем, ситуация, когда XML документ декларирует и ссылается на нотацию, для которой не имеется соответствующего процессора обработки в системе, где работают XML процессор или приложение ошибочной не будет.)
[Определение: Сущность документа выступает в качестве корня дерева сущностей, а также как стартовая точка для XML процессора.] В данной спецификации не конкретизируется, каким именно образом XML процессор должен находить сущность документа - в отличие от других сущностей, сущность документа не имеет имени и вполне может появиться во входном потоке процессора вообще без какого-либо идентификатора.
XML процессоры, отвечающие требованиям спецификации, делятся на два класса: проверяющие и непроверяющие.
И проверяющие, и непроверяющие процессоры должны докладывать о нарушениях правил корректности данной спецификации, выявленных в содержимом сущности документа и содержимом других читаемых разобранных сущностей.
[Определение: Проверяющие процессоры должны сообщить (по выбору пользователя) о нарушении ограничений, сформулированных в декларациях DTD, а также невозможности соответствовать критериям действительности, представленным в данной спецификации.] Чтобы выполнить это тренбование, проверяющий XML процессор должен прочесть и обработать весь DTD и все внешние разобранные сущности, на которые в данном документе делается ссылка.
Для проверки корректности от непроверяющего процессора требется проанализировать лишь сущность документа, включая полный внутренний набор DTD. [Определение: Хотя непроверяющий процессор и не обязан проверять действительность документа, он должен обработать все декларации, найденные во внутреннем наборе DTD, а также во всех прочитанных им сущностях параметров, но только до первой ссылки на сущность параметра, которую он уже не должен читать. Иными словами, он должен использовать сведения из этих деклараций для нормализации значений атрибутов, подстановки текста замены для внутренних сущностей и предоставления значений по умолчанию для атрибутов.] За исключением случая standalone="yes"
, процессорам запрещается обрабатывать декларации сущностей и списков атрибутов, расположенные после ссылки на сущность параметра, последняя не читается, поскольку может содержать переопределяющие декларации.
Поведение проверяющего XML процессора в значительной мере предсказуемо: он должен почесть все части документа и сообщить обо всех нарушениях правил корректности и действительности. Меньшее требуется от непроверяющего процессора: он не должен читать какие-либо части документа кроме сущности документа. Для использования XML процессоров существенное значение могут иметь два эффекта:
Непроверяющим процессором могут не распознаваться определенные ошибки корректности, особенно те, которые требуют прочтения внешних сущностей. Примером здесь служит нарушение ограничений Entity Declared, Parsed Entity и No Recursion, а также некоторые варианты, описанные в качестве запрещенных в главе 4.4 Обработка XML процессором сущностей и ссылок.
Информация, передаваемая процессором приложению, может меняться в зависимости от того, прочел ли этот процессор параметры и внешние сущности. Например, непроверяющий процессор может не выполнить нормализации значений атрибутов, не осуществить подстановки текста замены для внутренних сущностей или не предоставить значений по умолчанию для атрибутов, если это связано с прочтением деклараций во внешних сущностях и сущностях параметров.
Для достижения максимальной надежности взаимодействия различных XML процессоров, приложения, использующие непроверяющий процессор, не должны обращаться к функциям этих процессоров, не являющимся необязательными. Приложения, которым необходимы такие возможности, как использование атрибутов по умолчанию или внутренние сущности, декларированные во внешней сущности, должны пользоваться проверяющими XML процессорами.
Формальная грамматика языка XML строится в данной спецификации с помощью простой нотации Extended Backus-Naur Form (EBNF). Каждое правило в грамматике определяет один символ (symbol) в следующем формате:
Каждый символ, являющийся оригинальным в языке нормативов, пишется с заглавной буквы. В остальных случаях, первая буква символа прописная. Строки текста помещаются в кавычки.
В правой части правила представлено выражение, использующее следующие конструкции, сопоставляемые строкам из одного или нескольких символов:
#xN
где N
- шестнадцатеричное целое число. Данное выражение соответствует символу в кодировке ISO/IEC 10646, каноническое значение кода (UCS-4) которого как беззнаковое целое число, имеет указанное значение. Количество ведущих нулей в формате #xN
значения не имеет. Количество ведущих нулей в соответствующем значении кода определяется используемой кодировкой символов и для XML значения не имеет.
[a-zA-Z]
, [#xN-#xN]
соответствует любому Char, чье значение попадает в указанный диапазон(ы) (включительно).
[abc]
, [#xN#xN#xN]
соответствует любому Char, чье значение имеется среди перечисленных символов. В пределах одного набора скобок перечисления и диапазоны могут сочетаться.
[^a-z]
, [^#xN-#xN]
соответствует любому Char, чье значение не входит в указанный диапазон.
[^abc]
, [^#xN#xN#xN]
соответствует любому Char, чьего значение нет среди указанных символов. В пределах одного набора скобок перечисления и диапазоны запрещенных значений могут сочетаться.
"string"
соответствует строке символов, совпадающей со строкой, представленной в двойных кавычках.
'string'
соответствует строке символов, совпадающей со строкой, представленной в одинарных кавычках.
Представленные символы могут комбинироваться в более сложные шаблоны следующим образом (где A
и B
представляют собой простые выражения):
выражение
)
данное выражение
обрабатывается как единое целое и может комбинироваться с другими выражениями в соответствии с дальнейшим перечнем.
A?
соответствует A
или ничему. Необязательная единица A
.
A B
соответствует A
, за которым следует B
. Данный оператор имеет более высокий приоритет, чем оператор альтернативы. Таким образом, A B | C D
эквивалентно (A B) | (C D)
.
A | B
соответствует A
или B
, но не обоим сразу.
A - B
любая строка, которая соответствует шаблону A
, но не соответствует B
.
A+
соответствует одному или нескольким экземплярам A
. Конкатенация имеет более высокий приоритет, чем оператор альтернативы. Таким образом, A+ | B+
эквивалентно (A+) | (B+)
.
A*
соответствует нулю, одному или нескольким экземплярам A
. Конкатенация имеет более высокий приоритет, чем оператор альтернативы. Таким образом, A* | B*
эквивалентно (A*) | (B*)
.
Остальные нотации, используемые в сценариях:
/* ... */
комментарий.
[ wfc: ... ]
ограничение корректности. Идентифицирует по имени ограничение для корректных документов, связанное с неком сценарием.
[ vc: ... ]
ограничение действительности. Идентифицирует по имени ограничение для действительных документов, связанное с неким сценарием.
Приводимые далее определения были представлены в стандарте Unicode. Все символы делятся на базовые символы (BaseChar, наряду с прочим сюда включены буквы латинского алфавита), идеографические символы (Ideographic), комбинированные символы (CombiningChar, в последнюю группу попадает также большинство диакритических символов). Выделяются также цифры (Digit) и расширения (Extender).
Представленные здесь классы символов могут быть извлечены из базы данных символов Unicode 2.0 следующим образом:
Начальные символы Name (Name start) должны иметь одну из следующих категорий: Ll, Lu, Lo, Lt, Nl.
Символы Name, за исключением Name-start, должны иметь одну из следующих категорий: Mc, Me, Mn, Lm, or Nd.
В XML именах нельзя использовать символы из области совместимости (то есть, символы с кодом, большим чем #xF900 и меньшим чем #xFFFE).
Нельзя использовать символы, имеющие шрифт или расклад совместимости (то есть, имеющие "тэг совместимости форматирования" в 5-м поле базы данных - имеющие метку в поле 5, начинающемся с "<").
Символы [#x02BB-#x02C1], #x0559, #x06E5, #x06E6 обрабатываются как name-start символы, а не как символы name, поскольку классификатор определяет их как алфавитные.
Символы #x20DD-#x20E0 исключены (в соответствии с требованиями Unicode 2.0, глава 5.14).
Символ #x00B7 классифицируется как расширение, поскольку именно таким образом он идентифицируется в перечне свойств.
Символ #x0387 добавлен как name символ, поскольку #x00B7 является его каноническим эквивалентом.
Символы ':' и '_' допустимы в качестве name-start символов.
Символы '-' и '.' допустимы в качестве name символов.
XML построен как подмножество SGML, поэтому каждый XML документ должен также отвечать требованиям, предъявляемым к SGML документу. Детальное сравнение ограничений, которые языки XML и SGML накладывают на документы, см. в статье [Clark].
В данном приложении содержатся некоторые примеры, иллюстрирующие последовательность распознавания и обработки ссылок на сущность и символ, которая была определена в главе 4.4 Обработка XML процессором сущностей и ссылок.
Если DTD содержит декларацию
то в ходе обработки этой декларации сущности XML процессор обнаружит ссылки на символ и обработает их прежде чем следующая строка будет использована в качестве значения сущности "example
":
Появление в документе ссылки на элемент "&example;
" приведет к тому, что этот текст будет разобран снова. Будут обнаружены начальный и конечный тэги элемента p
, а также будут обнаружены и обработаны все три ссылки. В результате элемент p
будет иметь следующее содержание (все данные, но без ограничителей и разметки):
Более сложный пример полностью проиллюстрирует эти правила и их эффективность. (Номера строк в следующем примере нужны лишь для комментариев.)
В результате получается следующий сценарий:
в строке 4 ссылка на символ с кодом 37 обрабатывается сразу, и сущность параметра "xx
" помещается в таблицу символов со значением "%zz;
". И поскольку текст замены повторно не просматривается, ссылка на сущность параметра "zz
" обнаружена не будет. (Если же это здесь произойдет, то будет зафиксирована ошибка, поскольку сущность "zz
" еще не была декларирована.)
в строке 5 ссылка на символ "<
" обрабатывается сразу, и сущность параметра "zz
" обзаводится текстом замены "<!ENTITY tricky "error-prone" >
", являющимся корректной декларацией сущности.
в строке 6 обнаруживается ссылка на сущность "xx
" и, соответственно, производится разбор текста замены для этой сущности (а именно, "%zz;
"). При этом обнаруживается ссылка на сущность "zz
" и тоже анализируется ее текст замены ("<!ENTITY tricky "error-prone" >
"). В результате получаем декларацию общей сущности "tricky
" с текстом замены "error-prone
".
в строке 8, обнаруживается и обрабатывается ссылка на общую сущность "tricky
". В итоге получаем полное содержимое элемента test
в виде самодостаточной (и не связанной с какой-либо грамматикой) строки This sample shows a error-prone method.
Как указывалось в главе 3.2. Содержимое элемента, необходимо чтобы модели содержимого, даваемые в декларациях типов элементов, были детерминистическими. Данное требование необходимо для совместимости с языком SGML (в котором детерминистические модели содержания обозначаются термином "unambiguous"). XML процессоры, построенные на базе систем SGML, могут выявлять недетерминистические модели содержания как ошибочные.
К примеру, модель содержимого ((b, c) | (b, d))
является недетерминистической, поскольку, получив исходный b
, XML процессор не может знать, какому b
в исходной модели он соответствует, не проследив далее по строке, какой элемент следует за указанным b
. В данном случае обе ссылки на b
можно свести в одну общую ссылку, преобразовав рассматриваемую модель в (b, (c | d))
. Теперь исходный элемент b
соответствует ровно одному имени в модели содержания, и процессору нет нужды заглядывать вперед чтобы увидеть, что за ним следует. Это может быть и c
, и d
.
Или более формально: с помощью стандартных алгоритмов по модели содержания может быть выстроен автомат конечных состояний, например алгоритм 3.5 из главы 3.9 в книге авторов Aho, Sethi и Ullman [Aho/Ullman]. Во многих таких алгоритмах для каждой части в регулярном выражении строится сопроводительный набор команд (то есть, в дереве синтаксиса данного регулярного выражения стоится каждый узел листа). Если какая-либо часть выражения имеет сопроводительный набор, в котором более одной позиции сопоставлено с типом элементов с одним и тем же названием, модель содержимого ошибочна и об этом можно сообщать как об ошибке.
Существуют алгоритмы, которые способны многие (хотя и не все) недетерминистические модели содержания автоматически привести к эквивалентным детерминистическым моделям (см. Brüggemann-Klein 1991 [Brüggemann-Klein]).
Декларация кодировки XML для каждой сущности действует как некий внутренний заголовок, указывающий используемую кодировку символов. Очевидно, что прежде чем XML процессор сможет прочесть внутренний заголовок, он должен выяснить используемую кодировку символов, то есть именно то, что пытается показать внутренний заголовок. В общем случае, это безвыходная ситуация. Однако для XML это не совсем так, поскольку XML в общем случае ограничен двумя положениями: предполагается, что каждая реализация поддерживает только ограниченный набор кодировок символов, а декларация кодировки XML занимает определенную позицию и имеет определенное содержание, что позволяет в обычных случаях осуществить автоматическое определение кодировки для каждой сущности. Кроме того, во многих случаях помимо собственно потока данных XML документа доступны и другие источники информации. В зависимости от того, была ли сущность XML представлена процессору с сопроводительной (внешней) информацией или же нет, можно наблюдать две ситуации. Сначала мы рассмотрим первую из них.
Поскольку ни одна из сущностей XML не сопровождается внешней информацией о кодировке и не пользуется кодировками UTF-8 или UTF-16, то первой должна идти декларация кодировки XML. Первыми ее символами должны быть '<?xml
', которые способен обнаружить любой процессор, отвечающий требованиям спецификации. Для этого ему необходимо получит от двух до четырех октетов, различные комбинации которых рассматриваются ниже. Изучая перечень этих комбинаций, полезно будет знать, что в кодировке UCS-4 код символа '<' - "#x0000003C
", символ '?' соответствует "#x0000003F
", а Byte Order Mark, который обязателен для потоков данных в кодировке UTF-16, имеет код "#xFEFF
". Запись ## обычно используется для обозначения любого байтового значения, за исключением того, что две следующих друг за другом нотации ## не могут обе соответствовать нулевому коду 00.
с Byte Order Mark:
без Byte Order Mark:
UCS-4 или иная кодировка с 32-битным кодом, а также ASCII символы, кодированные как ASCII значения, с порядком следования байтов big-endian (1234), little-endian (4321) и нетипичными (2143 и 3412) соответственно. Чтобы определить, какая из поддерживаемых UCS-4 и других 32-битных кодировок используется, необходимо прочесть декларацию кодировки. |
Примечание:
Среди перечисленных выше вариантов есть такие, когда для определения кодировки нет необходимости читать соответствующую декларацию. Однако, согласно главе 4.3.3, декларация кодировки остается необходимой. Поэтому если эта декларация имеется, то ее необходимо прочесть, а полученное название сверить с действительной кодировкой данной сущности. Кроме того, в будущем могут появиться новые кодировки символов, которые потребуют декларирования даже в тех случаях, где сегодня кодировку можно распознать автоматически.
Описанный механизм автоматического распознавания кодировки достаточен для того, чтобы прочесть декларацию кодировки XML и получить идентификатор кодировки символов, который по-прежнему необходим для распознавания отдельных членов в каждой группе кодировок (например, чтобы выделить UTF-8 из 8859, отделить друг от друга отдельные части набора 8859, идентифицировать используемую кодовую страницу EBCDIC и так далее).
Поскольку содержимое декларации кодировки ограничено набором ASCII символов (хотя и скрыто под кодировкой), процессор сможет надежно прочесть всю декларацию кодировки, как только разберется, какая была использована группа кодировок. Поскольку практически все широко используемые кодировки символов попадают в одну из перечисленных выше категорий, то декларирование кодировки XML позволяет достаточно надежно обозначать кодировку символов даже в тех случаях, когда внешние источники информации в операционной системе или на уровне транспортного протокола окажутся ненадежны. Однако такие кодировки символов, как UTF-7, переопределяющие байты ASCII-значений, не могут быть идентифицированы надежно.
Как только процессор определил используемую кодировку символов, он волен поступать соответствующим образом, либо используя для каждой кодировки отдельную процедуру ввода, либо вызывая соответствующую процедуру преобразования для каждого введенного символа.
Как и любые другие самораспознаваемые системы, декларация кодировки XML не сможет работать, если какая-нибудь программа поменяла используемый для сущности набор символов или кодировку, не изменив при этом соответствующим образом декларацию кодировки. Программистам, разрабатывающим процедуры кодирования символов, необходимо тщательно проверять достоверность внешней и внутренней информации, используемой для маркировки сущностей.
Вторая из возможных ситуаций возникает когда XML сущность сопровождает информация о кодировке, извлекаемая из некоторых файловых систем и сетевых протоколов. Если имеется несколько источников информации, то их относительный приоритет и предпочтительный способ разрешения конфликтов должны определяться протоколом более высокого уровня, используемым для передачи XML документов. В частности, можно обратиться к [IETF RFC 2376] и наследующим его документам, определяющим типы MIME text/xml
и application/xml
, а также содержащим полезное руководство. Однако в целях совместимости желательно руководствоваться следующим правилом:
Если сущность XML находится в файле, то для определения кодировки символов, как правило, используются Byte-Order Mark и декларация кодировки (если таковые имеются).
Данная спецификация была подготовлена и принята к публикации рабочей группой W3C XML (W3C XML Working Group, WG). Однако из того, что WG приняла данную спецификацию, не следует, что все члены WG единогласно проголосовали за это решение. Настоящие и бывшие члены XML WG:
Вторая редакция данной спецификации была подготовлена основной рабочей группой W3C XML (W3C XML Core Working Group, WG). Членами группы на момент опубликования этой редакции являлись:
Вторая редакция спецификации была также преобразована в XMLspec DTD (для которой имеется соответствующая документация). HTML версии спецификации были получены с помощью XSLT стилей xmlspec.xsl, diffspec.xsl и REC-xml-2e.xsl. PDF версия документа была получена с помощью инструментария html2ps и программы выделения.
Если у вас возникли какое-либо замечания, мы будем рады их получить по адресу radik_u@mail.ru.
[an error occurred while processing this directive]