Указание предикатов выбора в пути доступа (SQLXML 4.0)
Предикат фильтрует набор узлов по отношению к оси (аналогично предложению WHERE в инструкции SELECT). Предикат указывается в квадратных скобках. Для каждого узла в фильтруемом наборе узлов выражение предиката вычисляется с этим узлом в качестве узла контекста, а количество узлов в наборе определяет размер контекста. Если для данного узла выражение предиката дает значение TRUE, то узел включается в результирующий набор узлов.
XPath также позволяет выполнять фильтрацию в зависимости от позиции. Выражение предиката, результатом оценки которого является число, выбирает этот исходный узел. Например, путь доступа Customer[3]
возвращает третьего клиента. Такие числовые предикаты не поддерживаются. Поддерживаются только предикаты, которые возвращают логический результат.
Примечание
Сведения об ограничениях этой реализации XPath и различиях между ней и спецификацией W3C см. в статье Общие сведения об использовании запросов XPath (SQLXML 4.0).
Предикат выбора: пример 1
Следующее выражение XPath (путь к расположению) выбирает из текущего узла контекста все дочерние <элементы Customer> , имеющие атрибут CustomerID со значением ALFKI:
/child::Customer[attribute::CustomerID="ALFKI"]
В этом запросе XPath child
и attribute
являются именами осей. Customer
— это проверка узла (значение TRUE, если Customer
является <узлом> элемента, так как <элемент> является типом основного узла для осиchild
). attribute::CustomerID="ALFKI"
является предикатом. В предикате — это ось, а CustomerID
— проверка узла (значение TRUE, attribute
если CustomerID является атрибутом узла контекста, так как <атрибут> является типом основного узла осиattribute
).
Запрос XPath также можно задать с использованием сокращенного синтаксиса:
/Customer[@CustomerID="ALFKI"]
Предикат выбора: пример 2
Следующее выражение XPath (путь к расположению) выбирает из текущего узла контекста все <элементы Order> grandchildren, имеющие атрибут SalesOrderID со значением 1:
/child::Customer/child::Order[attribute::SalesOrderID="1"]
В этом выражении XPath child
и attribute
являются именами осей. Customer
, Order
и SalesOrderID
являются проверками узла. attribute::OrderID="1"
является предикатом.
Запрос XPath также можно задать с использованием сокращенного синтаксиса:
/Customer/Order[@SalesOrderID="1"]
Предикат выбора: пример 3
Следующее выражение XPath (путь к расположению) выбирает из текущего узла контекста все дочерние <элементы Customer> , имеющие один или несколько дочерних <элементов ContactName> :
child::Customer[child::ContactName]
В этом примере предполагается, что <ContactName> является дочерним элементом <элемента Customer> в XML-документе, который называется элементно-ориентированным сопоставлением в схеме XSD с заметками.
В этом выражении XPath child
является именем оси. Customer
— это проверка узла (значение TRUE, если Customer
является <узлом элемента> , так как <элемент> является основным типом узла для child
оси). child::ContactName
является предикатом. В предикате — это ось, а ContactName
— проверка узла (TRUE, child
если 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)
является предикатом. В предикате — это ось, а — проверка узла (TRUE, child
если ContactName
является <узлом элемента>).ContactName
Запрос XPath также можно задать с использованием сокращенного синтаксиса:
Customer[not(ContactName)]
Предикат выбора: пример 5
Следующее выражение XPath выбирает из текущего узла контекста все дочерние <элементы Customer> с атрибутом CustomerID :
child::Customer[attribute::CustomerID]
В этом примере — это ось, а Customer
— проверка узла (TRUE, child
если 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)