Share via


Specifying Selection Predicates in the Location Path (SQLXML 4.0)

A predicate filters a node-set with respect to an axis (similar to a WHERE clause in a SELECT statement). The predicate is specified between brackets. For each node in the node-set to be filtered, the predicate expression is evaluated with that node as the context node, with the number of nodes in the node-set as context size. If the predicate expression evaluates to TRUE for that node, the node is included in the resulting node-set.

XPath also allows position-based filtering. A predicate expression evaluating to a number selects that ordinal node. For example, the location path Customer[3] returns the third customer. Such numeric predicates are not supported. Only predicate expressions that return a Boolean result are supported.

Note

For information about the limitations of this XPath implementation of XPath and the differences between it and the W3C specification, see Introduction to Using XPath Queries (SQLXML 4.0).

Selection Predicate: Example 1

The following XPath expression (location path) selects from the current context node all the <Customer> element children that have the CustomerID attribute with value of ALFKI:

/child::Customer[attribute::CustomerID="ALFKI"]  

In this XPath query, child and attribute are axis names. Customer is the node test (TRUE if Customer is an <element node>, because <element> is the principal node type for the child axis). attribute::CustomerID="ALFKI" is the predicate. In the predicate, attribute is the axis and CustomerID is the node test (TRUE if CustomerID is an attribute of the context node, because <attribute> is the principal node type of attribute axis).

Using the abbreviated syntax, the XPath query can also be specified as:

/Customer[@CustomerID="ALFKI"]  

Selection Predicate: Example 2

The following XPath expression (location path) selects from the current context node all the <Order> grandchildren that have the SalesOrderID attribute with the value 1:

/child::Customer/child::Order[attribute::SalesOrderID="1"]  

In this XPath expression, child and attribute are the axis names. Customer, Order, and SalesOrderID are the node tests. attribute::OrderID="1" is the predicate.

Using the abbreviated syntax, the XPath query can also be specified as:

/Customer/Order[@SalesOrderID="1"]  

Selection Predicate: Example 3

The following XPath expression (location path) selects from the current context node all the <Customer> children that have one or more <ContactName> children:

child::Customer[child::ContactName]  

This example assumes that the <ContactName> is a child element of the <Customer> element in the XML document, which is referred to as element-centric mapping in an annotated XSD schema.

In this XPath expression, child is the axis name. Customer is the node test (TRUE if Customer is an <element> node, because <element> is the principal node type for child axis). child::ContactName is the predicate. In the predicate, child is the axis and ContactName is the node test (TRUE if ContactName is an <element> node).

This expression returns only the <Customer> element children of the context node that have <ContactName> element children.

Using the abbreviated syntax, the XPath query can also be specified as:

Customer[ContactName]  

Selection Predicate: Example 4

The following XPath expression selects <Customer> element children of the context node that do not have <ContactName> element children:

child::Customer[not(child::ContactName)]  

This example assumes that <ContactName> is a child element of the <Customer> element in the XML document, and the ContactName field is not required in the database.

In this example, child is the axis. Customer is the node test (TRUE if Customer is an <element> node). not(child::ContactName) is the predicate. In the predicate, child is the axis and ContactName is the node test (TRUE if ContactName is an <element> node).

Using the abbreviated syntax, the XPath query can also be specified as:

Customer[not(ContactName)]  

Selection Predicate: Example 5

The following XPath expression selects from the current context node all the <Customer> children that have the CustomerID attribute:

child::Customer[attribute::CustomerID]  

In this example, child is the axis and Customer is node test (TRUE if Customer is an <element> node). attribute::CustomerID is the predicate. In the predicate, attribute is the axis and CustomerID is the predicate (TRUE if CustomerID is an <attribute> node).

Using the abbreviated syntax, the XPath query can also be specified as:

Customer[@CustomerID]  

Selection Predicate: Example 6

Microsoft SQLXML 4.0 includes support for XPath queries that contain a cross-product in the predicate, as shown in the following example:

Customer[Order/@OrderDate=Order/@ShipDate]  

This query selects all customers with any Order for which the OrderDate equals the ShipDate of any Order.

See Also

Introduction to Annotated XSD Schemas (SQLXML 4.0)
Client-side XML Formatting (SQLXML 4.0)