Книга: 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, — рассмотреть их по возвращаемым типам данных.

Оглавление книги


Генерация: 1.214. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз