Технология XSLT (Валиков) - страница 16

Рис. 1.1. Документ и соответствующее ему дерево элементов

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

Обратимся теперь к синтаксису элементов. 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 ::= ''

Имена в открывающем и закрывающем тегах должны совпадать.

Содержимое элемента может состоять из элементов (нетерминал >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): например, браузеры могут некорректно воспринимать запись вида