Расширяемый язык разметки

B Классы символов


Приводимые далее определения были представлены в стандарте Unicode. Все символы делятся на базовые символы (BaseChar, наряду с прочим сюда включены буквы латинского алфавита), идеографические символы (Ideographic), комбинированные символы (CombiningChar, в последнюю группу попадает также большинство диакритических символов). Выделяются также цифры (Digit) и расширения (Extender).



C XML и SGML (Пояснения к спецификации)


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




D Обработка ссылок на сущность и символ (Пояснения к спецификации)


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

An ampersand (&) may be escaped numerically (&) or with a general entity (&).

" >

то в ходе обработки этой декларации сущности XML процессор обнаружит ссылки на символ и обработает их прежде чем следующая строка будет использована в качестве значения сущности "example":

An ampersand (&) may be escaped numerically (&) or with a general entity (&).


Появление в документе ссылки на элемент "&example;" приведет к тому, что этот текст будет разобран снова. Будут обнаружены начальный и конечный тэги элемента p, а также будут обнаружены и обработаны все три ссылки. В результате элемент p будет иметь следующее содержание (все данные, но без ограничителей и разметки):

An ampersand (&) may be escaped numerically (&) or with a general entity (&).

Более сложный пример полностью проиллюстрирует эти правила и их эффективность. (Номера строк в следующем примере нужны лишь для комментариев.)

1 2 4 5 ' > 6 %xx; 7 ]> 8 This sample shows a &tricky; method.

В результате получается следующий сценарий:
в строке 4 ссылка на символ с кодом 37 обрабатывается сразу, и сущность параметра "xx" помещается в таблицу символов со значением "%zz;". И поскольку текст замены повторно не просматривается, ссылка на сущность параметра "zz" обнаружена не будет. (Если же это здесь произойдет, то будет зафиксирована ошибка, поскольку сущность "zz" еще не была декларирована.)

В данном приложении содержатся некоторые примеры, иллюстрирующие последовательность распознавания и обработки ссылок на сущность и символ, которая была определена в главе .
Если DTD содержит декларацию
An ampersand (&) may be escaped numerically (&) or with a general entity (&).

" >

то в ходе обработки этой декларации сущности XML процессор обнаружит ссылки на символ и обработает их прежде чем следующая строка будет использована в качестве значения сущности "example":

An ampersand (&) may be escaped numerically (&) or with a general entity (&).


Появление в документе ссылки на элемент "&example;" приведет к тому, что этот текст будет разобран снова. Будут обнаружены начальный и конечный тэги элемента p, а также будут обнаружены и обработаны все три ссылки. В результате элемент p будет иметь следующее содержание (все данные, но без ограничителей и разметки):
An ampersand (&) may be escaped numerically (&) or with a general entity (&).

Более сложный пример полностью проиллюстрирует эти правила и их эффективность. (Номера строк в следующем примере нужны лишь для комментариев.)
1 2 4 5 ' > 6 %xx; 7 ]> 8 This sample shows a &tricky; method.

