Extensible Markup Language 1.0-1998-2
Ограничение допустимости: Корректное объявление/Вложение сущности параметров Заменяющий текст сущности параметра должен быть корректно вложен в объявления разметки. То есть, если любой первый или последний символ объявления разметки (markupdecl вышк) содержится в заменяющем тексте ссылки на сущность параметров, они оба должны содержаться в одном и том же заменяющем тексте.
Ограничение формальной правильности: сущность параметров во внутреннем подмножестве Во внутреннем подмножестве DTD ссылки на сущность параметров могут присутствовать только там же, где и объявления разметки, но не внутри самих объявлений. (Это не относится к ссылкам, расположенным во внешних сущностях параметров или к внешним подмножествам.)
Как и внутренне подмножество, внешнее подмножество и все внешние сущности параметров, на которые ссылается DTD, должны состоять из ряда полных объявлений разметки типов, допускаемых нетерминальным символом markupdecl, с учетом всех пробельных символов или ссылок на сущности параметров. Однако части содержимого внешнего подмножества или внешних сущностей параметров могут условно игнорироваться с помощью конструкции условного раздела; во внутреннем подмножестве это недопустимо.
| Внешнее подмножество |
| [30] |
extSubset |
::= |
TextDecl? extSubsetDecl |
| [31] |
extSubsetDecl |
::= |
( markupdecl | conditionalSect | PEReference | S )* | |
Внешнее подмножество и внешние сущности параметров отличаются от внутреннего подмножества еще и тем, что в них ссылки на сущности параметров допускаются и внутри объявлений разметки, а не только между такими объявлениями.
Пример документа XML с объявлением типа документа:
<?xml version="1.0"?> <!DOCTYPE greeting SYSTEM "hello.dtd"> <greeting>Здравствуй, мир!</greeting>
|
Системный идентификатор "hello.dtd" определяет URI DTD документа.
Объявления могут даваться и локально, как в следующем примере:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE greeting [ <!ELEMENT greeting (#PCDATA)> ]> <greeting>Здравствуй, мир!</greeting>
|
Если используются как внешние, так и внутренние подмножества, считается, что внутреннее подмножество располагается перед внешним. Это дает объявлениям сущностей и списков атрибутов во внутреннем подмножестве приоритет над объявлениями из внешнего подмножества.
2.9 Автономное объявление документа
Объявления разметки могут влиять на передачу содержимого документа из процессора XML в приложение; примерами являются значения атрибутов по умолчанию и объявления сущностей. Автономное объявление документа, которое может быть компонентом объявления XML, сигнализирует о наличии таких объявлений, которые оказываются внешними по отношению к сущности документа.
| Автономное объявление документа |
| [32] |
SDDecl |
::= |
S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) |
[ |
Ограничение допустимости: автономное объявление документа ] | |
В автономном объявлении документа значение "yes" указывает на отсутствие объявлений разметки, внешних по отношению к сущности документа (во внешнем подмножестве DTD или во внешней сущности параметров, на который имелась бы ссылка из внутреннего подмножества), которые повлияли бы на информацию, передаваемую из процессора XML в приложение. Значение "no" указывает на наличие или возможность наличия таких внешних объявлений разметки. Обратите внимание, что автономное объявление документа только указывает на наличие внешних объявлений; наличие в документе ссылок на внешние сущности, если эти сущности объявлены внутри, не изменяет его статуса автономного.
При отсутствии внешних объявлений разметки автономное объявление документа не имеет значения. Если внешние объявления разметки есть, но автономное объявление документа отсутствует, предполагается, что указано значение "no".
Любой документ XML, для которого указано standalone="no", можно алгоритмическим путем преобразовать в автономный документ, что может потребоваться для некоторых сетевых приложений.
Ограничение допустимости: Автономное объявление документа Автономное объявление документа должно иметь значение "no", если в каком-либо из внешних объявлений разметки содержится объявление:
- атрибутов со значениями, используемыми по умолчанию, если элементы, к которым эти атрибуты применяются, указаны в документе без спецификации значений их атрибутов, или
- сущности (кроме amp, lt, gt, apos, quot), если ссылки на эти сущности имеются в документе, или
- атрибутов, значения которых определяются нормализацией, когда атрибут в документе указан со знчением, которое изменит результат нормализации, или
- типов элементов с содержимым, если пробельные символы располагаются непосредственно в каком-либо из экземпляров этих типов.
Пример объявления XML с автономным объявлением документа:
| <?xml version="1.0" standalone='yes'?> |
2.10 Обработка пробельных символов
При редактировании документов XML часто оказывается удобным использовать "пробельные символы" (пробелы, табуляции и пустые строки, обозначаемые в настоящей спецификации нетерминалом S) для выделения разметки и для удобочитаемости. Такие пробельные символы обычно не должны включаться в представляемую пользователю версию документа. С другой стороны, часто случается, что пробельные символы имеют значение и должны быть сохранены - например, в стихах или в представлении кода.
Процессор XML всегда должен передавать в приложение все символы документа, не служащие разметкой. Подтверждающий формальную правильность процессор XML должен, кроме того, сообщать приложению, какие из этих символов представляют собой пробельные, находящиеся в содержимом элемента.
К элементу может прикрепляться специальный атрибут xml:space, который указывает на то, что в этом элементе пробельные символы должны быть сохранены. В допустимых документах этот атрибут, если он используется, как и любой другой, должен быть объявлен. При объявлении он должен даваться как перечислимый тип с только двумя возможными значениями: "default" и "preserve". Например:
| <!ATTLIST poem xml:space (default|preserve) 'preserve'> |
Значение "default" указывает на то, что режимы обработки пробельных символов, используемые в приложении по умолчанию, могут применяться и к этому элементу; значение "preserve" указывает, что приложение должно сохранить все пробельные символы. Считается, что такая политика должна применяться ко всем элементам в содержимом элемента, для которого она задана, если это не переопределяется с помощью другого экземпляра атрибута xml:space.
Считается, что для корневого элемента любого документа никакая политика не задана, если только для этого атрибута не установлено значение или этот атрибут не объявлен со значением по умолчанию.
2.11 Обработка концов строк
Анализируемые сущности языка XML часто хранятся в файлах, которые для удобства редактирования разбиты на строки. Обычно эти строки разделяются комбинацией символов возврата каретки (#xD) и перевода строки (#xA).
Для упрощения задач, выполняемых приложением, всегда, когда внешняя анализируемая сущность или литеральное значение сущности внутренней анализируемой сущности содержит литеральную двухсимвольную последовательность "#xD#xA" или отдельный литерал #xD, процессор XML должен передавать в приложение только один символ #xA. (Это можно удобно организовать путем приведения всех разрывов строк к виду #xA на входе, до начала синтасического разбора.)
2.12 Идентификация языка
При обработке документов часто полезно определить естественный или формальный язык содержимого документа. Для указания языка, используемого в содержимом и значениях атрибутов документа XML, можно использовать специальный атрибут xml:lang. В допустимых документах этот атрибут, если он используется, как и любой другой, должен быть объявлен. Значениями этого атрибута являются идентификаторы языков в соответствии с [IETF RFC 1766], "Tags for the Identification of Languages" (Теги идентификации языков):
| Идентификация языка |
| [33] |
LanguageID |
::= |
Langcode ('-' Subcode)* |
| [34] |
Langcode |
::= |
ISO639Code | IanaCode | UserCode |
| [35] |
ISO639Code |
::= |
([a-z] | [A-Z]) ([a-z] | [A-Z]) |
| [36] |
IanaCode |
::= |
('i' | 'I') '-' ([a-z] | [A-Z])+ |
| [37] |
UserCode |
::= |
('x' | 'X') '-' ([a-z] | [A-Z])+ |
| [38] |
Subcode |
::= |
([a-z] | [A-Z])+ | |
Langcode может быть:
- двухбуквенным кодом языка в соответствии с [ISO 639], "Codes for the representation of names of languages" (Коды для представления названий языков)
- идентификатором языка, зарегистрированным в Internet Assigned Numbers Authority [IANA]; они начинаются с префикса "i-" (or "I-")
- идентификатором языка, назначаемым пользователем или согласованным несколькими сторонами для личного использования; они должны начинаться с префикса "x-" или "X-", что гарантирует отсутствие конфликтов с зарегистрированными или стандартизованными в IANA именами
Количество сегментов Subcode не ограничено; если имеется первый сегмент, и Subcode состоит из двух букв, то это должен быть код страны в соответствии с [ISO 3166], "Codes for the representation of names of countries" (Коды для представления названий стран). Если первый подкод состоит из более чем двух букв, это должен быть подкод языка, зарегистрированный в IANA, если только Langcode не начинается с префикса "x-" или "X-".
Обычно код языка дается в нижнем регистре, а код страны (если таковой имеется) - в верхнем. Обратите внимание, что эти значения, в отличие от другим имен в документах XML, не учитывают регистр.
Например:
<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p> <p xml:lang="en-GB">What colour is it?</p> <p xml:lang="en-US">What color is it?</p> <sp who="Faust" desc='leise' xml:lang="de"> <l>Habe nun, ach!Philosophie,</l> <l>Juristerei, und Medizin</l> <l>und leider auch Theologie</l> <l>durchaus studiert mit heiЯem Bemьh'n.</l> </sp> |
Считается, что значение xml:lang применяется ко всем атрибутам и содержимому элемента, для которого оно указано, если только оно не переопределяется другим экземпляром xml:lang другого элемента в этом содержимом.
Простое объявление xml:lang может иметь следующий вид:
| xml:lang NMTOKEN #IMPLIED |
но могут также даваться и конкретные значения по умолчанию. В сборнике французских стихов для русских студентов с примечаниями и пометками на русском языке атрибут xml:lang может быть объявлен следующим образом:
<!ATTLIST poem xml:lang NMTOKEN 'fr'> <!ATTLIST gloss xml:lang NMTOKEN 'ru'> <!ATTLIST note xml:lang NMTOKEN 'ru'> |
3. Логические структуры
Каждый документ XML содержит один или несколько элементов, границами которых определяются начальными и конечными тегами или, для пустых элементов, тегами пустых элементов. Каждый элемент имеет тип, определяемый именем, иногда называемый "общим идентификатором" (GI, generic identifier), и может иметь набор спецификаций атрибутов. Каждая спецификация атрибута имеет имя и значение.
| Элемент |
| [39] |
element |
::= |
EmptyElemTag |
|
|
|
| STag content ETag |
[ |
Ограничение формальной правильности: соответствие типа элемента ] |
|
|
|
|
[ |
Ограничение допустимости: допустимость элемента ] | |
В настоящей спецификации не ограничивается семантика, использование или (кроме синтаксиса) имен типов элементов и атрибутов, за исключением того, что имена, начинающиеся с символов, соответствующих (('X'|'x')('M'|'m')('L'|'l')), зарезервированы для стандартизации в настоящей и будущих версиях спецификации.
Ограничение формальной правильности: Соответствие типа элемента Name в конечном теге элемента должно соответствовать типу элемента в начальном теге.
Ограничение допустимости: Допустимый элемент Элемент является допустимым при наличии объявления, соответствующего elementdecl, где Name соответствует типу элемента и выполняется одно из следующих условий:
- Объявление соответствует EMPTY, и элемент не имеет содержимого.
- Объявление соответствует children, и последовательность дочерних элементов принадлежит языку, генерируемому регулярным выражением в модели содержимого, с необязательными пробелами (символами, соответствующими нетерминалу S) между каждой из пар дочерних элементов.
- Объявление соответствует Mixed, и содержимое состоит из символьных данных и дочерних элементов, типы которых соответствуют именам в модели содержимого.
- Объявление соответствует ANY, и типы всех дочерних элементов объявлены.
3.1 Начальные теги, конечные теги и теги пустых элементов
Начало каждого непустого элемента XML отмечается начальным тегом.
| Начальный тег |
| [40] |
STag |
::= |
'<' Name (S Attribute)* S? '>' |
[ |
Ограничение формальной правильности: уникальная спецификация атрибута ] |
| [41] |
Attribute |
::= |
Name Eq AttValue |
[ |
Ограничение допустимости: тип значения атрибута ] |
|
|
|
|
[ |
Ограничение формальной правильности: запрещены ссылки на внешние сущности ] |
|
|
|
|
[ |
Ограничение формальной правильности: запрещены символы < в значениях атрибутов ] | |
Name в начальных и конечных тегах задает тип элемента. Пары Name-AttValue называются спецификациями атрибутов элемента. Name в каждой паре называется именем атрибута, а содержимое AttValue (текст в ' или ") - значением атрибута.
Ограничение формальной правильности: Уникальная спецификация атрибута Имя атрибута в одном начальном теге или теге пустого элемента может присутствовать только один раз.
Ограничение допустимости: Тип значения атрибута Атрибут должен быть объявлен; значение должно иметь тип, объявленный для этого атрибута. (Типы атрибутов см. в разделе "3.3 Объявления списка атрибутов".)
Ограничение формальной правильности: Запрещены ссылки на внешние сущности Значения атрибутов не могут содержать прямые или косвенные ссылки на внешние сущности.
Ограничение формальной правильности: Запрещены символы < в значениях атрибутов Заменяющий текст любой сущности, на которую в значении атрибута имеется прямая или косвенная ссылка (кроме "<"), не должны содержать символа <.
Пример начального тега:
| <termdef id="dt-dog" term="dog"> |
Конец каждого элемента, который начинается начальным тегом, должен отмечаться конечным тегом, содержащим имя, совпадающее с типом элемента, указываемым в начальном теге:
| Конечный тег |
| [42] |
ETag |
::= |
'</' Name S? '>' | |
Пример конечного тега:
Текст между начальным и конечным тегами называется содержимым элемента:
| Содержимое элементов |
| [43] |
content |
::= |
(element | CharData | Reference | CDSect | PI | Comment)* | |
Если элемент пуст, он должен представляться либо начальным тегом, сразу же за которым следует конечный, либо тегом пустого элемента. Тег пустого элемента имеет специальную форму:
| Теги пустых элементов |
| [44] |
EmptyElemTag |
::= |
'<' Name (S Attribute)* S? '/>' |
[ |
Ограничение формальной правильности: уникальная спецификация атрибута ] | |
Теги пустых элементов могут использоваться для любого элемента, не имеющего содержимого, независимо от того, объявлен ли он в ключевым словом EMPTY или нет. Для совместимости тег пустого элемента должен и может использоваться только для элементов, объявленных как EMPTY.
Примеры пустых элементов:
<IMG align="left" src="http://www.w3.org/Icons/WWW/w3c_home" /> <br></br> <br/> |
3.2 Объявления типов элементов
Элементная структура документа XML может для проверки достоверности ограничиваться с помощью объявлений типов элементов и списков атрибутов. Объявление типа элемента ограничивает содержимое элемента.
Объявления типов элементов часто ограничивают типы элементов, которые могут быть дочерними по отношению к данному элементу. На выбор пользователя, процессор XML может выдавать предупреждение, если в объявлении упоминается тип элемента, объявление которого отсутствует, но это не является ошибкой.
Объявление типа элемента имеет следующий вид:
| Объявление тип элемента |
| [45] |
elementdecl |
::= |
'<!ELEMENT' S Name S contentspec S? '>' |
[ |
Ограничение допустимости: уникальное объявление типа элемента ] |
| [46] |
contentspec |
::= |
'EMPTY' | 'ANY' | Mixed | children | |
где Name определяет тип объявляемого элемента.
Ограничение допустимости: Уникальное объявление типа элемента Ни один тип элемента не может объявляться более одного раза.
Примеры объявлений типов элементов:
<!ELEMENT br EMPTY> <!ELEMENT p (#PCDATA|emph)* > <!ELEMENT %name.para; %content.para; > <!ELEMENT container ANY> |
3.2.1 Содержимое элемента
Тип элемента имеет содержимое, если элементы этого типа должны содержать только дочерние элементы (не содержать символьных данных), разделяемые пробельными символами (символами, соответствующими нетерминалу S). В этом случае такое ограничение включает модель содержимого, простую грамматику, управляющую допустимыми типами дочерних элементов и порядком их расположения. Грамматика построена на частицах содержимого (cp, content particle), состоящих из имен, списков выбора частиц содержимого или списков последовательностей частиц содержимого:
| Модели содержимого элементов |
| [47] |
children |
::= |
(choice |seq) ('?' | '*' | '+')? |
| [48] |
cp |
::= |
(Name | choice | seq) ('?' | '*' | '+')? |
| [49] |
choice |
::= |
'(' S? cp ( S? '|' S? cp )* S? ')' |
[ |
Ограничение допустимости: корректное вложение групп/сущностей параметров ] |
| [50] |
seq |
::= |
'(' S? cp ( S? ',' S? cp )* S? ')' |
[ |
Ограничение допустимости: корректное вложение групп/сущностей параметров ] | |
где каждое Name - тип элемента, который может служить дочерним. Любая частица содержимого в списке может располагаться в содержимом элемента там, где список располагается в грамматике; частицы содержимого, находящиеся в списке последовательностей, должны располагаться в содержимом элемента в порядке, указанном в списке. Необязательный символ, следующий за именем или списком, управляет тем, могут ли элемент или частицы содержимого из списка встречаться один или более (+), ноль или более (*) или не более одного (?) раза. Отсутствие такого оператора означает, что элемент или частица содержимого должен присутствовать только один раз. Этот синтаксис и значение идентичны синтаксису и значению, используемым в продукциях в настоящей спецификации.
Содержимое элемента соответствует модели содержимого, если и только если можно проложить пути в модели содержимого, удовлетворяющий операторам последовательности, выбора и повторения и соответствующий каждому элементу в содержимом по типу элемента в модели содержимого. Для совместимости считается ошибкой, если элемент в документе может соответствовать нескольким экземплярам типа элемента в модели содержимого. Более подробную информацию см в разделе "E. Детерминистические модели содержимого".
Ограничение допустимости: Корректное вложение групп/сущностей параметров Заменяющий текст сущности параметров должен быть корректно вложен в обозначаемые скобками группы. То есть если в конструкции choice, seq или Mixed в заменяющем тексте сущности параметра содержится открывающая или закрывающая скобка, обе скобки должны находиться в одном и том же заменяющем тексте. Для совместимости, если ссылка на сущность параметров располагается в конструкции choice, seq или Mixed, ее заменяющий текст не должен быть пустым, и ни первый, ни последний непустой символ заменяющего текста не должен быть соединителем (| или ,).
Примеры моделей содержимого элементов:
<!ELEMENT spec (front, body, back?)> <!ELEMENT div1 (head, (p | list | note)*, div2*)> <!ELEMENT dictionary-body (%div.mix; | %dict.mix;)*> |
3.2.2 Смешанное содержимое
Тип элемента имеет смешанное содержимое, если элементы этого типа могут содержать символьные данные вперемешку с дочерними элементами. В этом случае типы дочерних элементов могут быть ограничены, но их порядок или число вхождений не ограничиваются:
| Объявление смешанного содержимого |
| [51] |
Mixed |
::= |
'(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' |
|
|
|
| '(' S? '#PCDATA' S? ')' |
[ |
Ограничение допустимости: корректное вложение групп/сущностей параметров ] |
|
|
|
|
[ |
Ограничение допустимости: отсутствие дублирующихся типов ] | |
где Name задают типы элементов, которые могут быть дочерними.
Ограничение допустимости: Отсутствие дублирующихся типов одно и то же имя не должно встречаться в одном объявлении со смешанным содержимым более одного раза.
Примеры объявлений со смешанным содержимым:
<!ELEMENT p (#PCDATA|a|ul|b|i|em)*> <!ELEMENT p (#PCDATA | %font; | %phrase; | %special; | %form;)* > <!ELEMENT b (#PCDATA)> |
3.3 Объявления списков атрибутов
Атрибуты используются для связи пар имя-значение с элементами. Спецификации атрибутов могут располагаться только в начальных тегах и тегах пустых элементов; таким образом, продукции, используемые для их распознавания, находятся в разделе "3.1 Начальные теги, конечные теги и теги пустых элементов". Объявления списков атрибутов могут использоваться:
- для определения набора атрибутов, принадлежащих данному типу элемента.
- для установления ограничений типа для этих атрибутов.
- для задания значений по умолчанию для атрибутов.
Объявления списка атрибутов определяют имя, тип данных и значение по умолчанию (если таковое имеется) каждого атрибута, связанного с данным типом элемента:
| Объявление списка атрибутов |
| [52] |
AttlistDecl |
::= |
'<!ATTLIST' S Name AttDef* S? '>' |
| [53] |
AttDef |
::= |
S Name S AttType S DefaultDecl | |
Name в правиле AttlistDecl представляет тип элемента. По выбору пользователя процессор XML может выдавать предупреждение, если атрибуты, объявленные для типа элемента, не объявлены сами по себе, но это не является ошибкой. Name в правиле AttDef представляет имя атрибута.
Если для данного типа элемента указано несколько AttlistDecl, содержимое их всех объединяется. Если для одного атрибута данного типа элемента указано несколько определений, используется первое объявление, а последующие игнорируются. Для совместимости авторы DTD могут задавать не более одного объявления списка атрибутов для данного типа элемента, не более одного определения атрибута для данного имени атрибута и не менее одного определения атрибута в каждом объявлении списка атрибутов. Для совместимости процессор XML может по выбору пользователя выдавать предупреждение, если для данного типа элемента имеется несколько объявлений писков атрибутов или для данного атрибута имеется несколько определений, но это не является ошибкой.
3.3.1 Типы атрибутов
Атрибуты XML бывают трех типов: строка, набор снабженных метками типов и нумерованный тип. Строка может принимать в качестве значения любую литеральную строку; снабженные метками типы могут иметь переменные лексические и семантические ограничения:
| Типы атрибутов |
| [54] |
AttType |
::= |
StringType | TokenizedType | EnumeratedType |
| [55] |
StringType |
::= |
'CDATA' |
| [56] |
TokenizedType |
::= |
'ID' |
[ |
Ограничение допустимости: ID ] |
|
|
|
|
[ |
Ограничение допустимости: один ID на один тип элемента ] |
|
|
|
|
[ |
Ограничение допустимости: значение по умолчанию атрибута ID ] |
|
|
|
| 'IDREF' |
[ |
Ограничение допустимости: IDREF ] |
|
|
|
| 'IDREFS' |
[ |
Ограничение допустимости: IDREF ] |
|
|
|
| 'ENTITY' |
[ |
Ограничение допустимости: имя сущности ] |
|
|
|
| 'ENTITIES' |
[ |
Ограничение допустимости: имя сущности ] |
|
|
|
|'NMTOKEN' |
[ |
Ограничение допустимости: метка имени ] |
|
|
|
| 'NMTOKENS' |
[ |
Ограничение допустимости: метка имени ] | |
Ограничение допустимости: ID Значения типа ID должны соответствовать продукции Name. Имя не должно присутствовать в документе XML в качестве значения этого типа более одного раза; т.е. значения ID должны уникальным образом идентифицировать связанные с ними элементы.
<< Предыдущая глава | Следующая глава >>
Синий сайт
|