КаталогИндекс раздела


©IBM deweloperWork
© А.С.Деревянко (перевод)

Начало работы с XPath

Bertrand Portier

Содержание

  1. Введение
  2. О примерах, используемых в этом учебнике
  3. Обзор XPath
  4. Терминология XPath
  5. Маршруты местоположения
  6. Выражения
  7. Библиотека функций
  8. Заключение

1. Введение

Нужен ли мне этот учебник?

Этот учебник рассматривает большинство аспектов XML Path Language или XPath. Он предназначен для людей, которые на знают XPath или хотят освежить свои знания. Если вы собираетесь использовать XSLT, вы должны сначала обратиться к этому учебнику. Вы изучите:

XPath является стандартом W3C. Этот учебник фокусируется на версии 1.0. За информацией о грядущей XPath 2.0 обратитесь к Заключению.

Предварительные требования

Этот учебник предполагает базовые знания об XML. Например, вы должны знать, что такое элементы, атрибуты и значения. Если вы не знакомы с этим, я рекомендую вам обратиться к учебнику "Введение в XML", ссылка на который есть в Ресурсах.

Вам также понадобится текстовый редактор и Web-браузер. Хотя это и не является обязательным условием, может оказаться полезным иметь XML-редактор, если в него будет включен вычислитель Xpath, что позволит вам проверять используемые здесь выражение XPath.

Технологии, относящиеся к XML

Ниже перечисляются технологии, упоминаемые в этом учебнике. Пропустите их, если вы уже знакомы с относящимися к XML технологиями. Все эти технологии определяются спецификациями W3C.

Об авторе

Bertrand Portier инженер по программному обеспечению, работающий в IBM Software Group Services. Он работает с пользователями IBM WebSphere, обеспечивая решения для задач их бизнеса. До этого он работал разработчиком в области Web-сервисов. Вы можете связаться с ним по адресу portier@uk.ibm.com.

 

2. О примерах, используемых в этом учебнике

Обзор

В этом учебнике вы будете изучать XPath на примере написания презентационного уровня приложения сайта аукциона. Вы будете задавать выражения XPath в таблицах XSLT, используемых для презентации XML-документов, представляющих лоты аукциона. Все файлы, используемые в этом учебнике, находятся zip-файле, x-xpathTutorial.zip, включая:

AuctionItemList.xsd

AuctionItemList.xsd содержит бизнес-правила для лотов аукциона и данных списка лотов, описанных на языке XML Schema:

Список лотов аукциона имеет только один корневой элемент с именем list типа auctionItemList.

auctionItemList состоит из нуля или более элементов item типа auctionItem.

auctionItem состоит из пяти элементов (bidIncrement, currentPrice типа price, endOfAuction, description и sellerId) и одной группы атрибутов типа itemAttributes.

price является положительным двухзначным десятичным значением и должно иметь связанный с ним атрибут currency типа customCurrency.

customCurrency должен иметь одно из значений: USD, GBP или EUR.

Группа itemAttributes должна содержать один строковый атрибут type, один строковый атрибут id и один булевский атрибут private, который по умолчанию является false.

Атрибут type должен иметь одно из значений: Unknown, Traditional, BidOnly, FixedPrice или IndividualOffer.

Если вы хотите узнать больше об XML Schema, см. ссылки на статьи и учебники на developerWorks в Ресурсы.

AuctionItemList.xml

AuctionItemList.xml соответствует XML schema, определенной в defined in AuctionItemList.xsd, и содержит список типа auctionItemList. Этот список содержит семь составляющих. Атрибут xsi:schemaLocation корневого элемента списка показывает, of the list root element indicates that this XML-документ должен соответствовать схеме AuctionItemList.xsd.

Это обеспечивает формат данных, а как же насчет презентации? Как вы определяете, какая таблица стилей XSLT используется для отображения этого XML-документа в Web-браузере? Это определяется второй строкой XML-документа:

<?xml-stylesheet type="text/xsl" href="AuctionItemSummary-Base.xsl"?>

Здесь я устанавливаю, что должна использоваться таблица стилей AuctionItemSummary-Base.xsl. Сами данные должны быть выбраны так, что может быть продемонстрировано применение Xpath, чтобы показать определенные свойства данных. Если с XML-документом AuctionItemList.xml не связывается таблица стилей, то Web-браузер просто показывает содержимое XML, оно выгладит так:

