Указание предикатов выбора в пути доступа (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 является узлом <element>, так как <element> является основным типом узла для оси child). attribute::CustomerID="ALFKI" является предикатом. В предикате attribute является осью, а CustomerID — проверкой узла (значение TRUE, если CustomerID является атрибутом контекстного узла, так как <attribute> является основным типом узла оси attribute).
Запрос XPath также можно задать с использованием сокращенного синтаксиса:
/Customer[@CustomerID="ALFKI"]
Предикат выбора: Пример 2
Следующее выражение XPath (путь к расположению) выбирает из текущего контекстного узла все внучатые элементы <Order>, имеющие атрибут 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 является предикатом. В этом предикате child представляет ось, а ContactName — проверку узла (значение TRUE, если ContactName является узлом <element>).
Данное выражение возвращает только дочерний элемент <Customer> контекстного узла, имеющего дочерний элемент <ContactName>.
Запрос XPath также можно задать с использованием сокращенного синтаксиса:
Customer[ContactName]
Предикат выбора: Пример 4
Следующее выражение XPath выбирает дочерний элемент <Customer> контекстного узла, не имеющего дочерний элемент <ContactName>.
child::Customer[not(child::ContactName)]
Этот пример предполагает, что <ContactName> является дочерним элементом элемента <Customer> в XML-документе, и поле ContactName не требуется в базе данных.
В этом примере child является осью, а Customer — проверкой узла (значение TRUE, если Customer является узлом <element>). not(child::ContactName) является предикатом. В этом предикате child представляет ось, а ContactName — проверку узла (значение TRUE, если ContactName является узлом <element>).
Запрос XPath также можно задать с использованием сокращенного синтаксиса:
Customer[not(ContactName)]
Предикат выбора: Пример 5
Следующее выражение XPath выбирает из текущего контекстного узла все дочерние элементы <Customer>, имеющие атрибут CustomerID:
child::Customer[attribute::CustomerID]
В этом примере child является осью, а Customer — проверкой узла (значение TRUE, если Customer является узлом <element>). attribute::CustomerID является предикатом. В этом предикате attribute является осью, а CustomerID — предикатом (значение TRUE, если CustomerID является узлом <attribute>).
Запрос XPath также можно задать с использованием сокращенного синтаксиса:
Customer[@CustomerID]
Предикат выбора: Пример 6
Microsoft SQLXML 4.0 включает поддержку запросов XPath, которые содержат в предикате перекрестное произведение, как показано в следующем примере:
Customer[Order/@OrderDate=Order/@ShipDate]
Этот запрос выбирает всех клиентов с Order, для которых OrderDate равен ShipDateOrder.
Примечание