Обратимся теперь к синтаксису элементов. EBNF-правило, определяющее элемент, выглядит следующим образом:
[39] element ::= EmptyElemTag
| STag content ETag
Пустому элементу соответствует нетерминал EmptyElemTag
. Непустой элемент начинается открывающим тегом (нетерминал STag
), включает некоторое содержимое ( content
) и заканчивается закрывающим тегом ( ETag
).
Открывающий тег состоит из имени ( Name
) и последовательности определений атрибутов ( Attribute
), которые разделены пробельными символами:
[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. Например, вместо
в XML следует писать
.
Замечание
Для того чтобы привести синтаксис HTML в соответствие со стандартом XML, был создан язык XHTML. Этот язык полностью соответствует синтаксису XML, что делает возможным обработку XHTML-документов XML-средствами, но при этом набор тегов XHTML идентичен набору тегов языка HTML. К сожалению, далеко не все браузеры поддерживают XHTML. Чаще всего проблемы возникают именно с пустыми элементами (или одиночными тегами в терминах HTML): например, браузеры могут некорректно воспринимать запись вида
. В большинстве случаев проблема решается использованием перед косой чертой пробела: запись вида
, скорее всего, будет обработана корректно.
В элементах можно использовать атрибуты с присвоенными им значениями. Атрибут задается в следующем виде:
атрибут =" значение "
Например, в записи гипертекстовой ссылки
<���а href="http://www.xsltdev.ru">Заходите к нам!</а>
элемент а
имеет атрибут href
, которому присвоено значение "http://www.xsltdev.ru"
.
В языке XML атрибуты всегда должны иметь значения. Например, атрибут selected
в записи элемента
выбранный элемент
будет задан с точки зрения XML некорректно, поскольку ему не присвоено значение. Заметим, что в HTML такое определение является вполне нормальным. Такую ошибку легко исправить следующим образом:
выбранный элемент
Значения атрибутов заключаются в кавычки — одинарные или двойные, например, в предыдущем случае можно написать:
выбранный элемент
На практике часто бывает необходимым использовать в значениях атрибутов кавычки (например, для записи литералов). Следующий пример иллюстрирует, как это можно делать:
Атрибуту login
присвоено значение "scott"
(включая двойные кавычки), атрибуту password
— значение 'tiger'
(включая одинарные кавычки).
В XML один элемент не может иметь атрибуты с одинаковыми именами.
Определение атрибута состоит из имени, за которым следует знак равенства, а затем, значение атрибута:
[41] Attribute ::= Name Eq Attribute
[25] Eq ::= S? '=' S?
[10] AttValue ::= '"' ([^<&"] | Reference)* '"'
| "'" ([^<&'] | Reference)* "'"
Значение атрибута записывается в одинарных или двойных кавычках, причем оно не может содержать символов ' <
' и ' &
', которые используются в XML как управляющие символы ( <
открывает тег элемента, а &
— сущность). Вместе с тем, значение атрибута может содержать сущность (нетерминал Reference
) — специальную конструкцию, о которой мы поговорим чуть позже.
Читать дальше