В результате получается следующий сценарий:

  • в строке 4 ссылка на символ с кодом 37 обрабатывается сразу, и сущность параметра "xx" помещается в таблицу символов со значением "%zz;". И поскольку текст замены повторно не просматривается, ссылка на сущность параметра "zz" обнаружена не будет. (Если же это здесь произойдет, то будет зафиксирована ошибка, поскольку сущность "zz" еще не была декларирована.)

  • в строке 5 ссылка на символ "<" обрабатывается сразу, и сущность параметра "zz" обзаводится текстом замены "", являющимся корректной декларацией сущности.

  • в строке 6 обнаруживается ссылка на сущность "xx" и, соответственно, производится разбор текста замены для этой сущности (а именно, "%zz;"). При этом обнаруживается ссылка на сущность "zz" и тоже анализируется ее текст замены (""). В результате получаем декларацию общей сущности "tricky" с текстом замены "error-prone".

  • в строке 8, обнаруживается и обрабатывается ссылка на общую сущность "tricky". В итоге получаем полное содержимое элемента test в виде самодостаточной (и не связанной с какой-либо грамматикой) строки This sample shows a error-prone method.



    в строке 5 ссылка на символ "<" обрабатывается сразу, и сущность параметра "zz" обзаводится текстом замены "", являющимся корректной декларацией сущности.

    в строке 6 обнаруживается ссылка на сущность "xx" и, соответственно, производится разбор текста замены для этой сущности (а именно, "%zz;"). При этом обнаруживается ссылка на сущность "zz" и тоже анализируется ее текст замены (""). В результате получаем декларацию общей сущности "tricky" с текстом замены "error-prone".

    в строке 8, обнаруживается и обрабатывается ссылка на общую сущность "tricky". В итоге получаем полное содержимое элемента test в виде самодостаточной (и не связанной с какой-либо грамматикой) строки This sample shows a error-prone method.






    Декларации нотации



    [82] NotationDecl ::= ''
    [83] PublicID ::= 'PUBLIC'

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




    Декларации списка атрибутов


    используется для того, чтобы связать с пару имя-значение. Спецификация атрибута может быт дана только в , либо . Таким образом, сценарии ее обработки следует искать в главе . Декларация списка атрибутов может быть использована для:
    формирования перечня атрибутов, относящихся к определенному типу элементов.
    ограничения по типу атрибутов.
    формирования для атрибутов.

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




    Декларации сущности


    [Определение: Сущности декларируются следующим образом:]




    Декларации типа элемента


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




    Декларация кодировки



    [80] EncodingDecl ::= 'encoding' ('"' '"' | "'" "'" )
    [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* /* Названия кодировок содержат только латинские символы */

    В декларация кодировки является частью . здесь - название используемой кодировки.
    Значения "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 , осуществлялось через официальное название. Для названий остальных кодировок должны использоваться префиксы "x-". XML процессоры должны игнорировать верхний и нижний регистр в названии кодировки. Процессор должен либо интерпретировать зарегистрированное в IANA название как указание на использование зарегистрированной под этом именем кодировки, либо считать кодировку неизвестной (разумеется, один процессор не обязуется поддерживать все кодировки, которые были зарегистрированы в IANA).
    Если сущность, содержащая декларацию кодировки, предоставлена XML процессору в иной кодировке, чем было заявлено в этой декларации, или сущность, которая не начинается ни с Byte Order Mark, ни с декларации кодировки, была представлена в иной кодировке, нежели UTF-8, а внешний транспортный протокол (например, HTTP или MIME) не предоставил требуемой информации, будет зафиксирована . Заметим, что поскольку ASCII - является подмножеством UTF-8, то ASCII сущности обычно не нуждаются в декларации кодировки.
    Если обнаружена не в начале внешней сущности, фиксируется фатальная ошибка.
    Если XML процессор сталкивается с сущностью, чью кодировку он не может обработать, фиксируется . Фатальная ошибка фиксируется также если было указано (значением по умолчанию, декларацией кодировки или протоколом верхнего уровня), что XML сущность использует определенную кодировку, но в то же время содержит последовательности октетов, которые для этой кодировки недопустимы. Ну и наконец, фатальная ошибка фиксируется, если XML сущность не имеет декларации кодировки, а ее содержимое не относится ни к UTF-8, ни к UTF-16.
    Примеры деклараций текста, содержащих декларацию кодировки:






    Декларация одиночного документа


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


    [32] SDDecl ::= 'standalone' (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"'))

    Значение "yes" в декларации одиночного документа говорит об отсутствии , которые оказывали бы влияние на информацию, которую XML процессор передает приложению. Значение "no" указывает на то, что такие внешние декларации разметки имеются, либо могут быть появиться. Заметим, что декларация одиночного документа всего лишь свидетельствует о присутствии внешних деклараций. Наличие же в документе ссылок на внешние сущности, если последние уже были декларированы в самом документе, статуса одиночного документа не отменяет.
    Если внешние декларации разметки отсутствуют, то декларация одиночного документа теряет смысл. Если присутствуют внешние декларации разметки, но отсутствует декларация одиночного документа, подразумевается что она имеет значение "no".
    Любой XML документ, для которого было указано standalone="no", может быть алгоритмическим путем приведен к одиночному документу, что может потребоваться для некоторых приложений, получающих данные по сети.
    Ограничение действительности: Декларация одиночного документа
    Декларация одиночного документа должна иметь значение "no", если какие-либо внешние декларации разметки включают декларацию для:
    атрибутов со значением , если элементы, к которым эти атрибуты относятся, были представлены в документе без уточнения значений для указанных атрибутов,
    сущностей (кроме amp, lt, gt, apos и quot), если в документе встретились на эти сущности,
    атрибутов со значением, подлежащим , если этот атрибут появился в документе со значением, которое в результате этой нормализации будет изменено,
    типов элементов с , если в каком-либо экземпляре такого типа был обнаружен пробельный символ.

    Пример декларации XML с декларированием одиночного документа:





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




    [32] SDDecl ::= 'standalone' (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"'))

    Значение "yes" в декларации одиночного документа говорит об отсутствии , которые оказывали бы влияние на информацию, которую XML процессор передает приложению. Значение "no" указывает на то, что такие внешние декларации разметки имеются, либо могут быть появиться. Заметим, что декларация одиночного документа всего лишь свидетельствует о присутствии внешних деклараций. Наличие же в документе ссылок на внешние сущности, если последние уже были декларированы в самом документе, статуса одиночного документа не отменяет.
    Если внешние декларации разметки отсутствуют, то декларация одиночного документа теряет смысл. Если присутствуют внешние декларации разметки, но отсутствует декларация одиночного документа, подразумевается что она имеет значение "no".
    Любой XML документ, для которого было указано standalone="no", может быть алгоритмическим путем приведен к одиночному документу, что может потребоваться для некоторых приложений, получающих данные по сети.
    Ограничение действительности: Декларация одиночного документа
    Декларация одиночного документа должна иметь значение "no", если какие-либо внешние декларации разметки включают декларацию для:


    атрибутов со значением , если элементы, к которым эти атрибуты относятся, были представлены в документе без уточнения значений для указанных атрибутов,

  • сущностей (кроме amp, lt, gt, apos и quot), если в документе встретились на эти сущности,

  • атрибутов со значением, подлежащим , если этот атрибут появился в документе со значением, которое в результате этой нормализации будет изменено,

  • типов элементов с , если в каком-либо экземпляре такого типа был обнаружен пробельный символ.
    Пример декларации XML с декларированием одиночного документа:





    Декларация смешанного контента



    [51] Mixed ::= '(' ? '#PCDATA' (? '|' ? )* ? ')*'
    | '(' ? '#PCDATA' ? ')'

    где параметр определяет тип элементов, которые могут быть использованы в роли непосредственных потомков. Ключевое слово #PCDATA исторически унаследовано от термина "parsed character data".
    Ограничение действительности: Отсутствие дублирования типов
    Одно и то же имя не может быть представлено в декларации смешанного контента более одного раза.
    Примеры деклараций смешанного контента:






    Декларация списка атрибутов



    [52] AttlistDecl ::= ''
    [53] AttDef ::=

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




    Декларация сущности



    [70] EntityDecl ::= |
    [71] GEDecl ::= ''
    [72] PEDecl ::= ''
    [73] EntityDef ::= | ( ?)
    [74] PEDef ::= |

    используется для идентификации сущности в соответствующей , а также идентифицирует неразобранную сущность в значении атрибута ENTITY или ENTITIES. Если одна и та же сущность была декларирована несколько раз, то используется лишь первая из найденых деклараций. По выбору пользователя, XML процессор может генерировать предупреждение в случае, если имеет место многократное декларирование сущностей.




    Декларация текста


    Каждая внешняя разобранная сущность должна начинаться с декларации текста.


    [77] TextDecl ::= ''

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



    Каждая внешняя разобранная сущность должна начинаться с декларации текста.




    [77] TextDecl ::= ''

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




    Декларация типа документа



    [28] doctypedecl ::= ''
    /* */
    [28a] DeclSep ::= |
    /* */
    [29] markupdecl ::= | | | | |

    Отметим, что можно создать корректный документ, который включал бы , не ссылающийся на внешний набор деклараций и не содержащий своего внутреннего набора.
    Декларации разметки могут полностью или частично состоять из для . Сценарии, приводимые далее в спецификации для конкретных неграничных элементов (, и так далее), описывают декларации уже после всех сущностей параметров.
    Ссылка на сущность параметра распознается в любом месте DTD (внутреннем и внешнем наборах, внешних сущностях параметров) за исключением текстовых данных, инструкций обработки, комментариев и содержимого игнорируемых условных секций (см. главу ). Распознается она также и в тексте значения сущности. Использование сущностей параметров во внутреннем наборе деклараций подчиняется следующим ограничениям:
    Ограничение действительности: тип корневого элемента
    Параметр в декларации типа документа должен соответствовать типу .
    Ограничение действительности: Правильная декларация/вложенность сущности параметра
    для сущности параметра должен быть правильным образом вложен в декларации разметки. Иначе говоря, если первый или последний символ декларации разметки (см. выше ) находится в тексте замены для , то в этом тексте должен находиться и второй из указанных символов.
    Ограничение корректности: Сущности параметров во внутреннем наборе
    Во внутреннем наборе DTD может появляться только в тех местах, где могут расположиться декларации разметки, но не в самой декларации разметки. (Это не относится к ссылкам во внешних сущностях параметров или во внешнем наборе.)
    Ограничение корректности: Внешний набор
    Внешний набор, если таковой имеется, должен соответствовать сценарию для .
    Ограничение корректности: Сущность параметра между декларациями
    Текст замены для ссылки на сущность параметра в должен соответствовать сценарию .
    Вслед за внутренним набором, внешний набор и любые внешние сущности параметров, на которые делается ссылка в , должны состоять из полных наборов деклараций разметки для типов, которые разрешены неграничным символом , в сочетании с пробельными символами и . При этом отдельные фрагменты содержимого внешнего набора или сущностей внешних параметров при определенных условиях могут игнорироваться в случае построения . Во внутреннем наборе использовать такие секции не разрешается.




    Декларация типа элемента



    [45] elementdecl ::= ''
    [46] contentspec ::= 'EMPTY' | 'ANY' | |

    где параметр определяет декларируемый тип элемента.
    Ограничение действительности: Уникальность декларации типа элемента
    Ни один тип элемента не может быть декларирован более одного раза.
    Примеры деклараций типа элемента:






    Декларация внешней сущности



    [75] ExternalID ::= 'SYSTEM'
    | 'PUBLIC'
    [76] NDataDecl ::= 'NDATA'

    Если в декларации присутствует , то это общая . В противном случае, сущность является разобранной.
    Ограничение действительности: Декларированная нотация
    должно соответствовать декларированному имени .
    [Определение: Литерал называется системным идентификатором сущности. Он представляет собой ссылку URI (чье определение было дано в , а затем дополнено в ), которую необходимо разобрать, чтобы получить данные на вход XML процессора и сформировать текст замены для указанной сущности.] Если идентификатор фрагмента (начинающийся с символа #) окажется в составе системного идентификатора, фиксируется ошибка. Для обработки относительных адресов URI в качестве базового берется адрес того источника, в котором была обнаружена декларация данной сущности, если обратное не было указано в ином источнике информации помимо данной спецификация (например, когда специальный тип XML элемента был определен в отдельном DTD или инструкция обработки определена спецификацией конкретного приложения). Таким образом, URI может вычисляться относительно , относительно сущности, содержащей , или какой-либо другой .
    Ссылки URI требуют кодирования и маскирования (escaping) определенных символов. Среди запрещенных символов числятся все не-ASCII символы, а также исключенные символы, перечисленные в главе 2.4 документа . Исключение составляют символы решетки (#) и процента (%), а также символы квадратных скобок, разрешенные документом . Запрещенные символы необходимо маскировать следующим образом:
    Каждый из запрещенных символов преобразуется в один или два байта в кодировке UTF-8 .
    Все октеты, относящиеся к запрещенным символам, маскируются с помощью соответствующего механизма URI (то есть преобразуются в формат %HH, где HH - шестнадцатеричное представление для соответствующего байтового значения).
    Исходный символ замещается полученной последовательностью символов.


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

    Примеры деклараций внешней сущности:




    Декларирование нотаций


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




    Диапазон символов



    [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* любой символ Unicode, исключая суррогатные блоки, FFFE и FFFF. */

    Механизм шифрования символьных кодов использует битовые шаблоны, которые могут меняться от сущности к сущности. Все XML процессоры должны иметь возможность работать с кодировками UTF-8 и UTF-16 из набора 10646. Механизм для указания используемой кодировки и подключения новых кодировок обсуждается позднее в главе .




    Документ



    [1] document ::= element Misc*

    Соответствие сценарию подразумевает следующее:
    В данном объекте содержится один или несколько .
    [Определение: В объекте имеется в точности один элемент, называемый корневым или элементом документа, ни одна из частей которого не попадает в какого-либо еще элемента.] Для всех остальных элементов действует правило, что если находится в содержимом некого элемента, то и должен находиться среди содержимого того же элемента. Проще говоря, элементы, маркируемые начальными и конечными тэгами, должны быть вложены друг в друга правильным образом.

    [Определение: Из вышесказанного следует что в документе для любого некорневого элемента C имеется другой элемент P из этого же документа, такой что C находится в содержимом P, но при этом не попадает в содержимое какого-либо третьего элемента, также находящегося в содержимом элемента P. В таком случае об элементе P говорят как о родителе элемента C, а элемент C называют непосредственным потомком элемента P.]




    Документы


    [Определение: Объект данных становится XML документом если, в соответствии с определениями обсуждаемой спецификации, он является . Корректный XML документ также может стать , если отвечает некоторым дополнительным ограничениям.]
    Каждый XML имеет логическую и физическую структуру. Физически документ состоит из элементов, называемых . Любая сущность может на другие сущности, обеспечивая их включение в данный документ. Документ начинается с "корня" или . С логической точки зрения, документ строится из деклараций, элементов, комментариев, ссылок на символ и инструкций обработки. Все они размечаются в документе явным образом. Логические и физические структуры должны иметь корректную вложенность, как было описано в главе .




    E Детерминистические модели содержания (Пояснения к спецификации)


    Как указывалось в главе , необходимо чтобы модели содержимого, даваемые в декларациях типов элементов, были детерминистическими. Данное требование необходимо с языком 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 . Во многих таких алгоритмах для каждой части в регулярном выражении строится сопроводительный набор команд (то есть, в дереве синтаксиса данного регулярного выражения стоится каждый узел листа). Если какая-либо часть выражения имеет сопроводительный набор, в котором более одной позиции сопоставлено с типом элементов с одним и тем же названием, модель содержимого ошибочна и об этом можно сообщать как об ошибке.
    Существуют алгоритмы, которые способны многие (хотя и не все) недетерминистические модели содержания автоматически привести к эквивалентным детерминистическым моделям (см. Brüggemann-Klein 1991 ).




    F.1 Определение без внешней информации о кодировке


    Поскольку ни одна из сущностей XML не сопровождается внешней информацией о кодировке и не пользуется кодировками UTF-8 или UTF-16, то первой должна идти декларация кодировки XML. Первыми ее символами должны быть ' с Byte Order Mark:

    00 00 FE FF UCS-4, big-endian машина (1234 порядок)
    FF FE 00 00 UCS-4, little-endian машина (4321 порядок)
    00 00 FF FE UCS-4, необычный порядок октетов (2143)
    FE FF 00 00 UCS-4, необычный порядок октетов (3412)
    FE FF ## ## UTF-16, big-endian
    FF FE ## ## UTF-16, little-endian
    EF BB BF UTF-8

    без Byte Order Mark:

    0000 00 3C UCS-4 или иная кодировка с 32-битным кодом, а также ASCII символы, кодированные как ASCII значения, с порядком следования байтов big-endian (1234), little-endian (4321) и нетипичными (2143 и 3412) соответственно. Чтобы определить, какая из поддерживаемых UCS-4 и других 32-битных кодировок используется, необходимо прочесть декларацию кодировки.
    3C 00 00 00
    00 00 3C 00
    00 3C 00 00
    00 3C 00 3F UTF-16BE, big-endian ISO-10646-UCS-2 либо иная кодировка с 16-битным кодом и порядком следования big-endian, а также ASCII символы, кодированные как ASCII значения (для их идентификации необходимо прочесть декларацию кодировки)
    3C 00 3F 00 UTF-16LE, little-endian ISO-10646-UCS-2, либо иная кодировка с 16-битным кодом и порядком следования little-endian, а также ASCII символы, кодированные как ASCII значения (для их идентификации необходимо прочесть декларацию кодировки)
    3C 3F 78 6D UTF-8, ISO 646, ASCII, некоторое подмножество ISO 8859, Shift-JIS, EUC, или же любая другая 7-ми и 8-ми битная кодировка, кодировка переменной длины, которая гарантирует, что ASCII символы будут занимать свои нормальные позиции, иметь обычную ширину и значения. Чтобы определить, которая из этих кодировок находится в работе, необходимо прочесть действительную декларацию кодировки. Поскольку во всех перечисленных кодировках для требуемых ASCII символов используются одни и те же битовые шаблоны, то соответствующую декларацию кодировки можно прочесть всегда.
    4C 6F A7 94 EBCDIC (С некоторыми особенностями. Чтобы выяснить, которая из кодовых страниц была задействована, необходимо прочесть полную декларацию кодировки.)
    остальное UTF-8 без декларации кодировки, или неверный заголовок потока данных (отсутствие необходимой декларации кодировки), искажение, фрагментарность или результат обработки каким-либо архиватором
    <
    Поскольку ни одна из сущностей XML не сопровождается внешней информацией о кодировке и не пользуется кодировками UTF-8 или UTF-16, то первой должна идти декларация кодировки XML. Первыми ее символами должны быть ' с Byte Order Mark:
    00 00 FE FF UCS-4, big-endian машина (1234 порядок)
    FF FE 00 00 UCS-4, little-endian машина (4321 порядок)
    00 00 FF FE UCS-4, необычный порядок октетов (2143)
    FE FF 00 00 UCS-4, необычный порядок октетов (3412)
    FE FF ## ## UTF-16, big-endian
    FF FE ## ## UTF-16, little-endian
    EF BB BF UTF-8

    без Byte Order Mark:
    0000 00 3C UCS-4 или иная кодировка с 32-битным кодом, а также ASCII символы, кодированные как ASCII значения, с порядком следования байтов big-endian (1234), little-endian (4321) и нетипичными (2143 и 3412) соответственно. Чтобы определить, какая из поддерживаемых UCS-4 и других 32-битных кодировок используется, необходимо прочесть декларацию кодировки.
    3C 00 00 00
    00 00 3C 00
    00 3C 00 00
    00 3C 00 3F UTF-16BE, big-endian ISO-10646-UCS-2 либо иная кодировка с 16-битным кодом и порядком следования big-endian, а также ASCII символы, кодированные как ASCII значения (для их идентификации необходимо прочесть декларацию кодировки)
    3C 00 3F 00 UTF-16LE, little-endian ISO-10646-UCS-2, либо иная кодировка с 16-битным кодом и порядком следования little-endian, а также ASCII символы, кодированные как ASCII значения (для их идентификации необходимо прочесть декларацию кодировки)
    3C 3F 78 6D UTF-8, ISO 646, ASCII, некоторое подмножество ISO 8859, Shift-JIS, EUC, или же любая другая 7-ми и 8-ми битная кодировка, кодировка переменной длины, которая гарантирует, что ASCII символы будут занимать свои нормальные позиции, иметь обычную ширину и значения. Чтобы определить, которая из этих кодировок находится в работе, необходимо прочесть действительную декларацию кодировки. Поскольку во всех перечисленных кодировках для требуемых ASCII символов используются одни и те же битовые шаблоны, то соответствующую декларацию кодировки можно прочесть всегда.
    4C 6F A7 94 EBCDIC (С некоторыми особенностями. Чтобы выяснить, которая из кодовых страниц была задействована, необходимо прочесть полную декларацию кодировки.)
    остальное UTF-8 без декларации кодировки, или неверный заголовок потока данных (отсутствие необходимой декларации кодировки), искажение, фрагментарность или результат обработки каким-либо архиватором
    <


    Примечание:

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

    Описанный механизм автоматического распознавания кодировки достаточен для того, чтобы прочесть декларацию кодировки XML и получить идентификатор кодировки символов, который по-прежнему необходим для распознавания отдельных членов в каждой группе кодировок (например, чтобы выделить UTF-8 из 8859, отделить друг от друга отдельные части набора 8859, идентифицировать используемую кодовую страницу EBCDIC и так далее).

    Поскольку содержимое декларации кодировки ограничено набором ASCII символов (хотя и скрыто под кодировкой), процессор сможет надежно прочесть всю декларацию кодировки, как только разберется, какая была использована группа кодировок. Поскольку практически все широко используемые кодировки символов попадают в одну из перечисленных выше категорий, то декларирование кодировки XML позволяет достаточно надежно обозначать кодировку символов даже в тех случаях, когда внешние источники информации в операционной системе или на уровне транспортного протокола окажутся ненадежны. Однако такие кодировки символов, как UTF-7, переопределяющие байты ASCII-значений, не могут быть идентифицированы надежно.

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

    Как и любые другие самораспознаваемые системы, декларация кодировки XML не сможет работать, если какая-нибудь программа поменяла используемый для сущности набор символов или кодировку, не изменив при этом соответствующим образом декларацию кодировки. Программистам, разрабатывающим процедуры кодирования символов, необходимо тщательно проверять достоверность внешней и внутренней информации, используемой для маркировки сущностей.



    Примечание:

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

    Описанный механизм автоматического распознавания кодировки достаточен для того, чтобы прочесть декларацию кодировки XML и получить идентификатор кодировки символов, который по-прежнему необходим для распознавания отдельных членов в каждой группе кодировок (например, чтобы выделить UTF-8 из 8859, отделить друг от друга отдельные части набора 8859, идентифицировать используемую кодовую страницу EBCDIC и так далее).

    Поскольку содержимое декларации кодировки ограничено набором ASCII символов (хотя и скрыто под кодировкой), процессор сможет надежно прочесть всю декларацию кодировки, как только разберется, какая была использована группа кодировок. Поскольку практически все широко используемые кодировки символов попадают в одну из перечисленных выше категорий, то декларирование кодировки XML позволяет достаточно надежно обозначать кодировку символов даже в тех случаях, когда внешние источники информации в операционной системе или на уровне транспортного протокола окажутся ненадежны. Однако такие кодировки символов, как UTF-7, переопределяющие байты ASCII-значений, не могут быть идентифицированы надежно.

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

    Как и любые другие самораспознаваемые системы, декларация кодировки XML не сможет работать, если какая-нибудь программа поменяла используемый для сущности набор символов или кодировку, не изменив при этом соответствующим образом декларацию кодировки. Программистам, разрабатывающим процедуры кодирования символов, необходимо тщательно проверять достоверность внешней и внутренней информации, используемой для маркировки сущностей.




    F.2 Приоритеты при наличии внешней информации о кодировке


    Вторая из возможных ситуаций возникает когда XML сущность сопровождает информация о кодировке, извлекаемая из некоторых файловых систем и сетевых протоколов. Если имеется несколько источников информации, то их относительный приоритет и предпочтительный способ разрешения конфликтов должны определяться протоколом более высокого уровня, используемым для передачи XML документов. В частности, можно обратиться к и наследующим его документам, определяющим типы MIME text/xml и application/xml, а также содержащим полезное руководство. Однако в целях совместимости желательно руководствоваться следующим правилом:
    Если сущность XML находится в файле, то для определения кодировки символов, как правило, используются Byte-Order Mark и декларация кодировки (если таковые имеются).





    F Автоматическое определение кодировки символов (Пояснения к спецификации)


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




    Физические структуры


    [Определение: XML документ может состоять из одной или нескольких единиц размещения, называемых сущностями. Все сущности имеют (исключение составляют и ) и идентифицируются по имени.] Каждый XML документ имеет ровно одну сущность, называемую , которая служит стартовой точкой для и может содержать документ целиком.
    Сущности могут быть разобранными либо неразобранными. [Определение: Содержимое разобранной сущности (parsed entity) называется ее . Этот рассматривается как составная часть документа.]
    [Определение: Неразобранная сущность (unparsed entity) - это ресурс, содержимым которого может быть , либо что-нибудь другое. Даже если это текст, это не обязательно должно быть XML. С каждой неразобранной сущностью связана , идентифицируемая по имени. Помимо того, что XML процессор должен предоставить приложению идентификаторы сущности и ее нотацию, спецификация XML не предъявляет никаких требований к содержимому неразобранной сущности.]
    Разобранные сущности вызываются по имени посредством ссылки на сущность, а неразобранные сущности - по имени, указанному в значении атрибута ENTITY или ENTITIES.
    [Определение: Общая сущность (general entity) - это сущность для использования в содержимом документа. В рамках данной спецификации общие сущности часто обозначаются неформальным термином сущность (entity), если это не приводит к двусмысленности.] [Определение: Сущность параметра - это разобранная сущность для использования в DTD.] Существует два типа сущностей, использующих различный формат ссылки и распознаваемых в различном контексте. Более того, эти типы занимают разные пространства имен. Сущность параметра и общая сущность с тем же самым именем в действительности являются различными сущностями.




    Расширяемый язык разметки


    Данная спецификация была подготовлена и принята к публикации рабочей группой W3C XML (W3C XML Working Group, WG). Однако из того, что WG приняла данную спецификацию, не следует, что все члены WG единогласно проголосовали за это решение. Настоящие и бывшие члены XML WG:
  • Jon Bosak, Sun (Председатель)
  • James Clark (Технический руководитель)
  • Tim Bray, Textuality and Netscape (XML со-редактор)
  • Jean Paoli, Microsoft (XML со-редактор)
  • C. M. Sperberg-McQueen, U. of Ill. (XML со-редактор)
  • Dan Connolly, W3C (представитель W3C)
  • Paula Angerstein, Texcel
  • Steve DeRose, INSO
  • Dave Hollander, HP
  • Eliot Kimber, ISOGEN
  • Eve Maler, ArborText
  • Tom Magliery, NCSA
  • Murray Maloney, SoftQuad, Grif SA, Muzmo and Veo Systems

  • MURATA Makoto (FAMILY Given), Fuji Xerox Information Systems
  • Joel Nava, Adobe
  • Conleth O'Connell, Vignette
  • Peter Sharpe, SoftQuad
  • John Tigue, DataChannel





  • I Рабочие заметки (Пояснения к спецификации)


    Вторая редакция спецификации была также преобразована в (для которой имеется соответствующая ). HTML версии спецификации были получены с помощью XSLT стилей , и . PDF версия документа была получена с помощью инструментария и программы выделения.





    Идентификация языка


    В ходе обработки документа часто бывает полезным идентифицировать, на каком из естественных или формальных языков он был записан. Для идентификации языка, который использовался при записи содержимого и значений атрибутов любого элемента, в документе может быть указан специальный с названием xml:lang. Если этот атрибут используется в действительном документе, то, как и любой другой, он должен быть . Значением этого атрибута являются идентификаторы языков, определенные в документе (Тэги для идентификации языков) или наследующих его стандартах IETF.
    Замечание:
    В указанные тэги строятся из двухсимвольного кода языка, заданного в , двухсимвольного кода страны, определенного в или же языкового идентификатора, зарегистрированного в Internet Assigned Numbers Authority . Предполагается, что для идентификации языков, которые в настоящий момент не упомянуты в спецификации , стандарты, наследующие , будут дополнены трехсимвольными кодами.
    (Сценарии грамматики с 33 по 38 изъяты из спецификации.)
    Например:

    The quick brown fox jumps over the lazy dog.

    What colour is it?

    What color is it?

    Habe nun, ach! Philosophie, Juristerei, und Medizin und leider auch Theologie durchaus studiert mit heiЯem Bemьh'n.

    Предполагается, что информация, представленная в xml:lang, относится ко всем атрибутам и всему содержимому элемента, где этот атрибут был указан (при условии, что в содержимом этого элемента она не была затем переопределена новым экземпляром атрибута xml:lang в другом элементе).
    Простая декларация атрибута xml:lang может иметь вид
    xml:lang NMTOKEN #IMPLIED

    Если это необходимо, для этого атрибута могут быть представлены значения по умолчанию. В сборнике французской поэзии (poem) для английских студентов, содержащем глоссарий (gloss) и пометки на английском языке (note), атрибут xml:lang может быть декларирован следующим образом:






    Имена и лексемы



    [4] NameChar ::= | | '.' | '-' | '_' | ':' | |
    [5] Name ::= ( | '_' | ':') ()*
    [6] Names ::= ( )*
    [7] Nmtoken ::= ()+
    [8] Nmtokens ::= ( )*

    Строковые данные (literal data) - это любая заключенная в кавычки строка, внутри которой нет кавычек, которые можно было бы принять за разделители этой строки. Строковые данные, или литералы (literals), применяются для указания содержимого внутренних сущностей (), значений атрибутов () и внешних идентификаторов (). Заметим, что идентификатор может быть обработан без проверки разметки.




    Инструкции обработки


    [Определение: Инструкции обработки (processing instruction, PI) позволяют размещать в документе инструкции для приложений.]


    [16] PI ::= '' *)))? '?>'
    [17] PITarget ::= - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

    Хотя PI не относятся к документа, они точно так же должны быть переданы приложению. Инструкция PI начинается с указания адреса (), используемого для идентификации приложения, которому предназначается эта инструкция. Адреса с названиями "XML", "xml" и аналогичными зарезервированы для стандартизации в текущей и последующих версиях спецификации. Для формального декларирования адресата инструкции PI может использоваться механизм XML. Ссылки на сущность параметра в инструкциях обработки не распознаются.



    [Определение: Инструкции обработки (processing instruction, PI) позволяют размещать в документе инструкции для приложений.]




    [16] PI ::= '' *)))? '?>'
    [17] PITarget ::= - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

    Хотя PI не относятся к документа, они точно так же должны быть переданы приложению. Инструкция PI начинается с указания адреса (), используемого для идентификации приложения, которому предназначается эта инструкция. Адреса с названиями "XML", "xml" и аналогичными зарезервированы для стандартизации в текущей и последующих версиях спецификации. Для формального декларирования адресата инструкции PI может использоваться механизм XML. Ссылки на сущность параметра в инструкциях обработки не распознаются.




    Использование XML процессоров


    Поведение проверяющего XML процессора в значительной мере предсказуемо: он должен почесть все части документа и сообщить обо всех нарушениях правил корректности и действительности. Меньшее требуется от непроверяющего процессора: он не должен читать какие-либо части документа кроме сущности документа. Для использования XML процессоров существенное значение могут иметь два эффекта:
    Непроверяющим процессором могут не распознаваться определенные ошибки корректности, особенно те, которые требуют прочтения внешних сущностей. Примером здесь служит нарушение ограничений , и , а также некоторые варианты, описанные в качестве в главе .
    Информация, передаваемая процессором приложению, может меняться в зависимости от того, прочел ли этот процессор параметры и внешние сущности. Например, непроверяющий процессор может не выполнить значений атрибутов, не осуществить текста замены для внутренних сущностей или не предоставить , если это связано с прочтением деклараций во внешних сущностях и сущностях параметров.

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




    J Словарь (Пояснения к спецификации)


    При подготовке документа для ряда ключевых терминов был выбран следующий вариант перевода:
    character data - символьные данные

    conditional section - условная секция

    constraint - ограничение, правило, условие

    entity - сущность

    enumerated type - перечислимый тип

    escape character - маскирование символа

    literal data, literals - строковые данные, литералы

    non-terminal symbol - неграничный символ

    name character - символ имени

    nonterminal content - незавершенное содержание

    non-validating processor - непроверяющий процессор

    numeric character reference - числовая ссылка на символ

    parsed entities - разобранные сущности

    production - сценарий (грамматики)

    standalone document - одиночный документ

    storage unit - единица размещения

    subset - набор (внутренний, внешний) в DTD

    token - лексема

    tokenized type - символьный тип

    valid document - действительный документ

    validating XML processor - проверяющий XML процессор

    well-formed - корректный

    white space - пробельный символ

    Если у вас возникли какое-либо замечания, мы будем рады их получить по адресу .




    Элемент



    [39] element ::=
    |

    Данная спецификация не ограничивает семантику, порядок использования (за исключением синтаксиса), выбор имен для атрибутов и типов элементов. Ограничение заключается в том, что имена, чье начало соответствует шаблону (('X'|'x')('M'|'m')('L'|'l')), зарезервированы для стандартизации в текущей и последующих версиях данной спецификации.
    Ограничение корректности: Соответствие типов элементов
    Параметр в конечном тэге элемента должен соответствовать типу элемента в начальном тэге.
    Ограничение действительности: Действительность элемента
    Элемент считается действительным, если имеется декларация, соответствующая , в которой параметр соответствует типу элемента, а также выполняется одно из следующих условий:
    Декларация соответствует EMPTY, а элемент не имеет .
    Декларация соответствует элемента, а последовательность его непосредственных , принадлежит языку, генерируемому регулярным выражением в модели содержимого с необязательным пробельным символом (символами, соответствующими неграничному ) между начальным тэгом и первым из непосредственных элементов-потомков, между элементами-потомками, между последним элементом-потомком и закрывающим тэгом. Заметим, что в секция CDATA, содержащая лишь пробельный символ, не соответствуют нетерминальному , а следовательно в указанных позициях появиться не может.
    Декларация соответствует , а содержимое состоит из и , тип которых соответствует именам в модели содержимого.
    Декларация соответствует ANY, и был декларирован тип всех .





    Кодирование символов в сущностях


    Каждая из внешних разобранных сущностей в XML документе для своих символов может использовать собственную кодировку. Все XML процессоры должны уметь читать сущности в кодировках UTF-8 и UTF-16. В данной спецификации термины "UTF-8" и "UTF-16" не имеют отношения к кодировкам символов с какими-либо иными названиями, даже если эти кодировки и названия очень похожи на UTF-8 или UTF-16.
    Сущности с кодировкой UTF-16 должны начинаться с Byte Order Mark, описанного в Приложении F документа , Приложении H документа , главе 2.4 документа и главе 2.7 документа (символ ZERO WIDTH NO-BREAK SPACE, #xFEFF). Причем это сигнатура кодировки, а не фрагмент разметки или символьных данных XML документа. XML процессоры должны уметь с помощью этого символа различать документы в кодировках UTF-8 и UTF-16.
    Хотя от XML процессор обязуется читать сущности в кодировках UTF-8 и UTF-16, в мире существует и иные кодировки. Поэтому XML процессору потребуется читать сущности и в других кодировках. В отсутствие внешней информации о кодировке символа (например, в MIME заголовке), разобранные сущности, представленные в иной кодировке, нежели UTF-8 и UTF-16, должны начинаться с декларации текста (см. главу ), содержащей декларацию кодировки:




    в любом месте документа при


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



    [15] Comment ::= ''

    Пример комментария:


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


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



    [15] Comment ::= ''

    Пример комментария:

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


    Конечный тэг



    [42] ETag ::= ''

    Пример конечного тэга:


    [Определение: , заключенный между начальным и конечным тэгами, называется содержимым элемента:]




    Корректная внешняя разобранная сущность



    [78] extParsedEnt ::= ?

    Внутренняя общая разобранная сущность является корректной если ее текст замены соответствует сценарию . Все внутренние сущности параметров являются корректными по определению.
    Следствием корректности сущностей является правильная вложенность логических и физических структур в XML документе: и , , , , , , а также не могут начинаться в одной сущности и заканчиваться в другой.




    Корректные разобранные сущности


    Сущность документа является корректной, если она соответствует сценарию . Внешняя общая разобранная сущность является корректной, если она соответствует сценарию . Все внешние сущности параметров являются корректными по определению.




    Корректные XML документы


    [Определение: Текстовый объект становится корректным (well-formed) XML документом, если:]
    как единое целое, он соответствует сценарию .
    отвечает всем ограничениям корректности, представленным в этой спецификации.
    Все , на которые в данном документе прямо или косвенно делается ссылка, являются (well-formed).





    Литералы



    [9] EntityValue ::= '"' ([^%&"] | | )* '"'
    | "'" ([^%&'] | | )* "'"
    [10] AttValue ::= '"' ([^<&"] | )* '"'
    | "'" ([^<&'] | )* "'"
    [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'")
    [12] PubidLiteral ::= '"' * '"' | "'" ( - "'")* "'"
    [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]

    Замечание:
    Хотя сценарий и позволяет определить сущность, состоящую из одного единственного простого символа < в строке данных (имеется ввиду ), настоятельно рекомендуется избегать подобной практики, поскольку любая ссылка на указанную сущность приведет к появлению ошибки корректности.




    Логические структуры


    [Определение: Каждый содержит один или несколько элементов, границы каждого из которых обозначены либо парой - , либо (если это элемент) . Каждый элемент имеет определенный тип, который идентифицируется по имени и иногда называется "общим идентификатором" этого элемента (generic identifier - GI), а также может иметь набор спецификаций к атрибутам.] Каждая спецификация атрибута содержит его и .




    Модели содержимого элемента



    [47] children ::= ( | ) ('?' | '*' | '+')?
    [48] cp ::= ( | | ) ('?' | '*' | '+')?
    [49] choice ::= '(' ? ( ? '|' ? )+ ? ')' /* */
    /* */
    [50] seq ::= '(' ? ( ? ',' ? )* ? ')' /* */

    где каждая запись - это тип элемента, который может выступить в роли . Любой фрагмент содержимого в списке выбора может быть помещен в в то место, где согласно грамматике располагался соответствующий список выбора. Все фрагменты содержимого в последовательном списке должны быть вставлены в и именно в том прядке, как они были представлены в исходном списке. Необязательный символ, следующий за именем (или списком), указывает, должен ли данный элемент (или фрагменты из данного списка) быть повторен один или более раз (+), нуль или более раз (*), либо нуль или один раз (?). Отсутствие такого оператора означает, что данный элемент (или фрагмент) должен появиться ровно один раз. Представленный синтаксис и его значение те же самые, что используются в сценариях самой спецификации.
    Содержимое элемента соответствует модели содержания тогда и только тогда, когда можно проследить способ его получения из этой модели в соответствии с операторами последовательности, выбора и повторения, а также такой, что каждый элемент в содержании соответствует типу элемента в модели содержания. Если какой-либо элемент в документе может быть сопоставлен нескольким типам элементов в модели содержания, то для сохранения процессор должен фиксировать ошибку. За дополнительной информацией обращайтесь к Приложению .
    Ограничение действительности: Правильная вложенность Group/PE
    для сущности параметра должен иметь правильно вложенные группы скобок. Иными словами, если в конструкциях , или открывающая или закрывающая скобка была включена в текст замены для , то в этот текст должна попадать и вторая парная скобка.
    Если в конструкциях , или обнаружена ссылка на сущность параметра, то, , ее текст замены должен содержать хотя бы один символ, отличный от пробела. И ни первый, ни последний символ в тексте замены, отличный от пробела, не должен быть соединителем (| или ,).
    Примеры моделей содержимого элемента:






    Начальные тэги, конечные тэги и тэги пустых элементов


    [Определение: Начало любого непустого XML элемента помечается начальным тэгом.]




    Начальный тэг



    [40] STag ::= '<' ( )* ? '>'
    [41] Attribute ::=

    Параметр в начальном и конечном тэгах определяет тип элемента. [Определение: Пара - называется спецификацией атрибута для данного элемента], [Определение: Параметр в каждой такой паре называется именем атрибута], а [Определение: содержимое поля - текст в одинарных (') или двойных (") кавычках - называется значением атрибута.] Заметим, что очередность появления спецификаций атрибутов в начальном тэге или тэге пустого элемента значения не имеет.
    Ограничение корректности: Уникальность спецификации атрибута
    В границах одного начального тэга (или тэга пустого элемента) одно и то же имя атрибута не может появляться более одного раза.
    Ограничение действительности: Тип значения атрибута
    Атрибут должен быть декларирован, его значение должно иметь тот тип, который был декларирован для него. (Описание типов атрибутов см. в главе .)
    Ограничение корректности: Отсутствие ссылок на внешние сущности
    Значение атрибута не может иметь содержать прямых или косвенных ссылок на внешние сущности.
    Ограничение корректности: Отсутствие символов < в значениях атрибута
    Символ < не может содержаться в для сущностей, на которые в значении атрибута прямо или косвенно дается ссылка.
    Пример начального тэга:

    [Определение: Любой элемент, чье начало отмечено начальным тэгом, должен завершиться конечным тэгом, имя которого повторяет тип элемента, указанный в начальном тэге:]




    Не распознается


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




    Нормализация значения атрибута


    Перед передачей значения атрибута приложению или проверкой его корректности XML процессор должен выполнить нормализацию полученного значения атрибута по описанному далее алгоритму либо как-нибудь иначе, например передав это значение отдельному приложению, реализующему указанный алгоритм.
    Все концы строк при выводе должны быть приведены к #xA, как было описано в главе , поэтому остальная часть данного алгоритма оперирует текстом, уже нормализованным подобным образом.
    Начинается с нормализованного значения, состоящего из пустой строки.
    Для каждого символа, ссылки на сущность и ссылки на символ в ненормализованном значении атрибута, с первого до последнего, должны выполняться следующие действия:

      Для ссылки на символ к нормализованное значение поместить символ, на который делалась ссылка.
      Для ссылки на сущность над текстом замены для указанной сущности рекурсивно выполнять третий шаг обсуждаемого алгоритма.
      В случае пробельного символа (#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
      a="

      xyz"
      x y z #x20 #x20 x y z
      a="&d;&d;A&a;&a;B&da;"
      A #x20 B #x20 #x20 A #x20 #x20 B #x20 #x20
      Заметим, что последний пример недействителен (хотя и корректен), если объявлено, что a имеет тип NMTOKENS.




      соответствует 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: ... ]

      ограничение действительности. Идентифицирует по имени ограничение для документов, связанное с неким сценарием.




      Нотация


      Формальная грамматика языка XML строится в данной спецификации с помощью простой нотации Extended Backus-Naur Form (EBNF). Каждое правило в грамматике определяет один символ (symbol) в следующем формате:
      a= " A B "
      #xD #xD A #xA #xA B #xD #xA #xD #xD A #xA #xA B #xD #xD

      symbol ::= expression

      Каждый символ, являющийся оригинальным в языке нормативов, пишется с заглавной буквы. В остальных случаях, первая буква символа прописная. Строки текста помещаются в кавычки.
      В правой части правила представлено выражение, использующее следующие конструкции, сопоставляемые строкам из одного или нескольких символов:
      #xN
      где N - шестнадцатеричное целое число. Данное выражение соответствует символу в кодировке ISO/IEC 10646, каноническое значение кода (UCS-4) которого как беззнаковое целое число, имеет указанное значение. Количество ведущих нулей в формате #xN значения не имеет. Количество ведущих нулей в соответствующем значении кода определяется используемой кодировкой символов и для XML значения не имеет.
      [a-zA-Z], [#xN-#xN]
      соответствует любому , чье значение попадает в указанный диапазон(ы) (включительно).
      [abc], [#xN#xN#xN]
      соответствует любому , чье значение имеется среди перечисленных символов. В пределах одного набора скобок перечисления и диапазоны могут сочетаться.
      [^a-z], [^#xN-#xN]
      соответствует любому , чье значение не входит в указанный диапазон.
      [^abc], [^#xN#xN#xN]
      соответствует любому , чьего значение нет среди указанных символов. В пределах одного набора скобок перечисления и диапазоны запрещенных значений могут сочетаться.
      "string"
      соответствует строке символов, со строкой, представленной в двойных кавычках.
      'string'
      соответствует строке символов, со строкой, представленной в одинарных кавычках.
      Представленные символы могут комбинироваться в более сложные шаблоны следующим образом (где A и B представляют собой простые выражения):
      (выражение)
      данное выражение обрабатывается как единое целое и может комбинироваться с другими выражениями в соответствии с дальнейшим перечнем.
      A?
      соответствует A или ничему. Необязательная единица A.




      Обработка концов строк


      Часто XML, помещенные в компьютерные файлы, для удобства редактирования представляются в виде набора строк. В качестве разделителя для таких строк обычно используется некая комбинация символов возврата каретки (#xD) и конца строки (#xA).
      Чтобы облегчить работу , текст, который им передает , должен быть таким, как если бы этот процессор при выводе перед обработкой нормализовал все концы строк во внешних разобранных сущностях (а также сущности самого документа). Осуществляться это должно путем замены последовательности из двух символов #xD #xA (а также одиночного #xD, за которым не следует #xA) одним символом #xA.




      Обработка пробельных символов


      В ходе редактирования XML документов часто бывает удобно воспользоваться "пробельными символами" (white space - пробелы, табуляторы и пустые строки) для выделения разметки для лучшей читаемости. Такие пробельные символы обычно не должны попадать в ту версию документа, которая передается в приложение. С другой стороны, часто встречаются "значимые" пробельные символы, которые должны быть оставлены в передаваемом документе, например если это стихи или исходный код программы.
      должен всегда передавать приложению все символы документа, не относящиеся к разметке. дополнительно должен проинформировать приложение о том, какие из этих символов соответствуют пробельным символам в .
      К элементу может быть приставлен специальный , называемый xml:space, для того чтобы показать, что пробельные символы в этом элементе должны быть сохранены. Если этот атрибут используется в действительных документах, то, как и любой другой, он должен быть . Будучи декларирован, он должен быть представлен как , значениями которого являются одно или оба значения "default" и "preserve". Например:


      Значение атрибута "default" говорит о том, что для данного элемента используется режим обработки пробельных символов, применяемый в приложениях по умолчанию. Значение "preserve" говорит о том, что приложения должны сохранить все пробельные символы. Декларированное таким образом правило относится ко всем элементам, находящимся среди содержимого того элемента, которому был назначен данный атрибут (при условии что это правило не было затем переопределено другим экземпляром атрибута xml:space).
      Считается что любого документа не имеет указаний о том, каким образом приложение будет обрабатывать пробелы, если для этого атрибута не было дано соответствующего значения и этот атрибут не был представлен среди значений по умолчанию.




      Обработка XML процессором сущностей и ссылок


      В представленной далее таблице собраны сведения о контексте, в котором могут появиться ссылки на символы, ссылки на сущность, а также вызовы неразобранных сущностей, и какая в каждом случае потребуется реакция от . Записи в левой колонке описывают распознаваемый контекст:
      Ссылка в содержимом
      Ссылка в любом месте элемента в интервале между и тэгами. Соответствует незавершенному (nonterminal) .
      Ссылка в значении атрибута
      Ссылка либо в значении атрибута , либо в значении по умолчанию из . Соответствует незавершенному .
      Значение атрибута
      Это не ссылка, а лексема типа . Выступает либо как значение атрибута, декларированного с типом ENTITY, либо как одна из лексем, перечисленных через пробел в значении атрибута, декларированного с типом ENTITIES.
      Ссылка в значении сущности
      Ссылка из параметра или внутренней сущности, находящихся в декларации сущности. Соответствует незавершенной .
      Ссылка в DTD
      Ссылка во внутреннем или внешнем наборе , не попавшая в конструкции , , , , , , а также содержимое игнорируемой условной секции (см. главу ).

      Тип сущности Символ
      Параметр Внутренняя общая Внешняя разобранная общая Неразобранная
      Ссылка в содержимом Запрещен Включается
      Ссылка в значении атрибута
      Значение атрибута
      Ссылка в значении сущности
      Ссылка в DTD Запрещен





      Общие синтаксические конструкции


      В данной главе определяются некоторые символы, широко используемые в грамматике XML.
      (пробельный символ, white space) состоит из одного или нескольких символов пробела (#x20), возврата каретки, конца строки или табулятора.




      Построение текста замены для внутренней сущности


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




      тогда текст замены для сущности "book":

      La Peste: Albert Camus, © 1947 Éditions Gallimard. &rights;

      Ссылка на общую сущность "&rights;" должна расшифроваться только тогда, когда ссылка "&book;" попадает в содержимое документа или значение атрибута.
      Эти простые правила могут иметь сложные взаимоотношения. Детальное обсуждение сложного примера этого см. в Приложении .




      Предопределенные сущности


      [Определение: Ссылки на сущность и символ могут быть использованы для маскирования левой угловой скобки, амперсанта и других ограничителей. Для этой цели сформирован целый набор общих сущностей (amp, lt, gt, apos, quot). Также может использоваться числовая ссылка на символ, которая должна обрабатываться как символьные данные и заменяться соответствующим символом сразу по обнаружении. Таким образом, числовые ссылки "<" и "&" могут быть использованы для маскирования символов < и &, встречающихся среди символьных данных.]
      Независимо от того, были ли указанные сущности декларированы, они должны распознаваться всеми XML процессорами. Чтобы обеспечить , действительные XML документы перед использованием должны декларировать эти сущности, как и любые другие. Если сущности lt или amp были декларированы, то они должны быть объявлены как внутренняя сущность, чей текст замены - это ссылка на соответствующий маскируемый символ (знак меньше или амперсант). Для этих сущностей необходимо двойное маскирование, чтобы ссылка на них давала корректный результат. Если декларируются сущности gt, apos или quot, то они должны быть представлены как внутренняя сущность, текст замены которой - это одиночный маскируемый символ (либо ссылка на этот символ, двойное маскирование здесь хотя и допустимо, но необязательно). Например:






      Приложения


      A

      A.1

      A.2

      B

      C (Пояснения к спецификации)

      D (Пояснения к спецификации)

      E (Пояснения к спецификации)

      F (Пояснения к спецификации)

      F.1

      F.2

      G Рабочая группа W3C XML (Пояснения к спецификации)

      H (Пояснения к спецификации)

      I (Пояснения к спецификации)

      J (Пояснения к спецификации)





      Пробельный символ



      [3] S ::= (#x20 | #x9 | #xD | #xA)+

      Для удобства символы делятся на буквы, цифры и остальные символы. Буквы состоят из алфавитных, слоговых и идеографических символов. Полное определение конкретных символов из каждого класса дается в Приложении .
      [Определение: Имя (name) - это лексема (token), начинающаяся с буквы, либо одного из нескольких символов пунктуации, за которыми следуют буквы, цифры, дефисы, символы подчеркивания, двоеточия или точки (все они называются name character - символами имени).] Имена, начинающиеся с комбинации "xml" или какой-либо из строк, соответствующих шаблону (('X'|'x') ('M'|'m') ('L'|'l')), зарезервированы под стандартизацию в этой спецификации и ее последующих версиях.
      Замечание:
      Интерпретация имен, содержащих символ двоеточия, задается в документе Namespaces in XML Recommendation . Поэтому авторам не следует использовать символ двоеточия в именах XML, если это не связано с обращением к пространству имен. Вместе с тем, сами XML процессоры должны воспринимать двоеточие в имени как обычный символ.
      (лексема имени) - это произвольное сочетание символов имени.




      Пролог и декларация типа документа


      [Определение: Документ XML должен начинаться с декларации XML, указывающей версию используемого языка XML.] Например, в следующем примере представлен полноценный XML документ, , но :
      Hello, world!

      таким образом, имеем:
      Hello, world!

      Для обозначения совместимости с данной версией спецификации, необходимо указывать номер версии "1.0". Если в документе используется значение "1.0", но он не отвечает требованиям данной версии спецификации, это будет ошибкой. Выбор номера для тех версий спецификации XML, которые последуют за "1.0", остается за рабочей группой по XML, однако это не подразумевает что она обязуется разработать новые версии языка XML или придерживаться какой-либо конкретной схемы при их нумерации, если таковые будут созданы. Поскольку появление новых версий не исключается, то принятие упомянутой схемы нумерации позволило бы реализовать автоматическое распознавание версии, которое должно стать необходимым. Если получен документ с меткой о версии, которую процессор не в состоянии поддерживать, последний может сигнализировать об ошибке.
      Задачей разметки XML документа должно быть описание схемы его размещения и логической структуры, а также связывание пар атрибут-значение с их логической структурой. XML предоставляет механизм для определения логических ограничений для логической структуры и формирования предопределенных единиц размещения - . [Определение: XML документ является действительным, если с ним связана декларация типа документа и если этот документ отвечает представленным в ней ограничениям.]
      Декларация типа должна располагаться в документе до первого .




      Пролог



      [22] prolog ::= ? * ( *)?
      [23] XMLDecl ::= ''
      [24] VersionInfo ::= 'version' ("'" "'" | '"' '"')/* */
      [25] Eq ::= ? '=' ?
      [26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+
      [27] Misc ::= | |

      [Определение: В языке XML декларация типа документа либо сама содержит, либо ссылается на , которые определяют грамматику некого класса документов. Такую грамматику называют декларацией типа документа, или DTD (document type definition). Декларация типа документа может ссылаться на внешний набор, который также содержит декларацию разметки (специальный тип - ), может содержать свой внутренний набор деклараций разметки, а может сочетать оба варианта. DTD документа формируется из обоих этих наборов, обрабатываемых совместно.]
      [Определение: Декларация разметки - это , , или .] Перечисленные декларации могут целиком, либо частично располагаться в в соответствии с приводимыми далее ограничениями корректности и действительности. Дальнейшие подробности см. в главе .




      Пропускается


      Если в декларации сущности в поле обнаружена ссылка на общую сущность, она пропускается и оставляется без изменений.




      Проверяющие и непроверяющие процессоры


      , отвечающие требованиям спецификации, делятся на два класса: проверяющие и непроверяющие.
      И проверяющие, и непроверяющие процессоры должны докладывать о нарушениях правил корректности данной спецификации, выявленных в содержимом и содержимом других читаемых .
      [Определение: Проверяющие процессоры должны сообщить (по выбору пользователя) о нарушении ограничений, сформулированных в декларациях , а также невозможности соответствовать критериям действительности, представленным в данной спецификации.] Чтобы выполнить это тренбование, проверяющий XML процессор должен прочесть и обработать весь DTD и все внешние разобранные сущности, на которые в данном документе делается ссылка.
      Для проверки корректности от непроверяющего процессора требется проанализировать лишь , включая полный внутренний набор DTD. [Определение: Хотя непроверяющий процессор и не обязан проверять действительность документа, он должен обработать все декларации, найденные во внутреннем наборе DTD, а также во всех прочитанных им сущностях параметров, но только до первой ссылки на сущность параметра, которую он уже не должен читать. Иными словами, он должен использовать сведения из этих деклараций для значений атрибутов, текста замены для внутренних сущностей и предоставления .] За исключением случая standalone="yes", процессорам запрещается и , расположенные после ссылки на сущность параметра, последняя не читается, поскольку может содержать переопределяющие декларации.




      Рекомендация W3C от 6 октября 2000 года


      Данный документ представляет собой перевод спецификации Extensible Markup Language (XML) 1.0 (Second Edition) (W3C Recommendation) на русский язык. При этом нормативным документом считается оригинальная спецификация на английском языке, которую можно найти по адресу
      .
      Перевод спецификации на русский язык представлен на страницах портала "Россия-Он-Лайн":
      Перевод выполнен , ()

      Представленный документ может содержать ошибки перевода.

      Данная версия: (, , , с цветовым выделением исправлений) Последняя версия: Предыдущие версии: Редакторы: Tim Bray, Textuality и Netscape Jean Paoli, Microsoft C. M. Sperberg-McQueen, Университет Иллинойс в Чикаго и Text Encoding Initiative Eve Maler, Sun Microsystems, Inc. - Вторая редакция
      © 2000 ® (, , ), Все права защищены. В отношении данного документа действуют правила W3C, касающиеся , , и .




      The Extensible Markup Language, XML)


      Расширяемый язык разметки ( The Extensible Markup Language, XML) - подмножество SGML, целиком описанное в представленном документе. Язык должен дать возможность передавать, получать и обрабатывать в Web общие документы SGML так же, как сейчас это можно делать с документами HTML. Язык XML спроектирован так, чтобы упростить реализацию и обеспечить взаимодействие SGML и HTML.



      Секции CDATA


      [Определение: Секция CDATA может находиться повсюду, где могут размещаться символьные данные. Использование секции CDATA позволяет избежать обработки блока текста, содержащего символы, которые в других случаях распознавались бы как разметка. Секция CDATA начинается со строки "":]


      [18] CDSect ::=
      [19] CDStart ::= '
      [20] CData ::= (* - (* ']]>' *))
      [21] CDEnd ::= ']]>'

      В секции CDATA распознается только один элемент разметки - строка . Поэтому все символы левой угловой скобки и амперсанта могут предстать здесь в своем обычном текстовом виде. Эти символы не нужно (да и невозможно) маскировать с помощью комбинаций "<" и "&". Секции CDATA не могут быть вложенными.
      Пример секции CDATA, в которой строки "" и "" будут распознаваться не как , а как обычные :

      Hello, world!]]>




      [Определение: Секция CDATA может находиться повсюду, где могут размещаться символьные данные. Использование секции CDATA позволяет избежать обработки блока текста, содержащего символы, которые в других случаях распознавались бы как разметка. Секция CDATA начинается со строки "":]




      [18] CDSect ::=
      [19] CDStart ::= '
      [20] CData ::= (* - (* ']]>' *))
      [21] CDEnd ::= ']]>'

      В секции CDATA распознается только один элемент разметки - строка . Поэтому все символы левой угловой скобки и амперсанта могут предстать здесь в своем обычном текстовом виде. Эти символы не нужно (да и невозможно) маскировать с помощью комбинаций "<" и "&". Секции CDATA не могут быть вложенными.
      Пример секции CDATA, в которой строки "" и "" будут распознаваться не как , а как обычные :
      Hello, world!]]>





      Символьные данные и разметка


      документа образуется сочетанием и разметки. [Определение: Разметка принимает форму , , , , , , разделителей , , , , и любых пробельных символов, которые располагаются на верхнем уровне сущности документа (то есть, вне элемента document и за пределами иных элементов разметки).]
      [Определение: Текст, который не относится к разметке, формирует символьные данные документа (character data).]
      Символ амперсанта (&) и левая угловая скобка (<) могут появиться в своем обычном текстовом виде только в том случае, если используются в качестве ограничителя разметки, либо находятся в пределах , или . Если же эти символы потребовались в документе где-либо еще, их следует , воспользовавшись для этого либо соответствующей (numeric character reference), либо строками "&" и "<" соответственно. Правая угловая скобка (>) может быть представлена в виде строки ">". Кроме того, если правая угловая скобка в содержимом элемента попадает в комбинацию символов "]]>", которая не соответствует окончанию , то, , эту скобку необходимо заменить ссылкой на символ либо комбинацией ">".
      Символьные данные в содержимом элемента - это любая строка символов, которая не содержит начальных ограничителей какой-либо разметки. Символьные данные в секции CDATA - это любая строка символов, которая не содержит закрывающего ограничителя секции CDATA (комбинации символов "]]>").
      Если в значение атрибута необходимо поместить символ одинарной или двойной кавычки, то апостроф или символ одинарной кавычки (') следует представить комбинацией "'", а символ двойной кавычки (") - как """.




      Символьные данные



      [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)





      Символы


      [Определение: Разобранная сущность (parsed entity) содержит текст - последовательности , образующие разметку и символьные данные.] [Определение: символ - это элементарная единица текста, описанная в ISO/IEC 10646 (см. также ). Допустимы символы табуляции, возврата каретки, конца строки, а также разрешенные символы из наборов Unicode и ISO/IEC 10646. Последние версии указанных стандартов, актуальные на момент подготовки данного документа, перечислены в Приложении . Перечисленные стандарты могут быть дополнены новыми символами в ходе обновления или при написании для них новых редакций. Соответственно, XML процессоры должны принимать любой символ из диапазона, указанного для . Использовать "символы совместимости", описанные в главе 6.8 из (см. также D21 в главе 3.6 из ), нежелательно.]




      Смешанный контент


      [Определение: Какой-либо элемента имеет смешанный контент, если элементы этого типа могут содержать символьные данные, возможно чередуемые с .] В таком случае ограничения модели могут касаться лишь типа непосредственных элементов-потомков, но не порядка их следования и количества экземпляров:




      Содержимое элемента


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




      Содержимое элементов



      [43] content ::= ? (( | | | | ) ?)* /* */

      [Определение: Элемент без содержимого называется пустым элементом.] Пустой элемент может быть представлен либо в виде начального тэга, за которым сразу же следует конечный тэг, либо как тэг пустого элемента. [Определение: Тэг пустого элемента имеет специальный формат:]




      Ссылка на символ



      [66] CharRef ::= '&#' [0-9]+ ';'
      | '&#x' [0-9a-fA-F]+ ';'

      Ограничение корректности: Допустимый символ
      Символ, на который дается ссылка, должен отвечать сценарию .
      Если ссылка на символ начинается с комбинации "&#x", то все последующие цифры и буквы вплоть до завершающего символа ; образуют шестнадцатеричное представление для кода этого символа, указанного в ISO/IEC 10646. Если же ссылка начинается с комбинации "&#", то все последующие цифры вплоть до завершающего ; образуют десятичное представление кода символа.
      [Определение: Ссылка на сущность обращается к содержимому именованной сущности.] [Определение: Ссылка на разобранные общие сущности использует в качестве ограничителей амперсант (&) и символ точки с запятой (;).] [Определение: Ссылка на сущность параметра используют в качестве ограничителей символы процента (%) и точки с запятой (;).]




      Ссылка на сущность



      [67] Reference ::= |
      [68] EntityRef ::= '&' ';'
      [69] PEReference ::= '%' ';'

      Ограничение корректности: Декларированная сущность
      Для документа без какого-либо DTD, для документа, имеющего лишь внутренний набор DTD, который не содержит ссылок на сущность параметра, а также для документа с декларацией "standalone='yes'": для каждого в ссылке на сущность, которая не попадает ни во внешний набор, ни в сущность параметра, должен иметься Name в одной из , которые также не располагаются ни во внешнем наборе, ни в сущности параметра. Исключение составляют корректные (well-formed) документы, для которых нет нужды декларировать сущности amp, lt, gt, apos и quot. Декларация общей сущности должна предшествовать всем ссылкам на нее, которые могут иметься в декларации списка атрибутов в составе значения по умолчанию.
      Заметим, что если сущность была декларирована во внешнем наборе или во внешней сущности параметра, то непроверяющий процессор читать и обрабатывать ее декларацию. Для подобных документов требование декларировать сущности становится условием корректности только если было указано .
      Ограничение действительности: Декларированная сущность
      В документе с внешним набором или внешними сущностями параметра, который имеет декларацию "standalone='no'", лексема в ссылке на сущность должна Name в одной из . Чтобы обеспечить взаимодействие, действительные документы должны декларировать сущности amp, lt, gt, apos, quot в том формате, который описан в главе . Декларация сущности параметра должна предшествовать любым ссылкам на нее. Точно так же декларация общей сущности должна предшествовать любым декларациям списка атрибута, содержащим значение по умолчанию с прямой либо косвенной ссылкой на эту общую сущность.
      Ограничение корректности: Разобранная сущность

      Ссылка на сущность не должна содержать имени . Ссылаться на неразобранные сущности можно только в тех , которые были декларированы как имеющие тип ENTITY или ENTITIES.

      Ограничение корректности: Отсутствие рекурсии

      Разобранная сущность не должна иметь рекурсивной ссылки саму на себя, прямой либо косвенной.

      Ограничение корректности: В DTD

      Ссылка на сущность параметра может присутствовать только в .

      Примеры ссылок на символ и сущность:

      Type less-than (<) to save options. This document was prepared on &docdate; and is classified &security-level;.
      Пример ссылки на сущность параметра:

      %ISOLat2;



      Ссылки на символ и сущность


      [Определение: Ссылка на символ относится к определенному символу из набора ISO/IEC 10646, например, к такому символу, который невозможно получить непосредственно с имеющихся устройств ввода.]




      Статус этого документа


      Данный документ был рассмотрен членами W3C, другими заинтересованными сторонами и был утвержден Директором в качестве рекомендации от W3C. Документ является окончательным и его можно использовать как материал для ссылки или цитировать в других документах в качестве стандарта. Участие W3C в разработке этой спецификации заключается в привлечении к ней внимания и содействии ее широкому распространению. Принятие стандарта способствует наращиванию функциональных возможностей и повышению уровня взаимодействия в Сети.
      В данном документе формулируется синтаксис, пригодный для использования в World Wide Web и построенный как подмножество уже имеющегося и широко используемого международного стандарта обработки текстов (Standard Generalized Markup Language, SGML, ISO 8879:1986(E) улучшенного и исправленного). Данный документ является результатом работ по проекту W3C XML Activity, детальное описание которого можно найти по адресу . Нормативную силу имеет только английская версия спецификации, однако по адресу можно найти перевод этого документа на другие языки. На странице можно найти перечень текущих рекомендаций W3C и других технических документов.
      Вторая редакция не является новой версией языка XML (первая была опубликована 10 февраля 1998 года). Она всего лишь учитывает изменения, продиктованные удобством читателей и выявленными ошибками (которые можно увидеть по адресу ). Перечень ошибок, обнаруженных во второй версии спецификации, можно увидеть по адресу .
      Об ошибках, обнаруженных в данном документе, просьба сообщать по адресу ; Доступен переписки.
      Замечание:
      Со времени публикации первой редакции C. M. Sperberg-McQueen поменял место работы. Теперь он работает в World Wide Web Consortium и с ним можно связаться по адресу .




      Сущность документа


      [Определение: Сущность документа выступает в качестве корня дерева сущностей, а также как стартовая точка для .] В данной спецификации не конкретизируется, каким именно образом XML процессор должен находить сущность документа - в отличие от других сущностей, сущность документа не имеет имени и вполне может появиться во входном потоке процессора вообще без какого-либо идентификатора.




      Терминология


      Терминология, используемая для описания XML документов, также дается в данной спецификации. При построении определений и описании функций XML процессора используются термины из следующего перечня:
      может (may)
      [Определение: Документы и XML процессоры, отвечающие этому условию, могут, но не обязаны действовать именно так, как было описано.]
      должен (must)
      [Определение: Документы и XML процессоры обязаны действовать именно так, как было описано. В противном случае имеет место ошибка.]
      ошибка (error)
      [Определение: Отступление от правил данной спецификации, результат не определен. Программное обеспечение, отвечающее требованиям спецификации, может обнаруживать такую ошибку, сообщать о ней и обрабатывать ее.]
      фатальная ошибка (fatal error)
      [Определение: Ошибка, которую , отвечающий требованиям спецификации, должен зафиксировать и сообщить об этом приложению. После обнаружения фатальной ошибки процессор может продолжить обработку данных с тем, чтобы найти остальные ошибки и, возможно, сообщить о них приложению. Помогая обрабатывать ошибки, процессор может предоставить приложению доступ к необработанным материалам исходного документа (символьным данным и разметке). После обнаружения фатальной ошибки процессор должен приостановить нормальную обработку данных (то есть, он должен прекратить передачу приложению символьных данных и сведений о логической структуре документа обычным образом).]
      по выбору пользователя (at user option)
      [Определение: Программное обеспечение, отвечающее требованиям спецификации, может или должно (в зависимости от степени долженствования в предложении) поступать так, как было указано в спецификации. Если это сделано, пользователю должна быть предоставлена возможность разрешать или запрещать описанные действия.]
      ограничение действительности (validity constraint, VC)
      [Определение: Правило, относящееся ко всем XML документам. Нарушение ограничения корректности классифицируется как ошибка, о которой (по выбору пользователя) должны сообщать .]

      ограничение корректности (well-formedness constraint, WFC)

      [Определение: Правило, относящееся ко всем XML документам. Нарушение ограничения корректности классифицируется как .]

      соответствие (match)

      [Определение: (Для строк или имен:) Две сравниваемые строки или имени должны быть идентичны. Символы с несколькими возможными представлениями в ISO/IEC 10646 (например, символы, имеющие обе формы представления precomposed и base+diacritic) считаются совпадающими только тогда, когда в обеих строках они имеют одну и ту же форму представления. Преобразование регистра не производится. (Для строк и правил грамматики:) Строка отвечает сценарию грамматики если она принадлежит языку, генерируемому по этому сценарию. (Для содержимого и моделей содержимого:) Элемент соответствует своей декларации если он отвечает положениям, описанным в соответствующем ограничении .]

      для совместимости (for compatibility)

      [Определение: Выделяет фразу, описывающую функцию языка XML, которая была включена в спецификацию исключительно для того, чтобы убедиться в том, что XML сохраняет совместимость с языком SGML.]

      для взаимодействия (for interoperability)

      [Определение: Выделяет фразу, описывающую необязательную рекомендацию, которая была включена в спецификацию для увеличения возможности обработки XML документов с помощью уже установленных SGML процессоров, указанных в Приложении WebSGML Adaptations к ISO 8879.]




      Типы атрибутов


      Все типы XML атрибутов делятся на три класса: строковый тип, набор символьных (tokenized) типов и перечислимые (enumerated) типы. Строковый тип может иметь в качестве значения одну строку. Символьные типы содержат различные лексические и семантические ограничения. Ограничения действительности, обсуждаемые в данной грамматике, начинают действовать после того, как значение атрибута было нормализовано в соответствии с описанием в главе .


      [54] AttType ::= | |
      [55] StringType ::= 'CDATA'
      [56] TokenizedType ::= 'ID'
      | 'IDREF'
      | 'IDREFS'
      | 'ENTITY'
      | 'ENTITIES'
      | 'NMTOKEN'
      | 'NMTOKENS'

      Ограничение действительности: ID
      Значения типа ID должны соответствовать сценарию для . Имя, соответствующее значению этого типа, должно появляться в XML документе не более одного раза. Иными словами, значения ID должны уникальным образом идентифицировать элементы, в которых они находятся.
      Ограничение действительности: Один ID для каждого типа элементов
      Любой тип элемента не может иметь более одного атрибута ID.
      Ограничение действительности: Значение по умолчанию для атрибута ID
      Для атрибута ID должно быть декларировано значение по умолчанию #IMPLIED или #REQUIRED.
      Ограничение действительности: IDREF
      Значения типа IDREF должны соответствовать сценарию , а значения типа IDREFS должны соответствовать . При этом каждое должно соответствовать значению атрибута ID в каком-либо элементе XML документа, то есть, значение IDREF должно соответствовать значению какого-либо из атрибутов ID.
      Ограничение действительности: Имя сущности
      Значения типа ENTITY должны соответствовать сценарию , значения типа ENTITIES должны соответствовать . Каждое при этом должно соответствовать названию одной из , декларированных в .
      Ограничение действительности: Лексема имени
      Значения типа NMTOKEN должны соответствовать сценарию , значения типа NMTOKENS должны соответствовать .
      [Определение: Перечислимый атрибут может выбирать одно значение из перечня, предоставленного в декларации]. Существует два вида перечислимых типов:




      Типы перечислимых атрибутов



      [57] EnumeratedType ::= |
      [58] NotationType ::= 'NOTATION' '(' ? (? '|' ? )* ? ')'
      [59] Enumeration ::= '(' ? (? '|' ? )* ? ')'

      Атрибут NOTATION идентифицирует , которая была декларирована в DTD вместе с ассоциированными с нею системными и/или общими (public) идентификаторами, и которую следует использовать для интерпретации элемента, в котором был указан данный атрибут.
      Ограничение действительности: Атрибуты нотации
      Значения указанного типа должны соответствовать одному из представленных в декларации названий . Все названия нотаций в декларации в свою очередь также должны быть декларированы.
      Ограничение действительности: Одна нотация для каждого типа элемента
      Для типа элемента не может указываться более одного атрибута NOTATION.
      Ограничение действительности: Отсутствие нотаций для пустого элемента
      Для сохранения , для элемента, объявленного как EMPTY, атрибут типа NOTATION декларироваться не должен.
      Ограничение действительности: Перечисление
      Значения этого типа должны соответствовать одной из лексем , указанных в декларации.
      Чтобы обеспечить , один и тот же должен появляться среди перечислимых типов атрибутов, относящихся к одному типу элементов, не более одного раза.




      Тэги пустых элементов



      [44] EmptyElemTag ::= '<' ( )* ? '/>'

      Тэг пустого элемента может быть использован для любого элемента, не имеющего содержимого, независимо от того, был ли последний декларирован с ключевым словом EMPTY. , тэг пустого элемента должен использоваться для элементов, которые были декларированы как EMPTY, и только для них.
      Примеры пустых элементов:









      Условная секция



      [61] conditionalSect ::= | ignoreSect
      [62] includeSect ::= '' /* */
      [63] ignoreSect ::= '' /* */
      [64] ignoreSectContents ::= ('' )*
      [65] Ignore ::= * - (* ('') *)

      Ограничение действительности: Правильная вложенность условной секции/PE
      Если какая-либо из конструкций условной секции ("") находится в тексте замены для ссылки на сущность параметра, то в этом тексте должны находиться и все остальные конструкции.
      Подобно внутреннему и внешнему наборам DTD, условная секция тоже может содержать одну или несколько полных деклараций, комментариев, инструкций обработки или же вложенных условных секций, перемежаемых пробельным символом.
      Если ключевым словом условной секции является INCLUDE, то содержимое этой секции становится частью DTD. Если же ключевым словом условной секции является IGNORE, то содержимое секции логической частью DTD не становится. Если условная секция с ключевым словом INCLUDE была представлена в составе более крупной условной секции с ключевым словом IGNORE, то игнорируются обе внутренняя и внешняя секции. Содержимое игнорируемой условной секции обрабатывается путем изъятия всех символов, стоящих после скобки "[", следующей за ключевым словом, и до того как будет найден конец условной секции (исключение составляет условная секция, начинающияся с ""). При этом ссылки на сущности параметров не распознаются.
      Если ключевое слово условной секции является ссылкой на сущность параметра, то данную сущность параметра необходимо заменить его содержимым до того, как процессор будет решать, включать или игнорировать данную условную секцию.
      Например:


      ]]> ]]>





      Условные секции


      [Определение: Условная секция является фрагментом внешнего набора для , которая включается или исключается из логической структуры DTD в зависимости от значения управляющего ею ключевого слова.]




      Уведомление


      Если название было представлено в качестве лексемы в значении атрибута с декларированным типом ENTITY или ENTITIES, то проверяющий процессор должен передать приложению сведения о и (если таковые имеются) идентификаторах данной сущности и связанной с нею .




      Включается как строка


      Если в значении атрибута обнаружена , или в строчном значении сущности обнаружена ссылка на сущность параметра, то вместо этой ссылки обрабатывается ее , словно это был фрагмент документа, находившийся в том месте, где была обнаружена исходная ссылка. Исключение составляют символы одинарной или двойной кавычки, которые в тексте замены всегда воспринимаются как обычный символ данных, а не как завершение соответствующей строки. Например, следующий пример является корректным:


      а этот - нет:

      | (('#FIXED' S)? )

      Запись #REQUIRED в декларации атрибута означает, что этот атрибут должен присутствовать в элементе всегда, #IMPLIED означает, что значения по умолчанию для атрибута не предоставляется. [Определение: Если в декларации нет ни #REQUIRED, ни #IMPLIED, то значение содержит значение, декларированное по умолчанию. Ключевое слово #FIXED устанавливает, что данный атрибут обязан всегда иметь значение по умолчанию. Если было декларировано значение по умолчанию, то когда XML процессор не обнаруживает этого атрибута, он должен поступать так, словно атрибут присутствует и имеет значение, декларированное по умолчанию.]
      Ограничение действительности: Обязательный атрибут
      Если для атрибута декларировано по умолчанию ключевое слово #REQUIRED, то в декларации списка атрибутов этот атрибут должен быть указан во всех элементах указанного типа.
      Ограничение действительности: Допустимость значения по умолчанию для атрибута
      Декларированное значение по умолчанию должно отвечать всем лексическим ограничениям для декларируемого типа атрибута.
      Ограничение действительности: Фиксированное значение атрибута по умолчанию
      Если атрибут по умолчанию имеет значение, декларированное с ключевым словом #FIXED, то все экземпляры данного атрибута должны соответствовать этому значению по умолчанию.
      Примеры деклараций списка атрибутов:






      Значения атрибутов по умолчанию


      предоставляет сведения о том, обязательно ли присутствие в элементе данного атрибута и, если нет, то как XML процессор должен реагировать на отсутствие в документе декларированного атрибута.




      

          Программирование: Языки - Технологии - Разработка