AuctionItemSummary-Base.xsl

AuctionItemSummary-Base.xsl является таблицей стилей XSLT, которая определяет правила, применяемые процессором XSLT для отображения XML-документов AuctionItemList. Она использует выражения XPath для нахождения информации в XML-документе и отображения ее в таблице HTML. Я буду более подробно рассматривать использование XPath в XSLT в разделе Обзор Xpath. Здесь я кратко опишу содержимое AuctionItemSummary-Base.xsl. Она определяет шаблоны, которые активируются при обработке XML-документов. Какой шаблон активируется, зависит от выражения Xpath, записанного в атрибуте match этого элемента template. Например, следующие фрагменты, взятые из AuctionItemSummary-Base.xsl, являются выражениями XPath:

Информация, которая отображается, когда шаблон активируется, определяется его атрибутами value-of элемента select. Значения этих атрибутов также являются выражениями XPath. Например:

В каждом разделе (Маршруты местоположения, Выражения, Библиотека функций), вы будете модифицировать AuctionItemSummary-Base.xsl, чтобы отображать информацию разными способами.

До сих пор вы должны были просматривать файлы в текстовом или XML-редакторе. Теперь вы можете открыть AuctionItemList.xml в вашем Web-браузере, чтобы увидеть выход, сгенерированный процессором XSLT на основе таблицы стилей. Вы должны увидеть что-то вроде:

 

3. Обзор XPath

Что такое XPath?

Язык XML Path (XPath) является набором синтаксических и семантических правил для ссылок на части XML-документов. XPath предназначен для использования другими спецификациями, такими как XSL Transformations (XSLT) и XML Pointer Language (XPointer). Чтобы помочь вам понять, что такое XPath, я начну с того, что покажу примеры, относящиеся к AuctionItemList.xml.

Выражения XPath идентифицируют набор узлов в XML-документе. Этот набор узлов содержит ноль или более узлов. Например, выражение XPath /list, примененное к AuctionItemList.xml, идентифицирует один-единственный узел - корневой элемент list.

Выражение XPath /list/item идентифицирует все элементы item.

XPath использует нотацию с прямой наклонной чертой (/), аналогичную shell в UNIX. Поэтому XPath может применяться в Uniformed Resource Identifier (URI), таких как URL. Именно отсюда и пришел XPath: использование нотации маршрута, как в URL.

Допустимые выражения XPath могут включать в себя предикаты. Предикаты содержат логические выражения, которые проверяются для каждого узла в контексте набора узлов. Если истина, узел сохраняется в наборе идентифицируемых узлов; иначе, узел отбрасывается. Предикаты полезны для сокращения результирующего набора. Например, следующее выражение XPath идентифицирует только вторую составляющую:

/list/item[currentPrice>1000.0]

Выражения XPath могут ссылаться на атрибуты так же, как и на элементы в XML-документе. При ссылке на атрибут используется символ @. Например, следующее выражение XPath идентифицирует элементы currentPrice, в которых атрибуты currency содержат значение EUR:

/list/item/currentPrice[@currency="EUR"]

XPath также предоставляет функции, которые могут быть очень удобными. Я покажу это вам более подробно в разделе Библиотека функций, но немножко об этом скажем здесь. Выражение Xpath, приведенное ниже, идентифицирует элемент description составляющей, которая имеет type - "IndividualOffer" (и имеет значение 2MP digital camera):

/list/item[starts-with(@type,"Ind")]/description

Проверьте приведенное выше выражение XPaths в вашем XML-редакторе: откройте AuctionItemList.xml и введите выражение в вычислитель Xpath, чтобы увидеть, какие узлы выбираются.

