| 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 существует четыре типа данных, а не только тип набора узлов, который должны возвращать образцы выбора:

• наборы узлов;

• логические значения;

• числа;

• строки.

ФРАГМЕНТЫ РЕЗУЛЬТИРУЮЩЕГО ДЕРЕВА

В XSLT 1.0 к типам данных XPath добавляются фрагменты результирующего дерева. Как говорилось в главе 4, фрагменты результирующего дерева представляют собой просто фрагменты дерева, которые можно присваивать переменным XSLT. Их поддержка была удалена из рабочего проекта XSLT 1.1, поэтому, скорее всего, они не будут включены в XSLT 2.0. Фрагменты результирующего дерева можно рассматривать как типы данных при помощи <xsl:variable>, что мы и увидим в главе 9.

В следующих разделах мы по очереди рассмотрим эти типы данных.

Наборы узлов XPath

Как следует из имени, набор узлов (node set) является просто совокупностью узлов. Набор узлов может включать несколько узлов, единственный узел или быть пустым. Поскольку главная задача XPath — определять место разделов документов, постольку возвращающие наборы узлов выражения XPath являются наиболее популярными типами выражений. Например, выражение XPath child::PLANET возвращает набор узлов из всех элементов <PLANET>, дочерних для контекстного узла. Выражение child::PLANET/child::NAME возвращает набор узлов из всех элементов <NAME>, дочерних для элементов <PLANET> контекстного узла. Выражения XPath такого рода называются путями расположения, location path (W3C называет их «самой важной конструкцией» в XPath), и существенная часть этой главы будет посвящена разъяснению путей расположения.

Чтобы выбрать узел или узлы из набора узлов или обработать их, вы можете воспользоваться следующими функциями XPath для работы с наборами узлов, которые впервые встретились нам в главе 4 (и которые мы более подробно рассмотрим в следующей главе):

• count(node-set). Эта функция возвращает количество узлов в наборе. Если опустить параметр «набор узлов», функция будет применена к контекстному узлу;

• id(string ID). Эта функция возвращает набор узлов из элемента, чей ID удовлетворяет строке, переданной функции в качестве параметра, или пустой набор узлов, если ни у какого элемента нет указанного ID. Можно указать несколько идентификаторов, разделенных символами- разделителями, — в таком случае функция вернет набор узлов из элементов с этими идентификаторами;

• last(). Возвращает номер последнего узла в наборе;

• local-name(node-set). Возвращает локальное имя первого узла в наборе. Если опустить параметр «набор узлов», функция будет применена к контекстному узлу;

• name(node-set). Возвращает полностью определенное имя первого узла в наборе. Если опустить параметр «набор узлов», функция будет применена к контекстному узлу;

• namespace-uri(node-set). Возвращает URI пространства имен первого узла в наборе. Если опустить параметр «набор узлов», функция будет применена к контекстному узлу;

• position(). Возвращает позицию контекстного узла в контекстном наборе узлов (начиная с 1).

В следующем примере (из главы 6) для подсчета количества узлов в наборе применяется функция count. В этом случае набор узлов состоит из всех элементов <PLANET> в planets.xml, и я получил его при помощи пути расположения «\PLANET» (который как путь расположения также является выражением XPath):

<xsl:stylesheet

xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>

 <xsl:output method='xml' indent='yes'/>

Вы читаете XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату