/person[position()=1]/profession[.="physicist"][position( )<3]
[position( )=1],
[.="physicist"], and [position(
)<3] are predicates. An XPath processor works from left
to right in an expression. After it has evaluated everything that
precedes the predicate, it's left with a context
node list that may contain no nodes, one node, or more than one node.
For most axes, including child, following-sibling, following, and
descendant, this list is in document order. For the ancestor,
preceding, and preceding-sibling axes, this list is in reverse
document order.
The predicate is evaluated against each node in the context node
list. If the expression returns true, then that node is retained in
the list. If the expression returns false, then the node is removed
from the list. If the expression returns a number, then the node
being evaluated is left in the list if and only if the number is the
same as the position of that node in the context node list. If the
expression returns a non-Boolean, non-number type, then that return
value is converted to a Boolean using the boolean(
) function, described later, to determine whether it
retains the node in the set.
 |  |  |
22.3. Location Paths |  | 22.5. XPath Functions |