Поделиться через


Указание предикатов выбора в пути расположения (SQLXML 4.0)

Предикат фильтрует набор узлов относительно оси (аналогично предложению WHERE в инструкции SELECT). Предикат указывается между скобками. Для каждого узла в фильтруемом наборе узлов выражение предиката вычисляется с этим узлом как узлом контекста с числом узлов в наборе узлов в виде размера контекста. Если выражение предиката оценивается как TRUE для этого узла, узел включается в результирующий набор узлов.

XPath также позволяет фильтровать на основе позиций. Выражение предиката, которое оценивается на число, выбирает этот порядковый узел. Например, путь Customer[3] к расположению возвращает третьего клиента. Такие числовые предикаты не поддерживаются. Поддерживаются только выражения предиката, возвращающие логический результат.

Замечание

Сведения об ограничениях этой реализации XPath xPath и различиях между ней и спецификацией W3C см. в разделе "Общие сведения об использовании запросов XPath" (SQLXML 4.0).

Предикат выбора: пример 1

Следующее выражение XPath (путь к расположению) выбирает из текущего узла контекста все <дочерние элементы Customer> , имеющие атрибут CustomerID со значением ALFKI:

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

В этом запросе child XPath и attribute являются именами осей. Customer— это тест узла (TRUE, если Customer является <узлом> элемента, так как <элемент> является основным типом узла для child оси). attribute::CustomerID="ALFKI" — предикат. В предикате является осью и CustomerID является тестом узла (TRUE, attribute если CustomerID является атрибутом узла контекста, так как <атрибут> является основным типом узла осиattribute).

Используя сокращенный синтаксис, можно также указать запрос XPath следующим образом:

/Customer[@CustomerID="ALFKI"]  

Предикат выбора: пример 2

Следующее выражение XPath (путь к расположению) выбирает из текущего узла контекста все <внуки заказа> , имеющие атрибут SalesOrderID со значением 1:

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

В этом выражении child XPath и attribute являются именами осей. Customer, Orderи SalesOrderID являются тестами узла. attribute::OrderID="1" — предикат.

Используя сокращенный синтаксис, можно также указать запрос XPath следующим образом:

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

Предикат выбора: пример 3

Следующее выражение XPath (путь к расположению) выбирает из текущего узла контекста все <дочерние элементы Customer> , имеющие один или несколько дочерних <элементов ContactName> :

child::Customer[child::ContactName]  

В этом примере предполагается, что <ContactName> является дочерним элементом <элемента Customer> в XML-документе , который называется сопоставлением с элементом в аннотированной схеме XSD.

В этом выражении child XPath — это имя оси. Customer — это тест узла (TRUE, если Customer является <узлом элемента> , так как <элемент> является основным типом узла для child оси). child::ContactName — предикат. В предикате child находится ось и ContactName является тестом узла (TRUE, если ContactName является <узлом элемента> ).

Это выражение возвращает только дочерние <элементы Customer> узла контекста с <дочерними элементами ContactName> .

Используя сокращенный синтаксис, можно также указать запрос XPath следующим образом:

Customer[ContactName]  

Предикат выбора: пример 4

Следующее выражение XPath выбирает <дочерние элементы Customer> узла контекста, у которых нет <дочерних элементов ContactName> :

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

В этом примере предполагается, что <ContactName> является дочерним элементом <элемента Customer> в XML-документе, а поле ContactName не требуется в базе данных.

В этом примере child — ось. Customer — это тест узла (TRUE, если Customer является <узлом элемента> ). not(child::ContactName) — предикат. В предикате child находится ось и ContactName является тестом узла (TRUE, если ContactName является <узлом элемента> ).

Используя сокращенный синтаксис, можно также указать запрос XPath следующим образом:

Customer[not(ContactName)]  

Предикат выбора: пример 5

Следующее выражение XPath выбирает из текущего узла контекста все <дочерние элементы Customer> , имеющие атрибут CustomerID :

child::Customer[attribute::CustomerID]  

В этом примере используется ось и тест узла (TRUE, child если Customer является <узлом элемента>).Customer attribute::CustomerID — предикат. В предикате является осью и CustomerID является предикатом (TRUE, attribute если CustomerID является <узлом атрибута>).

Используя сокращенный синтаксис, можно также указать запрос XPath следующим образом:

Customer[@CustomerID]  

Предикат выбора: пример 6

Microsoft SQLXML 4.0 включает поддержку запросов XPath, содержащих кросс-продукт в предикате, как показано в следующем примере:

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

Этот запрос выбирает всех клиентов с любым Order , для которого OrderDate равны ShipDate любой из Orderних.

См. также

Общие сведения о аннотированных схемах XSD (SQLXML 4.0)
Форматирование XML на стороне клиента (SQLXML 4.0)