Алексей Валиков - Технология XSLT
[40] STag ::= '<' Name (S Attribute)* S? '>'
В ряде случаев атрибуты тега могут отсутствовать.
Перед закрывающей угловой скобкой тега могут также стоять пробельные символы, поэтому вполне корректной будет следующая запись:
<а
href="http://www.xsltdev.ru"
>
В закрывающем теге имени предшествует косая черта ("/") и перед закрывающей угловой скобкой тоже могут стоять пробелы:
[42] ETag ::= '</' Name S? '>'
Имена в открывающем и закрывающем тегах должны совпадать.
Содержимое элемента может состоять из элементов (нетерминал element), сущностей (Reference), секций символьных данных (CDSect), инструкций по обработке (PI) и комментариев (Comment), перемешанных с символьными данными (CharData):
[43] content ::= CharData?
((element
| Reference
| CDSect
| PI
| Comment) CharData?)*
Пустой элемент не имеет содержимого и задается продукцией EmptyElemTag в следующем виде:
[44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>'
Тег пустого элемента выглядит точно так же, как и тег непустого элемента с той лишь разницей, что перед закрывающей угловой скобкой стоит символ косой черты ("/"). В этом, кстати, одно из главных отличий синтаксиса языка XML от HTML. Например, вместо <HR> в XML следует писать <HR/>.
ЗамечаниеДля того чтобы привести синтаксис HTML в соответствие со стандартом XML, был создан язык XHTML. Этот язык полностью соответствует синтаксису XML, что делает возможным обработку XHTML-документов XML-средствами, но при этом набор тегов XHTML идентичен набору тегов языка HTML. К сожалению, далеко не все браузеры поддерживают XHTML. Чаще всего проблемы возникают именно с пустыми элементами (или одиночными тегами в терминах HTML): например, браузеры могут некорректно воспринимать запись вида <br/>. В большинстве случаев проблема решается использованием перед косой чертой пробела: запись вида <br />, скорее всего, будет обработана корректно.
Атрибут
В элементах можно использовать атрибуты с присвоенными им значениями. Атрибут задается в следующем виде:
атрибут="значение"
Например, в записи гипертекстовой ссылки
<а href="http://www.xsltdev.ru">Заходите к нам!</а>
элемент а имеет атрибут href, которому присвоено значение "http://www.xsltdev.ru".
В языке XML атрибуты всегда должны иметь значения. Например, атрибут selected в записи элемента
<option selected>
выбранный элемент
</option>
будет задан с точки зрения XML некорректно, поскольку ему не присвоено значение. Заметим, что в HTML такое определение является вполне нормальным. Такую ошибку легко исправить следующим образом:
<option selected="selected">
выбранный элемент
</option>
Значения атрибутов заключаются в кавычки — одинарные или двойные, например, в предыдущем случае можно написать:
<option selected='selected'>
выбранный элемент
</option>
На практике часто бывает необходимым использовать в значениях атрибутов кавычки (например, для записи литералов). Следующий пример иллюстрирует, как это можно делать:
<auth login='"scott"' password="'tiger'"/>
Атрибуту login присвоено значение "scott" (включая двойные кавычки), атрибуту password — значение 'tiger' (включая одинарные кавычки).
В XML один элемент не может иметь атрибуты с одинаковыми именами.
Определение атрибута состоит из имени, за которым следует знак равенства, а затем, значение атрибута:
[41] Attribute ::= Name Eq Attribute
[25] Eq ::= S? '=' S?
[10] AttValue ::= '"' ([^<&"] | Reference)* '"'
| "'" ([^<&'] | Reference)* "'"
Значение атрибута записывается в одинарных или двойных кавычках, причем оно не может содержать символов '<' и '&', которые используются в XML как управляющие символы (< открывает тег элемента, а & — сущность). Вместе с тем, значение атрибута может содержать сущность (нетерминал Reference) — специальную конструкцию, о которой мы поговорим чуть позже.
Инструкция по обработке
В XML-документы могут быть включены не относящиеся к содержимому документа инструкции, несущие информацию для приложения, которое будет этот документ обрабатывать. Инструкции по обработке имеют вид:
<?приложение содержимое?>
Инструкция по обработке всегда заключается в угловые скобки со знаками вопроса. Первая часть инструкции, приложение, определяет программу или систему, которой предназначена вторая часть, ее содержимое.
Примером инструкции по обработке может послужить следующая запись:
<?serv cache-document?>
В данном случае целевое приложение имеет имя 'serv', а сама инструкция может быть интерпретирована как указание серверу на то, что документ нужно сохранить в кэше. Естественно, инструкции по обработке имеют смысл только для тех приложений, которым они адресуются.
Продукции инструкций по обработке имеют следующий вид:
[16] PI ::= '<?' PITarget
(S (Char* - (Char* '?>' Char*)))? '?>'
В этом правиле выражение (S (Char* - (Char* '?>' Char*)))? означает, что приложение и содержимое инструкции по обработке разделены пробельными символами, причем содержимое состоит из любых символов, кроме последовательности '?>', которая обозначает конец инструкции.
Целевое приложение может иметь любое имя (кроме "xml" в любом регистре символов). Имя целевого приложения определяется EBNF-правилом PITarget:
[17] PITarget ::= Name - (('X' | 'х') ('М' | 'm') ('L' | 'l'))
В XML определена особая конструкция, называемая ХМL-декларацией (XML declaration). Она имеет вид:
<?xml version="версия" encoding="кодировка" standalone="yes | no"/>
Несмотря на то, что XML-декларация очень похожа на инструкцию по обработке, с точки зрения стандарта она таковой не является. Если же подходить менее строго, то смысл XML-декларации полностью соответствует смыслу инструкции по обработке: она сообщает обрабатывающему данный документ программному обеспечению информацию о некоторых свойствах этого документа. XML-декларация может содержать псевдоатрибуты version, encoding и standalone, которые мы рассмотрим ниже.
ЗамечаниеВ отличие от элементов, XML-декларация, как и инструкции по обработке не могут иметь атрибутов. Однако их содержимое очень часто образуется в форме имя="значение" — такие объявления и называются псевдоатрибутами.
Псевдоатрибут version содержит информацию о версии XML, в соответствии с которой был создан этот документ. Текущей версией языка XML является 1.0, поэтому в большинстве случаев указывается version="1.0".
Пример<?xml version="1.0"?>
Псевдоатрибут encoding сообщает, в какой кодировке создан данный документ. По умолчанию выбрана Unicode-кодировка UTF-8 (подробнее см. "Использование Unicode"), но точно так же может быть использована и любая другая кодировка, лишь бы только ее поддерживало программное обеспечение, обрабатывающее документ.
ПримерБольшинство документов, созданных на русском языке, используют кириллические кодировки windows-1251 и KOI8-R; XML-декларации для этих документов будут иметь вид:
<?xml version="1.0" encoding="windows-1251"?>
и
<?xml version="1.0" encoding="KOI8-R"?>
соответственно.
Для документов, в которых использовались только нижние 127 символов ASCII, то есть, символы с кодами, не превышающими #x7F, псевдоатрибут encoding указывать необязательно. В этой области символов кодировка UTF-8 совпадает с ASCII.
Псевдоатрибут standalone говорит о том, использует ли этот документ какие-либо внешние объявления или нет. Как мы узнаем чуть позже, XML-документы могут использовать информацию, которая находится во внешних документах. Опция standalone, имеющая значение "yes", означает, что документ не содержит таких объявлений, и, значит, может быть обработан без обращения к внешним источникам.
Декларации XML соответствует продукция XMLDecl, которая, в свою очередь, использует несколько дочерних правил:
[23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl?
SDDecl? S? '?>'
Продукция VersionInfo определяет синтаксис псевдоатрибута version:
[24] VersionInfo ::= S? 'version' Eq