Итак, теперь вы посвящены в XPath! До сих пор вы изучили, что XPath является языком для идентификации частей XML-документов. Вы увидели, как выглядит выражение XPath и как оно ссылается на элементы и атрибуты в XML-документах. Я также показал вам, как XPath обеспечивает функции для манипулирования данными. Однако, это только быстрый обзор; я буду обсуждать все эти вопросы более подробно - а также и другие аспекты XPath - в остальных разделах. Например, я исследую пространства имен XPath и специальные символы (такие, как // и *) и покажу вам, что не все выражения Xpath имеют форму, показанную в вышеприведенных примерах (называемую сокращенными маршрутами местоположения).

XSLT, Xlink и XPointer

XSLT, Xlink и XPointer являются стандартами W3C. XSLT и Xpath вместе сXSL Formatting Object (XSL-FO) составляют семейство спецификаций eXtensible Stylesheet Language (XSL). (Если вы хотите посмотреть эти спецификации, см. Ресурсы.)

Презентация: XSLT экстенсивно использует XPath для проверки соответствия - то есть, проверки того, соответствует ли узел данному шаблону. XSLT задает контекст, используемый XPath. Вы должны понимать Xpath, если вы хотите работать с XSLT. В разделе О примерах, используемых в этом учебнике вы видели, что таблица стилей AuctionItemSummary-Base.xsl содержит выражения XPath. Эти выражения XPath используются XSLT для нахождения в исходном документе элементов, которые соответствуют критериям, а также для отображения информации в результирующий документ. XSLT также использует функции XPath для выполнения арифметических операций и манипуляций со строками.

Связывание: XLink предоставляет обобщение XML концепции гиперссылок HTML. XLink определяет синтаксис для элементов, вставляемых в XML-документы, чтобы связать ресурсы вместе и описать их отношения. Эти связи могут быть однонаправленными, как гиперссылки HTML, или более сложными. XLink использует XPointer для определения местонахождения ресурсов.

Указание: XPointer является расширением Xpath, которое обеспечивает адресацию в XML-документах и их внутренних частях. XPointer обобщает представление узлов XPath концепциями местоположений, точек и рангов XPointer. XPointer также задает контекст, используемый при вычислениях XPath и предоставляет дополнительные функции, которых нет в XPath.

XPath существенен для всех упомянутых выше спецификаций. Фастически, спецификацияe XPath явным образом устанавливает, что XPath разработан для использования в XSLT и XPointer.

Вот сводка технологий XML, о которых я говорил до сих пор:

 

4. Терминология XPath

Что такое узел XPath?

XPath выглядит, как XML-документ, как дерево узлов. Узлы могут быть разных типов, таких как узлы элементов или узлы атрибутов. Некоторые типы узлов имеют имена, которые состоят из URI пространства имен XML, возможно не определенного, и локальной части. Например, на рисунке ниже показано представление в XPath AuctionItemList.xml как дерева узлов:

Специальным типом узла является корневой узел. XML-документ содержит только один такой узел и он является корнем дерева, содержащего весь XML-документ. Заметьте, что корневой узел содержит корневой элемент, а также любые узлы инструкций обработки, объявлений или комментариев, которые появляются до или после корневого элемента. В примере дочерними узлами корневого узла являются:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="AuctionItemSummary-Base.xsl"?>

и

<list ...>
  <item ...>
    ...
  </item>
  <item ...>
    ...
  </item>
  ...
</list>

Не существует типа узла для XML-декларации (такой, как <?xml version="1.0" encoding="UTF-8"?> ) или Document Type Definition (DTD). Следовательно, на такие сущности нельзя ссылаться в XPath. Элементные узлы представляют каждый элемент в XML-документе. Узлы атрибутов принадлежат элементным узлам и представляют атрибуты в XML-документе. Однако, атрибуты, которые начинаются с xmlns:, представляются в XPath с узлами пространств имен. Другие типы узлов включают в себя текстовые узлы, узлы инструкций обработки и узлы комментариев.

Вне контекста?

XPath вычисляет выражения относительно контекста. Этот контекст обычно задается приемами, расширяющими XPath, такими, как XSLT и XPointer. Контекст XPath включает в себя узел контекста, размер контекста, позицию контекста и другие данные контекста. С точки зрения контекста, здесь наиболее интересен узел контекста. Если узел контекста является корневым узлом, list/item ссылается на семь элементов item в AuctionItemList.xml. Если узел контекста является другим узлом - например, первым элементом item -- list/item не ссылается на что-либо в XML-документе.

В XSLT значения атрибутов select являются выражениями XPath. Например, в AuctionItemSummary-Base.xsl элементы xsl:apply-templates и xsl:value-of имеют атрибуты select, значениями которых (выражениями XPath) являются, помимо прочего, list, item или itemId. В XSLT узлом контекста является текущий вычисляемый узел. Шаблоны XSLT могут быть активированы несколько раз для XML-документа и обеспечивать разные результаты. В AuctionItemList.xml первый и второй шаблоны (match="/" и match ="list", соответственно) активируются один раз, а третий шаблон (match="item") активируются семь раз (по одному разу на каждый элемент item). В первый раз, когда активируется шаблон "item", контекстным узлом является первый элемент item в XML-документе ("Miles Smiles album, CD") и, например, значением <xsl:value-of select="@id"/> является itemId0001. Когда шаблон XSLT активируется второй раз, контекстным узлом является второй элемент item ("Coltrane Blue Train" CD) и значением <xsl:value-of select="@id"/> является itemId0002. Заметьте, что я использовал /list/item/@id, а не @id для атрибута select, значение элемента xsl-value-of должно быть неопределенным.

 

5. Маршруты местоположения

Что такое маршрут местоположения?

Маршруты местоположения является наиболее полезным и широко используемым свойством XPath. Маршрут местоположения является специализацией выражения XPath (описанного в Выражения). Маршрут местоположения идентифицирует набор узлов XPath относительно его контекста. XPath определяет два синтаксиса: the сокращенный синтаксис и несокращенный синтаксис.

В этом учебнике я рассказываю только о сокращенном синтаксисе, потому что он наиболее широко используется; несокращенный синтаксис также является более сложным. Если вы интересуетесь несокращенным синтаксисом, посмотрите спецификацию XPath 1.0 (см. Ресурсы).

Есть два типа маршрутов местоположения: относительный и абсолютный.

Относительный маршрут местоположения - это последовательность местоположений, разделенных /. Например:

list/item[currentPrice<20.0]

Этот маршрут местоположения состоит из двух шагов установки местоположения: первый, list, выбирает набор узлов относительно контекстного узла; второй, item[currentPrice<20.0], выбирает набор узлов в подмножестве, идентифицированном первым шагом, и т.д., если есть еще узлы. Абсолютный маршрут местоположения состоит из /, за которым, возможно, следует относительный маршрут местоположения, здесь / ссылается на корневой узел. Абсолютный маршрут местоположения является относительным маршрутом местоположения, вычисляемым в контексте корневого узла, например:

/list/item[currentPrice<20.0]

При абсолютном маршруте местоположенияs (маршруты местоположения, которые начинаются с /) контекстный узел не принимается во внимание, так как маршрут всегда вычисляется от корневого узла.

Полезный синтаксис

Сокращенный синтаксис предоставляет набор символов (большинство из них мы показывали в Обзор XPath). Я сейчас перечислю наиболее широко используемые символы и дам примеры относительно корневого узла AuctionItemList.xml, - то есть, узлом контекста будет корневой узел AuctionItemList.xml.

@ используется для ссылки на атрибуты. Например, the маршрут местоположения @currency идентифицирует атрибут currency. list/item[@private] идентифицирует элементы item с атрибутом private - то есть, все элементы item в AuctionItemList.xml.

* используется для ссылки на все элементы, которые являются дочерними для узла контекста. @* используется для ссылки на все атрибуты узла контекста.

[] могут также использоваться для ссылки на определенный элемент в упорядоченной последовательности. Например, list/item[2] ссылается на второй элемент item. На самом деле это - предикат (описывается далее в Предикаты).

// используется для ссылки на все дочерними элементы узла контекста. Например, //item ссылается на все элементы item, а //list/item ссылается на все элементы item, которые имеют родителем list (то есть, все элементы item в примере).

. используется для ссылки на сам узел контекста. Например, . выбирает узел контекста, а .//item ссылается на все элементы item, которые являются дочерними для узла контекста.

.. используется для ссылки на родительский узел узал контекста. Например, ../item ссылается на первый элемент item в контексте первого элемента bidIncrement.

Предикаты

Предикаты используются в маршрутах местоположения для фильтрации текущего набора узлов. Предикат содержит булевское выражение (или выражение, которое может быть преобразовано в булевское). Каждый член текущего набора узлов проверяется по булевскому выражению и сохраняется, если выражение истинно; иначе он выбрасывается. Предикат заключается в квадратные скобки, []. Посмотрим на следующий маршрут местоположения:

list/item/currentPrice[@currency="EUR"]

При вычислении все элементы currentPrice в AuctionItemList.xml находятся в выбранном наборе узлов. Затем вычисляется предикат @currency="EUR" и элементы currentPrice, которые не содержат значения EUR, удаляются.

Предикаты могут использовать также операции отношений >, <, >=, <= и !=. Они могут также использовать булевские операторы, как вы увидите в разделе Выражения.

Лабораторная работа: Маршруты размещения

Теперь, когда я объяснил, что такое маршруты местоположения, вашей задачей будет модифицировать AuctionItemSummary-Base.xsl, чтобы обеспечить следующий вывод - таблицу, содержащую только составляющие, в которых валюта указана в долларах США:

Примечание: Вам нужно заменить значение атрибута select в шаблоне list на правильный маршрут местоположения. Используйте апостроф (') внутри строки, заключенной в кавычки ("). Я расскажу об этом подробнее в разделе Выражения.

Решением этого является AuctionItemSummary-Section5.xsl. Измените вторую строку AuctionItemList.xml, чтобы она ссылалась на AuctionItemSummary-Section5.xsl, и откройте AuctionItemList.xml в вашем Web-браузере.

Маршруты размещения являются подмножеством более общих выражений XPath. Выражение не только ссылается на набор узлов (маршруты местоположения), но может также возвращать булевское значение, число или строку.

 

6. Выражения

Булевские

Булевские выражения могут иметь одно из двух значений: истина или ложь.

XPath определяет операторы and и or. Для and первым вычисляется левый операнд, если он ложь, то выражение возвращает ложь; иначе вычисляется правый операнд и определяет результат выражения. Для or вычисляется левый операнд; если он истина, то выражение возвращает истину; иначе вычисляется правый операнд и определяет результат выражения. Например, булевское выражение type="BidOnly" вычисляется в истину в контексте второго элемента item в AuctionItemList.xml.

XPath определяет следующие операторы:

Например, булевское выражение bidIncrement != 10 возвращает истину в контексте первого элемента item в AuctionItemList.xml и ложь в контексте второго элемента item.

Оператор =, когда он применяется к узлам, проверяет, имеют ли узлы одно и то же значение, а не то, являются ли они одним и тем же узлом. Это может быть использовано при сравнении значений атрибутов. Например, item[@type = @private] выбирает составляющие, в которых атрибуты type и private имеют одно и то же значение.

Когда выражение XPath содержится в XML-документе, должны быть выдержаны правила правильного форматирования XML 1.0, и любые символы < или <= должны быть представлены, как &lt; и &lt;= , соответственно. Например, выражение XPath bidIncrement < 5 является правильным в Xpointer, но должно быть записано, как bidIncrement &lt; 5, если оно должно содержаться в документе XSLT.

Если операнды булевского выражения имеют неодинаковый тип (наборы узлов, числа, строки), происходит преобразование. Подробности см. в спецификации XPath 1.0.

Числа

Числа в XPath - это 64-бтиные числа двойной точности с поавающей точкой. Числа XPath включают в себя значение "Not-a-Number" NaN, положительную и отрицательную бесконечность и положительный и отрицательный нуль.

Числовые операторы, предоставляемые XPath такие: + (сложение), - (вычитание), * (умножение), div (деление) и mod (остаток от деления).

Числовые операторы при необходимости преобразуют операнды в числа, как если бы они использовали функцию number (описывается в разделе Библиотека функций).

Примечание: Перед оператором вычитания (-) должен быть пропуск, поскольку XML допускает символы "-" в строках.

Вот несколько примеров числовых выражений XPath:

Примечание: Звездочка (*) может интерпретироваться, как символ-джокер или как символ умножения. XPath определяет лексические правила, позволяющий избежать двусмысленности (подробности см. в спецификации XPath 1.0). Но был введен новый оператор для символа деления, div, полтому что прямая косая черта (/) используется для разделения шагов определения местоположения.

Строки

Строки в XPath являются последовательностями символов, допустимых в XML 1.0 (Unicode) - например, Miles Smiles album, CD.

Строки в XPath заключаются в кавычки (' или "). Если строка XPath содержится в XML-документи и содержит символы кавычек, вы должны использовать один из следующих двух вариантов:

XPath предоставляет полезные функции для работы со строками, описанные в разделе Библиотека функций.

Лабораторная работа: Выражения

Теперь, когда я объяснил вам выражения XPath, вашей задачей будет модификация AuctionItemSummary-Base.xsl таким образом, чтобы обеспечить следующий вывод - таблицу, содержащую все составляющие, для которых аукцион закончился в пределах часа:

Примечание: endOfAuction является временем (в минутах), остающимся до конца аукциона. Вам нужно модифицировать тот же атрибут select, что и в разделе Маршруты местоположения.

Решение находится в AuctionItemSummary-Section6.xsl. Измените вторую строку AuctionItemList.xml, чтобы она ссылалась на AuctionItemSummary-Section6.xsl, и откройте AuctionItemList.xml в Web-браузере.

 

7. Библиотека функций

Библиотека функций

XPath определяет набор функций, называемый базовой библиотекой функций . Каждая функция определяется тремя характеристиками:

Вы можете найти полезным применение функций в предикатах или выражениях. Другие спецификации, такие как XSLT, расширяют этот набор функций. Функции подразделяются на четыре группы, которые я обсуждаю в оставшейся части этого раздела:

Функции набора узлов

Функции набора узлов обеспечивают информацию о наборе узлов (одном узле или более). В число полезных функций набора узлов входят:

XPath также определяет еще три функции, относящиеся к именам узлов и пространствам имен:

Подробности см. в разделе 4.1 спецификации XPath 1.0.

String функции

При помощи строковых функций вы можете манипулировать строками. В число полезных строковых функции входят:

Другими строковыми функциями XPath являются: substring(), substring-before(), substring-after(), string-length(), normalize-space() и translate(). Подробности см. в разделе 4.2 спецификации XPath 1.0.

Булевские функции

Булевские функции используются для преобразования объекта или строки в истину или ложь или непосредственного получения значений истина или ложь. Булевские функции такие:

Числовые функции

Числовые функции XPath возвращают числа. Они такие:

Лабораторная работа: Библиотека функций

Теперь, когда я объяснил функции XPath, вашей задачей будет модифицировать AuctionItemSummary-Base.xsl, чтобы получить следующий вывод - таблицу, содержащую только новые аукционные лоты:

Примечание: Такие составляющие будут содержать строку New или NEW в их описании. Вам нужно модифицировать тот же атрибут select, что и в Маршруты местоположения и Выражения. Решение для этого находится в AuctionItemSummary-Section7.xsl. Измените вторую строку AuctionItemList.xml, чтобы она указывала на AuctionItemSummary-Section7.xsl и откройте AuctionItemList.xml в вашем Web-браузере.

 

8.Заключение

XPath 2.0

XPath 2.0 является надмножеством XPath 1.0 и сейчас является Рабочим Проектом W3C. Две рабочие группы W3C работают над версией XPath 2.0: рабочая группа XML Query и рабочая группа XSL. XPath 2.0 должен быть более мощным и более надежным, поскольку он поддерживает расширенный набор типов данных. Это потому, что значения XPath 2.0 используют типы данных XML Schema, а не просто строки, числа и булевские значения. XPath 2.0 является обратно-совместимым, так что выражения 1.0 ведут себя точно так же в 2.0, кроме исключений, перечисленных в спецификации. Дополнительную информацию о XPath 2.0 см. в Ресурсах.

Резюме

В этом учебнике вы узнали, что XPath является языком, который использвется для адресации частей XML-документов. Вы увидели, как XPath соотносится с другими технологиями XML, такими как XSLT и XPointer. Вы увидели, что такое выражения XPath, включая особый случай выражений, называемых маршрутами местоположения. Вы также получили обзор библиотеки функций XPath и новых свойств грядущей XPath 2.0.

Ресурсы

Следующие ресурсы могут оказаться полезными для вас:


КаталогИндекс раздела