Алексей Валиков - Технология XSLT
Теперь этот документ несет в себе не только данные о коммерческом предложении, но и примитивную информацию о том, как он должен выглядеть визуально. Это делает документ более понятным, но понятным для человека, а не для машины. Словосочетания "быстрое охлаждение" и "бесплатная доставка по городу", выделенные в тексте одинаковыми тегами, на самом деле описывают совершенно разные вещи. Первое — свойство продукта, второе — сервис, предоставляемый фирмой. Иначе говоря, одни и те же теги в этом документе имеют разный смысл — один и тот же синтаксис выражает разную семантику.
Для решения этой проблемы несоответствия, XML предлагает очень простой и весьма эффективный способ — расширить множество используемых тегов так, чтобы они могли полностью выразить всю семантику, которой только может обладать документ. Например.
Листинг 1.2 XML-разметка рекламного объявления<advert>
Предлагаем Вашему вниманию новый <room>3</room>-x камерный
<product>холодильник</product> <product-title>"Горск"</product-title>
объемом <volume>250 л.</volume> и стоимостью всего <price>4500</price>
рублей!
Новый дизайн, <feature>быстрое охлаждение</feature> и
<feature>низкое энергопотребление</feature>,
<guarantee>3-x годовая гарантия</guarantee> на все узлы и агрегаты, а
также <service>бесплатная доставка по городу</service>!
<order>
Заказывайте прямо сейчас по телефону <phone>0-91-12-15</phone>.
</order>
<company>Фирма "Горск-Холод".</company>
</advert>
В таком виде этот документ содержит гораздо более подробную информацию о своей структуре: внутри тега <product-title> указано наименование продукта, внутри тега <price> — цена, внутри тега <service> — какой сервис предоставляет фирма и так далее. Такой текст уже можно обработать программно. Если понадобится составить таблицу, содержащую названия холодильников, объем, цену, название фирмы и телефон, все, что потребуется сделать — это получить содержимое тегов <product-title>, <volume>, <price>, <company> и <phone>. При этом совершенно не теряется возможность визуального представления документа: нужно лишь определить, как будет выглядеть содержимое того или иного тега.
Таким образом, просто расширив множество тегов, мы убили сразу двух зайцев.
□ Явным образом выделили в документе структуру данных. Это делает возможной дальнейшую машинную обработку документа, который при этом все еще остается понятным человеку.
□ Отделили данные, содержащиеся в документе, от того, каким образом документ будет представлен визуально. Это дает широкие возможности для публикации документов на различных носителях — на бумаге, в Интернет, на мобильных устройствах.
В этих двух положениях и есть смысл XML (англ. extensible Mark-up Language, расширяемый язык разметки) — отделять данные от представления и создавать в текстовом виде документы со структурой, указанной явным образом.
Синтаксически в XML, по сравнению с HTML, нет ничего нового. Это такой же текст, размеченный тегами, но с той лишь разницей, что в HTML существует ограниченный набор тегов, которые можно использовать в документах, в то время как XML позволяет создавать и использовать любую разметку, которая только может понадобиться для подробного описания данных.
XML снаружи и изнутри
Несомненным достоинством XML является также и то, что это чрезвычайно простой язык. Основных конструкций в XML очень мало, но, несмотря на это, с их помощью можно создавать разметку документов практически любой сложности.
Для того чтобы познакомиться с устройством XML-документов, рассмотрим простой пример:
<?xml version="1.0"?>
<advert>
<product title="Слон">
Покупайте наших слонов!
</product>
</advert>
Первая строка документа определяет его как XML-документ, построенный в соответствии с первой версией языка. Следующая строка содержит открывающий тег <advert>. Далее находится открывающий тег <product>, который имеет атрибут title со значением "Слон". Четвертая строка в документе — рекламный лозунг "Покупайте наших слонов!". Затем следует закрывающий тег </product> и, наконец, закрывающий тег </advert>.
XML использует ту же теговую разметку, что и HTML, но при этом теги в XML не просто ограничивают часть текста документа — они выделяют в документе один элемент. В предыдущем примере документ имел два элемента — advert:
<advert>
<product title="Слон">
Покупайте наших слонов!
</product>
</advert>
и product:
<product title="Слон">
Покупайте наших слонов!
</product>
Как видно, элемент product включен в элемент advert. Точно так же, как в HTML одни теги могли находиться внутри других тегов, в XML элементы могут содержать другие элементы, а также иметь атрибуты и содержать текст. В следующем разделе мы подробно рассмотрим основные конструкции XML, которые понадобятся нам в дальнейшем.
Конструкции XML
Помимо элементов, атрибутов и текста, документы могут также содержать другие конструкции, такие как комментарии, инструкции по обработке и секции символьных данных. Эти базовые составляющие используются для того, чтобы гибко, но в четком соответствии со стандартом, размечать документы любой сложности. Далее мы подробно разберем каждую из основных конструкций XML-документа.
Элемент
Теги в XML-документе не просто размечают текст — они выделяют объект, который и называется элементом. Элементы являются основными структурными единицами XML — именно они иерархически организуют информацию, содержащуюся в документе.
Элементы могут быть пустыми, то есть не содержать ни данных, ни других конструкций, либо непустыми — включать в себя текст, другие элементы и т.п.
Пустой элемент имеет следующий вид:
<имя атрибут1="значение1" атрибут2="значение2" и т.д./>
Примеры<img src="image.gif"/>
<br/>
<answer question="To be or not to be?" value="Perhaps"/>
Непустые элементы имеют вид:
<имя атрибут1="значение1" атрибут2="значение2" и т.д.>
...
содержимое элемента
...
</имя>
Пример<myelement myattribute="myvalue">
<mysubnode>
sometext
</mysubnode>
</myelement>
И в том, и в другом случае, имя задает имя элемента, а конструкции вида атрибутX="значениеХ" — определяют значения его атрибутов. Имена в XML являются регистро-зависимыми, то есть имена MyElement, myelement и MYELEMENT различаются. Кроме того, имена в XML могут принадлежать различным пространствам имен, о которых мы поговорим чуть позже.
Элементы являются основной конструкцией языка XML. Организуя содержимое в элементах, можно явно выделить иерархическую структуру документа. Легко заметить, что документ, состоящий из вложенных друг в друга элементов, устроен подобно дереву: родительский элемент является корнем, в то время как дочерние элементы, которые включаются в него, являются ветками, а если они не содержат ничего более, то и листьями. Следующий пример (рис. 1.1) иллюстрирует эту концепцию.
Рис. 1.1. Документ и соответствующее ему дерево элементов
Очень важно понять, что XML-документ логически организован в виде дерева. Дерево является довольно простой структурой для обработки, но при этом выразительная сложность его весьма велика. Древовидная структура является одной из наиболее подходящих абстракций для описания объектов и отношений в реальном мире — возможно именно древовидное устройство наряду с простотой использования обеспечили XML такой потрясающий успех.
Обратимся теперь к синтаксису элементов. EBNF-правило, определяющее элемент, выглядит следующим образом:
[39] element ::= EmptyElemTag
| STag content ETag
Пустому элементу соответствует нетерминал EmptyElemTag. Непустой элемент начинается открывающим тегом (нетерминал STag), включает некоторое содержимое (content) и заканчивается закрывающим тегом (ETag).
Открывающий тег состоит из имени (Name) и последовательности определений атрибутов (Attribute), которые разделены пробельными символами: