Читать онлайн книгу «XSLT».
| 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 существует четыре типа данных, а не только тип набора узлов, который должны возвращать образцы выбора:
• наборы узлов;
• логические значения;
• числа;
• строки.
ФРАГМЕНТЫ РЕЗУЛЬТИРУЮЩЕГО ДЕРЕВА
В XSLT 1.0 к типам данных XPath добавляются фрагменты результирующего дерева. Как говорилось в главе 4, фрагменты результирующего дерева представляют собой просто фрагменты дерева, которые можно присваивать переменным XSLT. Их поддержка была удалена из рабочего проекта XSLT 1.1, поэтому, скорее всего, они не будут включены в XSLT 2.0. Фрагменты результирующего дерева можно рассматривать как типы данных при помощи <xsl:variable>, что мы и увидим в главе 9.
В следующих разделах мы по очереди рассмотрим эти типы данных.
Как следует из имени, набор узлов (node set) является просто совокупностью узлов. Набор узлов может включать несколько узлов, единственный узел или быть пустым. Поскольку главная задача XPath — определять место разделов документов, постольку возвращающие наборы узлов выражения XPath являются наиболее популярными типами выражений. Например, выражение XPath
child::PLANET
возвращает набор узлов из всех элементов
<PLANET>
, дочерних для контекстного узла. Выражение
child::PLANET/child::NAME
возвращает набор узлов из всех элементов
<NAME>
, дочерних для элементов
<PLANET>
контекстного узла. Выражения XPath такого рода называются путями расположения, location path (W3C называет их «самой важной конструкцией» в XPath), и существенная часть этой главы будет посвящена разъяснению путей расположения.