Указание предикатов выбора в пути доступа (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 является узлом <element>, поскольку <element> является основным типом узла для оси 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 является узлом <атрибут>).
Запрос XPath также можно задать с использованием сокращенного синтаксиса:
Customer[@CustomerID]
Предикат выбора. Пример 6
Microsoft SQLXML 4.0 включает поддержку запросов XPath, которые содержат в предикате перекрестное произведение, как показано в следующем примере:
Customer[Order/@OrderDate=Order/@ShipDate]
Этот запрос выбирает всех клиентов с элементом Order, для которого OrderDate равен ShipDate Order.