XPath 1.0 Formal Grammar and Reference
(based on W3 Specs)

[1] LocationPath ::= RelativeLocationPath | AbsoluteLocationPath
[2] AbsoluteLocationPath ::= '/' RelativeLocationPath?
                             | AbbreviatedAbsoluteLocationPath
[3] RelativeLocationPath ::= Step | RelativeLocationPath '/' Step
                             | AbbreviatedRelativeLocationPath
[4] Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep
[5] AxisSpecifier ::= AxisName '::' | AbbreviatedAxisSpecifier
[6] AxisName ::=
		'ancestor' |
		'ancestor-or-self' |
		'attribute' |
		'child' |
		'descendant' |
		'descendant-or-self' |
		'following' |
		'following-sibling' |
		'namespace' |
		'parent' |
		'preceding' |
		'preceding-sibling' |
		'self'
[7] NodeTest ::= NameTest | NodeType '(' ')'
                | 'processing-instruction' '(' Literal ')'
[8] Predicate ::= '[' PredicateExpr ']'
[9] PredicateExpr ::= Expr
[10] AbbreviatedAbsoluteLocationPath ::= '//' RelativeLocationPath
[11] AbbreviatedRelativeLocationPath ::= RelativeLocationPath '//' Step
[12] AbbreviatedStep ::= '.' | '..'
[13] AbbreviatedAxisSpecifier ::= '@'?
[14] Expr ::= OrExpr
[15] PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal
                     | Number | FunctionCall
[16] FunctionCall ::= FunctionName '(' ( Argument ( ',' Argument )* )? ')'
[17] Argument ::= Expr
[18] UnionExpr ::= PathExpr | UnionExpr '|' PathExpr
[19] PathExpr ::= LocationPath | FilterExpr
                | FilterExpr '/' RelativeLocationPath
                | FilterExpr '//' RelativeLocationPath
[20] FilterExpr ::= PrimaryExpr | FilterExpr Predicate
[21] OrExpr ::= AndExpr | OrExpr 'or' AndExpr
[22] AndExpr ::= EqualityExpr | AndExpr 'and' EqualityExpr
[23] EqualityExpr ::= RelationalExpr | EqualityExpr '=' RelationalExpr
                    | EqualityExpr '!=' RelationalExpr
[24] RelationalExpr ::= AdditiveExpr
                      | RelationalExpr '<' AdditiveExpr
                      | RelationalExpr '>' AdditiveExpr
                      | RelationalExpr '<=' AdditiveExpr
                      | RelationalExpr '>=' AdditiveExpr
[25] AdditiveExpr ::= MultiplicativeExpr
                    | AdditiveExpr '+' MultiplicativeExpr
                    | AdditiveExpr '-' MultiplicativeExpr
[26] MultiplicativeExpr ::= UnaryExpr
                    | MultiplicativeExpr MultiplyOperator UnaryExpr
                    | MultiplicativeExpr 'div' UnaryExpr
                    | MultiplicativeExpr 'mod' UnaryExpr
[27] UnaryExpr ::= UnionExpr | '-' UnaryExpr
[28] ExprToken ::= '(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::'
                    | NameTest | NodeType | Operator | FunctionName
                    | AxisName | Literal | Number | VariableReference
[29] Literal ::= '"' [^"]* '"' | "'" [^']* "'"
[30] Number ::= Digits ('.' Digits?)? | '.' Digits
[31] Digits ::= [0-9]+
[32] Operator ::= OperatorName | MultiplyOperator | '/' | '//' | '|'
            | '+' | '-' | '=' | '!=' | '<' | '<=' | '>' | '>='
[33] OperatorName ::= 'and' | 'or' | 'mod' | 'div'
[34] MultiplyOperator ::= '*'
[35] FunctionName ::= QName - NodeType
[36] VariableReference ::= '$' QName
[37] NameTest ::= '*' | NCName ':' '*' | QName
[38] NodeType ::= 'comment' | 'text' | 'processing-instruction' | 'node'
[39] ExprWhitespace ::= S

QName, NCName and S are defined in XML 1.0 Grammar.

XPath Core Function Library

Node Set Functions

number last() string local-name(node-set?)
number position() string namespace-uri(node-set?)
number count(node-set) string name(node-set?)
node-set id(object)  

String Functions

string string(object?) string substring-after(string, string)
string concat(string, string, string*) string substring(string, number, number?)
boolean starts-with(string, string) number string-length(string?)
boolean contains(string, string) string normalize-space(string?)
string substring-before(string, string) string translate(string, string, string)

Boolean Functions

boolean boolean(object) boolean true()
boolean not(boolean) boolean false()
boolean lang(string)  

Number Functions

number number(object?) number ceiling(number)
number sum(node-set) number round(number)
number floor(number)  

Axes

child  parent  following-sibling following 
descendant  ancestor  preceding-sibling preceding 
attribute  namespace  self  descendant-or-self

Abbreviations

@ attribute:: default child:: (can be omitted)
. self::node()  // /descendant-or-self::node()/
..  parent::node()