Книга: XSLT
Изучаем XPath
Изучаем XPath
Хотя мы уже знаем, например, что для обращения к текущему узлу можно присвоить «.» атрибуту select
, «.» не является допустимым образцом выбора: это сокращение XPath для self::node()
. Применение образцов выбора ограничено только двумя осями: ребенка и атрибута, но в XPath тринадцать осей, включая self
. В этой главе мы рассмотрим все эти оси и приемы работы с ними.
Говоря формально, XPath позволяет вам ссылаться на определенные разделы XML-документов — это язык, предназначенный для адресации различных частей таких документов. При помощи XPath вы указываете, с какой частью документа вы хотите работать. Вот что W3C говорит о XPath:
«Основная задача XPath — адресовать части документа XML. Для реализации этой первоочередной цели он также предоставляет основные средства оперирования строками, числами и логическими значениями. XPath обладает компактным, отличным от XML синтаксисом для облегчения его применения в идентификаторах URI и значениях атрибутов XML. XPath работает с абстрактной, логической структурой XML-документа, а не с его внешним синтаксисом. XPath получил свое имя благодаря тому, что для навигации по иерархической структуре XML-документа в нем используется нотация пути (path), как в идентификаторах URI».
Эта цитата взята из спецификации XPath 1.0. Заметьте, что, хотя основной целью XPath является адресация частей XML-документов, он также поддерживает синтаксис для работы со строками, числами и логическими (true/false) значениями, который, как мы увидим, сам по себе очень полезен.
В данный момент стандартом является XPath версии 1.0, но были выпущены требования для XPath 2.0. Пока еще нет рабочих проектов XPath 2.0, есть только список того, что W3C планирует туда включить. В конце главы будет приведен обзор этого списка. Первичные источники XPath вы найдете в двух местах:
• спецификация XPath 1.0. XPath применяется для поиска и указания определенных разделов и элементов в документах XML для дальнейшей работы с ними. www.w3.org/TR/xpath;
• требования XPath 2.0. XPath обновляется и в него включаются дополнительные средства поддержки XSLT 2.0 — в первую очередь поддержка схем XML. www.w3.org/TR/xpath20req.
Вас могут заинтересовать следующие руководства по XPath:
• http://www.zvon.org/xxl/XPathTutorial/General/examples.html;
• http://www.pro-solutions.com/tutorials/xpath/.
Рассмотренные нами до сих пор образцы выбора возвращали наборы узлов (node set), в которых можно было осуществить выбор или обработать набор в цикле, но XPath предоставляет более общие средства. Помимо наборов узлов, выражения XPath могут также возвращать числа, логические (true/false) значения и строки. Чтобы разобраться с XPath, необходимо разобраться с выражениями XPath. Только один вид выражения XPath (хотя и очень важный) возвращает наборы узлов, определяющие разделы документа. Как мы увидим, другие выражения XPath возвращают данные других видов.
Полный синтаксис выражений XPath описан в спецификации XPath, и я приведу его здесь для справки. Как и в случае образцов выбора, для формального определения выражений XPath W3C использует нотацию расширенных форм Бэкуса-Наура (РБНФ). (Описание этой грамматики вы можете найти по адресу www.w3.org/TR/REC-xml, раздел 6.) В следующем списке приведена нужная нам нотация РБНФ:
• ::=
означает «определяется как»;
• +
означает «один или больше»,
• *
означает «ноль или больше»;
• |
означает «или»;
• -
означает «не»;
• ?
означает «не обязательно»;
Также примите во внимание, что когда элемент заключен в одиночные кавычки, как 'ancestor'
или '::
', это значит, что элемент должен появиться в выражении буквально (как "ancestor::PLANET
"), — такие элементы называются литералами, literals
. Ниже приведено полное формальное определение выражения XPath (здесь оно называется Expr
):
Expr ::= OrExpr
OrExpr ::= AndExpr | OrExpr 'or' AndExpr
AndExpr ::= EqualityExpr | AndExpr 'and' EqualityExpr
EqualityExpr ::= Relational Expr | EqualityExpr '=' Relational Expr
| EqualityExpr '!=' RelationalExpr
RelationalExpr ::= AdditiveExpr | RelationalExpr '<' AdditiveExpr
| RelationalExpr '>' AdditiveExpr | RelationalExpr '<=' AdditiveExpr
| RelationalExpr '>=' AdditiveExpr
AdditiveExpr ::= MultiplicativeExpr | AdditiveExpr '+' MultiplicativeExpr
| AdditiveExpr '-' MultiplicativeExpr
MultiplicativeExpr ::= UnaryExpr
| MultiplicativeExpr
MultiplyOperator ::= UnaryExpr
| MultiplicativeExpr 'div' UnaryExpr | MultiplicativeExpr 'mod' UnaryExpr
UnaryExpr ::= UnionExpr | '-' UnaryExpr
MultiplyOperator ::= '*'
UnionExpr ::= PathExpr | UnionExpr '|' PathExpr
PathExpr ::= LocationPath | FilterExpr
| FilterExpr '/' RelativeLocationPath | FilterExpr '//' RelativeLocationPath
LocationPath ::= RelativeLocationPath | AbsoluteLocationPath
AbsoluteLocationPath ::= '/' RelativeLocationPath? | AbbreviatedAbsoluteLocationPath
RelativeLocationPath ::= Step | RelativeLocationPath '/' Step
| AbbreviatedRelativeLocationPath
AbbreviatedAbsoluteLocationPath ::= '//' RelativeLocationPath
AbbreviatedRelativeLocationPath ::= RelativeLocationPath '//' Step
Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep
AxisSpecifier ::= AxisName '::' | AbbreviatedAxisSpecifier
AxisName ::= 'ancestor' | 'ancestor-or-self' | 'attribute' | 'child' | 'descendant'
| 'descendant-or-self' | 'following' | 'following-sibling' | 'namespace'
| 'parent' | 'preceding' | 'preceding-sibling' | 'self'
AbbreviatedAxisSpecifier ::= '@'?
NodeTest ::= NameTest | NodeType '(' ')'
| 'processing-instruction' '(' Literal ')'
NameTest ::= '*' | NCName '*' | QName
NodeType ::= 'comment' | 'text' | 'processing-instruction' | 'node'
Predicate ::= '[' PredicateExpr ']'
PredicateExpr ::= Expr
FilterExpr ::= PrimaryExpr | FilterExpr Predicate
PrimaryExpr ::= VariableReference | '(' Expr ')'
| Literal | Number | FunctionCall
VariableReference ::= '$' QName
Number ::= Digits ('.' Digits?)? | Digits
Digits ::= [0-9]+
FunctionCall ::= FunctionName '(' ( Argument ( Argument )* )? ')'
FunctionName ::= QName - NodeType
Argument ::= Expr
AbbreviatedStep := '.' | '..'
Как видите, спецификация весьма объемна, она включает и обращения к функциям XPath (с которыми мы познакомимся в следующей главе). Лучший способ понять, как работают выражения XPath, — рассмотреть их по возвращаемым типам данных.
- Изучаем XPath
- Типы данных XPath
- Создание путей расположения XPath
- Шаги расположения XPath, часть 1: оси
- Шаги расположения XPath, часть 2: условия узлов
- Шаги расположения XPath, часть 3: предикаты
- Применение осей XPath
- Применение оси ancestor
- Применение оси ancestor-or-self
- Применение оси descendant
- Применение оси descendant-or-self
- Применение оси following
- Применение оси following-sibling
- Применение оси namespace
- Применение оси parent
- Применение оси preceding
- Применение оси preceding-sibling
- Применение оси self
- Примеры путей расположения
- Сокращенный синтаксис XPath
- Проверка выражений XPath
- XPath 2.0
- Глава 6. XPath-выражения
- Глава 6 XPath-выражения
- Применение осей XPath
- Шаги расположения XPath, часть 3: предикаты
- Часть I Изучаем компьютер
- Разбор XPath-выражений
- 15.1.3. XPath и другие интерфейсы
- Почему в версии 1.1 .NET Compact Framework не поддерживаются XSLT и XPath?
- Изучаем полезные программы
- Глава 6. Продающий маркетинг. Изучаем шаги технологии «Гвоздь и молоток»
- Шаги расположения XPath, часть 1: оси
- Визуальный осмотр офиса изучаемого предприятия на спутниковой фотографии с использованием Google Map