The square braces are called a predicate.
A predicate filters a node-set with respect to an axis to produce a new node-set. For each node in the node-set to be filtered, the PredicateExpr is evaluated with that node as the context node, with the number of nodes in the node-set as the context size, and with the proximity position of the node in the node-set with respect to the axis as the context position; if PredicateExpr evaluates to true for that node, the node is included in the new node-set; otherwise, it is not included.
A PredicateExpr is evaluated by evaluating the Expr and converting the result to a boolean. If the result is a number, the result will be converted to true
if the number is equal to the context position and will be converted to false
otherwise; if the result is not a number, then the result will be converted as if by a call to the boolean
function. Thus a location path para[3]
is equivalent to para[position()=3]
.
Inside of the predicate you test whether a condition is true or false as a means of filtering the set if items selected to the left of the predicate. Think of it like a SQL WHERE
clause.
You can choose to put multiple test criteria within a single predicate, or you can have multiple predicates. There may be some advantage from a tuning perspective or for clarity to choose to have multiple predicates vs using and
and multiple tests within a single predicate.