XPath – это просто язык, с помощью которого можно обращаться к элементам, атрибутам и тексту внутри XML_документа. XPath_выражение может обратить_ ся к XML_элементу по его положению в иерархии документа или выбрать эле_ мент по значению некоторого атрибута (или просто по его присутствию). Подроб_ ное обсуждение языка XPath далеко выходит за рамки темы этой главы, тем не менее подраздел 21.4.1 представляет собой краткое руководство по языку XPath, в котором описываются, например, наиболее общие XPath_выражения.
Консорциумом W3C был выработан предварительный стандарт на API для выбор_ ки узлов в DOM_дереве документа с помощью XPath_выражения. Firefox и родст_ венные броузеры реализуют этот прикладной интерфейс в виде метода evaluate() объекта Document (как для HTML_, так и для XML_документов). Кроме того, бро_ узеры на базе Mozilla реализуют метод Document.createExpression(), который ком_ пилирует XPath_выражения в промежуточное представление, благодаря чему повышается их эффективность при многократном использовании.
В IE вычисление XPath_выражений выполняется с помощью методов select_ SingleNode() и selectNodes() XML_объектов (но не HTML_объектов) Document и Ele_ ment. Далее в этом разделе вы найдете пример, в котором используются оба при_ кладных интерфейса: и W3C, и IE.
Чтобы обеспечить поддержку XPath_выражений и в других броузерах, обдумай_ те возможность использования свободно распространяемого проекта AJAXSLT (http://goog'ajaxslt.sourceforge.net).
532 Глава 21. JavaScript и XML
Примеры использования XPath_выражений
Если вы понимаете структуру DOM_дерева документа, то без труда разберетесь с простыми XPath_выражениями на примере. Тем не менее чтобы понимать эти примеры, вы должны знать, что XPath_выражение вычисляется относительно некоторого контекстного узла документа. Простейшие XPath_выражения про_ сто ссылаются на узлы_потомки контекстного узла:
contact // Набор всех тегов <contact>, вложенных в контекстный узел contact[1] // Первый тег <contact>, вложенный в контекстный узел contact[last()] // Последний потомок <contact> контекстного узла contact[last()_1] // Предпоследний потомок <contact> контекстного узла
Обратите внимание: индексация элементов массивов в языке XPath начинается с 1, а не с 0, как в JavaScript_массивах.
Слово «path» (путь) в названии «XPath» отражает тот факт, что этот язык интер_ претирует уровни в иерархии XML_элементов как каталоги в файловой системе и для отделения уровней иерархии использует символ «/». Например:
contact/email // Все потомки <email> потомка <contact> контекстного узла /contacts // Потомок <contacts> корневого (ведущий слэш) элемента документа contact[1]/email // Потомок <email> первого потомка <contact> contact/email[2] // Второй потомок <email> любого потомка <contact> контекста
Обратите внимание: выражение contact/email[2] возвращает множество элемен_ тов <email>, которые являются вторыми узлами <email> любого узла <contact>, вложенного в контекстный узел. Это не то же самое, что contact[2]/email или
(contact/email)[2].
Точка (.) в XPath_выражениях ссылается на контекстный элемент, а двойной слэш (//) предписывает игнорировать уровни иерархии и ссылается на любой узел_потомок, а не непосредственно на дочерний элемент. Например:
.//email // Все потомки <email> контекстного узла
//email // Все теги <email> документа (обратите внимание на ведущий слэш)
XPath_выражения могут ссылаться не только на XML_элементы, но и на их ат_ рибуты. Для идентификации имени атрибута в качестве приставки использует_ ся символ @:
@id // Значение атрибута id контекстного узла
contact/@name // Значения атрибутов name потомков <contact>
Существует возможность отобрать множество элементов, возвращаемых XPath_ выражением, по значению XML_атрибута. Например:
contact[@personal="true"] // Все теги <contact> с атрибутом personal="true"
Для извлечения текстового содержимого XML_элементов используется метод text():
contact/email/text() // Текстовые узлы внутри тегов <email> //text() // Все текстовые узлы в документе
Язык XPath различает пространства имен, благодаря чему существует возмож_ ность включать префиксы пространств имен в выражения:
//xsl:template // Отберет все элементы <xsl:template>
21.4. Выполнение запросов к XML*документу с помощью XPath*выражений
Разумеется, при вычислении XPath_выражения, использующего пространства имен, вы должны обеспечить отображение префиксов пространств имен на соот_ ветствующие им URL_адреса.
Эти примеры – всего лишь краткий обзор наиболее общих образцов применения XPath. Язык XPath имеет и другие синтаксические элементы и особенности, ко_ торые здесь не описаны. Как один из примеров – функция count(), которая воз_ вращает количество узлов в получившемся множестве, а не само множество:
count(//email) // Число элементов <email> в документе