|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 Физические структуры[Определение: XML документ может состоять из одной или нескольких единиц размещения, называемых сущностями. Все сущности имеют содержание (исключение составляют сущность документа и внешний набор DTD) и идентифицируются по имени.] Каждый XML документ имеет ровно одну сущность, называемую сущностью документа, которая служит стартовой точкой для XML процессора и может содержать документ целиком. Сущности могут быть разобранными либо неразобранными. [Определение: Содержимое разобранной сущности (parsed entity) называется ее текстом замены. Этот текст рассматривается как составная часть документа.] [Определение: Неразобранная сущность (unparsed entity) - это ресурс, содержимым которого может быть текст, либо что-нибудь другое. Даже если это текст, это не обязательно должно быть XML. С каждой неразобранной сущностью связана нотация, идентифицируемая по имени. Помимо того, что XML процессор должен предоставить приложению идентификаторы сущности и ее нотацию, спецификация XML не предъявляет никаких требований к содержимому неразобранной сущности.] Разобранные сущности вызываются по имени посредством ссылки на сущность, а неразобранные сущности - по имени, указанному в значении атрибута ENTITY или ENTITIES. [Определение: Общая сущность (general entity) - это сущность для использования в содержимом документа. В рамках данной спецификации общие сущности часто обозначаются неформальным термином сущность (entity), если это не приводит к двусмысленности.] [Определение: Сущность параметра - это разобранная сущность для использования в DTD.] Существует два типа сущностей, использующих различный формат ссылки и распознаваемых в различном контексте. Более того, эти типы занимают разные пространства имен. Сущность параметра и общая сущность с тем же самым именем в действительности являются различными сущностями. 4.1 Ссылки на символ и сущность[Определение: Ссылка на символ относится к определенному символу из набора ISO/IEC 10646, например, к такому символу, который невозможно получить непосредственно с имеющихся устройств ввода.] Ссылка на символ
Ограничение корректности: Допустимый символ Символ, на который дается ссылка, должен отвечать сценарию Char. Если ссылка на символ начинается с комбинации " [Определение: Ссылка на сущность обращается к содержимому именованной сущности.]
[Определение: Ссылка на разобранные общие сущности использует в качестве ограничителей амперсант ( Ссылка на сущность
Ограничение корректности: Декларированная сущность Для документа без какого-либо DTD, для документа, имеющего лишь внутренний набор DTD, который не содержит ссылок на сущность параметра, а также для документа с декларацией " Заметим, что если сущность была декларирована во внешнем наборе или во внешней сущности параметра, то непроверяющий процессор не обязан читать и обрабатывать ее декларацию. Для подобных документов требование декларировать сущности становится условием корректности только если было указано standalone='yes'. Ограничение действительности: Декларированная сущность В документе с внешним набором или внешними сущностями параметра, который имеет декларацию " Ограничение корректности: Разобранная сущность Ссылка на сущность не должна содержать имени неразобранной сущности. Ссылаться на неразобранные сущности можно только в тех значениях атрибута, которые были декларированы как имеющие тип ENTITY или ENTITIES. Ограничение корректности: Отсутствие рекурсии Разобранная сущность не должна иметь рекурсивной ссылки саму на себя, прямой либо косвенной. Ограничение корректности: В DTD Ссылка на сущность параметра может присутствовать только в DTD. Примеры ссылок на символ и сущность:
Пример ссылки на сущность параметра:
4.2 Декларации сущности[Определение: Сущности декларируются следующим образом:] Декларация сущности
Name используется для идентификации сущности в соответствующей ссылке на сущность, а также идентифицирует неразобранную сущность в значении атрибута ENTITY или ENTITIES. Если одна и та же сущность была декларирована несколько раз, то используется лишь первая из найденых деклараций. По выбору пользователя, XML процессор может генерировать предупреждение в случае, если имеет место многократное декларирование сущностей. 4.2.1 Внутренние сущности[Определение: Если сущность декларирована как EntityValue, то она называется внутренней сущностью. Для этой сущности отсутствует размещаемый отдельно физический объект, а нее содержание определяется в декларации.] Заметим, что в строковом значении сущности для создания приемлемого текста замены может потребоваться некоторая обработка ссылок на сущность и символ: см. главу 4.5 Построение текста замены для внутренней сущности. Внутренняя сущность является разобранной сущностью. Пример декларации внутренней сущности:
4.2.2 Внешние сущности[Определение: Если сущность не является внутренней, это внешняя сущность, декларируемая следующим образом:] Декларация внешней сущности
Если в декларации присутствует NDataDecl, то это общая неразобранная сущность. В противном случае, сущность является разобранной. [Определение: Литерал SystemLiteral называется системным идентификатором сущности. Он представляет собой ссылку URI (чье определение было дано в [IETF RFC 2396], а затем дополнено в [IETF RFC 2732]), которую необходимо разобрать, чтобы получить данные на вход XML процессора и сформировать текст замены для указанной сущности.] Если идентификатор фрагмента (начинающийся с символа Ссылки URI требуют кодирования и маскирования (escaping) определенных символов. Среди запрещенных символов числятся все не-ASCII символы, а также исключенные символы, перечисленные в главе 2.4 документа [IETF RFC 2396]. Исключение составляют символы решетки (
[Определение: Помимо системного, внешний идентификатор может включать также и публичный идентификатор.] XML процессор, пытающийся извлечь содержимое сущности, может воспользоваться публичным идентификатором с тем, чтобы сгенерировать альтернативную ссылку URI. Если процессор не сможет сделать этого, он должен воспользоваться ссылкой URI, указанной в системном литерале. Перед проверкой все сочетания пробельных символов в публичном идентификаторе должны быть нормализированы, т.е. заменены на одиночные символы пробела (#x20), начальные и завершающие пробельные символы должны быть удалены. Примеры деклараций внешней сущности:
4.3 Разобранные сущности4.3.1 Декларация текстаКаждая внешняя разобранная сущность должна начинаться с декларации текста. Декларация текста
Декларация текста должна быть предоставлена строкой, а не ссылкой на разобранную сущность. Декларация текста не может находиться где-либо еще, кроме как в начале внешней разобранной сущности. Декларация текста во внешней разобранной сущности не является частью текста замены последней. 4.3.2 Корректные разобранные сущностиСущность документа является корректной, если она соответствует сценарию document. Внешняя общая разобранная сущность является корректной, если она соответствует сценарию extParsedEnt. Все внешние сущности параметров являются корректными по определению. Корректная внешняя разобранная сущность
Внутренняя общая разобранная сущность является корректной если ее текст замены соответствует сценарию content. Все внутренние сущности параметров являются корректными по определению. Следствием корректности сущностей является правильная вложенность логических и физических структур в XML документе: начальный тэг и конечный тэг, тэг пустого элемента, элемент, комментарий, инструкция обработки, ссылка на символ, а также ссылка на сущность не могут начинаться в одной сущности и заканчиваться в другой. 4.3.3 Кодирование символов в сущностяхКаждая из внешних разобранных сущностей в 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 здесь - название используемой кодировки. Значения " Если сущность, содержащая декларацию кодировки, предоставлена XML процессору в иной кодировке, чем было заявлено в этой декларации, или сущность, которая не начинается ни с Byte Order Mark, ни с декларации кодировки, была представлена в иной кодировке, нежели UTF-8, а внешний транспортный протокол (например, HTTP или MIME) не предоставил требуемой информации, будет зафиксирована ошибка. Заметим, что поскольку ASCII - является подмножеством UTF-8, то ASCII сущности обычно не нуждаются в декларации кодировки. Если TextDecl обнаружена не в начале внешней сущности, фиксируется фатальная ошибка. Если XML процессор сталкивается с сущностью, чью кодировку он не может обработать, фиксируется фатальная ошибка. Фатальная ошибка фиксируется также если было указано (значением по умолчанию, декларацией кодировки или протоколом верхнего уровня), что XML сущность использует определенную кодировку, но в то же время содержит последовательности октетов, которые для этой кодировки недопустимы. Ну и наконец, фатальная ошибка фиксируется, если XML сущность не имеет декларации кодировки, а ее содержимое не относится ни к UTF-8, ни к UTF-16. Примеры деклараций текста, содержащих декларацию кодировки:
4.4 Обработка XML процессором сущностей и ссылокВ представленной далее таблице собраны сведения о контексте, в котором могут появиться ссылки на символы, ссылки на сущность, а также вызовы неразобранных сущностей, и какая в каждом случае потребуется реакция от XML процессора. Записи в левой колонке описывают распознаваемый контекст:
4.4.1 Не распознаетсяЗа пределами DTD символ 4.4.2 Включается[Определение: Сущность называется включенной, если вместо первоначальной ссылки был взят соответствующий текст замены и затем обработан так, словно это был фрагмент документа, находящийся в том месте, где располагалась исходная ссылка.] Текст замены может включать и символьные данные, и (за исключением сущностей параметров) разметку, которые должны распознаваться обычным образом. (Например, строка " 4.4.3 Включается при проверкеЕсли XML процессор обнаруживает ссылку на разобранную сущность, то для проверки действительности документа, он должен осуществить подстановку соответствующего текста замены. Если же сущность является внешней, и процессор не предпринимает попыток проверить XML документ, то он хотя и может, но уже не обязан включать в документ текст замены для этой сущности. Если непроверяющий процессор не выполнял подстановки текста замены, он должен информировать приложение о том, что данную сущность он обнаружил, но не прочел. Представленное положение исходит из того, что автоматическая подстановка, предоставляемая механизмом обработки сущностей SGML и XML, первоначально предназначалась для поддержки модульности при авторизации и не должен был использоваться другими приложениями, например для просмотра данного документа. Например, программа просмотра, встречаясь со ссылкой на внешнюю разобранную сущность, может использовать визуальную индикацию имеющейся ссылки, а саму сущность выводить на экран только по требованию пользователя. 4.4.4 ЗапрещенСледующие ситуации относятся к разряду запрещенных и соответствуют фатальной ошибке:
4.4.5 Включается как строкаЕсли в значении атрибута обнаружена ссылка на сущность, или в строчном значении сущности обнаружена ссылка на сущность параметра, то вместо этой ссылки обрабатывается ее текст замены, словно это был фрагмент документа, находившийся в том месте, где была обнаружена исходная ссылка. Исключение составляют символы одинарной или двойной кавычки, которые в тексте замены всегда воспринимаются как обычный символ данных, а не как завершение соответствующей строки. Например, следующий пример является корректным:
а этот - нет:
4.4.6 УведомлениеЕсли название неразобранной сущности было представлено в качестве лексемы в значении атрибута с декларированным типом ENTITY или ENTITIES, то проверяющий процессор должен передать приложению сведения о системных и публичных (если таковые имеются) идентификаторах данной сущности и связанной с нею нотации. 4.4.7 ПропускаетсяЕсли в декларации сущности в поле EntityValue обнаружена ссылка на общую сущность, она пропускается и оставляется без изменений. 4.4.8 Включается как сущность параметраПоскольку это внешняя разобранная сущность, то потребность в подстановке сущности параметра должна появляться только при проверке. Если в DTD обнаружена ссылка на сущность параметра и выполняется подстановка ее текста замены, то к последнему в начале и конце должно быть приставлено по одному символу пробела (#x20). Этим гарантируется, что текст замены для сущностей параметров будет содержать полный набор грамматических лексем DTD. Описанное положение не относится к ссылкам на сущность параметра в значении сущности - ситуации, описанной в главе 4.4.5 Включается как строка. 4.5 Построение текста замены для внутренней сущностиОбсуждая процедуру обработки внутренних сущностей, полезно различать два вида значений сущности. [Определение: Строковое значение сущности - это строка в кавычках, которая реально присутствует в декларации сущности и соответствует незавершенному EntityValue.] [Определение: Текст замены - это содержимое сущности после подстановки всех ссылок на символ и сущность параметра.] Строковое значение сущности, данное в декларации внутренней сущности (EntityValue), может содержать ссылки на символ, на сущность параметра и на общую сущность. Такие ссылки должны целиком содержаться в строковом значении сущности. Реально подставляемый текст замены должен содержать текст замены для всех сущностей параметров и все символы, на которые делалась ссылка, причем в тех местах строкового значения сущности, где эти ссылки находились. Вместе с тем, ссылки на общие сущности должны оставаться без изменений. Например, даны следующие декларации:
тогда текст замены для сущности "
Ссылка на общую сущность " Эти простые правила могут иметь сложные взаимоотношения. Детальное обсуждение сложного примера этого см. в Приложении D Обработка ссылок на сущность и символ. 4.6 Предопределенные сущности[Определение: Ссылки на сущность и символ могут быть использованы для маскирования левой угловой скобки, амперсанта и других ограничителей. Для этой цели сформирован целый набор общих сущностей ( Независимо от того, были ли указанные сущности декларированы, они должны распознаваться всеми XML процессорами. Чтобы обеспечить взаимодействие, действительные XML документы перед использованием должны декларировать эти сущности, как и любые другие. Если сущности
4.7 Декларирование нотаций[Определение: Нотация идентифицирует по имени формат неразобранных сущностей, формат элементов, обеспечивающих атрибут нотации, или же приложение, которому адресуется инструкция обработки.] [Определение: Декларация нотации дает этой нотации название, используемое при декларировании сущности, списка атрибутов или в спецификациях атрибутов, а также внешний идентификатор этой нотации, который может позволить XML процессору или его клиентскому приложению найти вспомогательную программу, способную обработать данные, представленные в этой нотации.] Декларации нотации
Ограничение действительности: Уникальность имени нотации Любое Name может быть использовано только в одной декларации. XML процессор должен передать приложению название и внешний идентификатор(ы) всех нотаций, которые были декларированы и на которые имеется ссылка в значениях атрибутов, определениях атрибутов, либо декларациях сущностей. Кроме того, процессор может преобразовывать внешний идентификатор в системный идентификатор, имя файла или иную информацию, необходимую приложению чтобы вызвать процессор для обработки данных в описываемой нотации. (Впрочем, ситуация, когда XML документ декларирует и ссылается на нотацию, для которой не имеется соответствующего процессора обработки в системе, где работают XML процессор или приложение ошибочной не будет.) 4.8 Сущность документа[Определение: Сущность документа выступает в качестве корня дерева сущностей, а также как стартовая точка для XML процессора.] В данной спецификации не конкретизируется, каким именно образом XML процессор должен находить сущность документа - в отличие от других сущностей, сущность документа не имеет имени и вполне может появиться во входном потоке процессора вообще без какого-либо идентификатора. Назад | Содержание | Вперед
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
CITForum © 1997–2025