Указание осей в запросах XPath (SQLXML 4.0)
В следующих примерах показано, как задаются оси в запросах XPath.
В данных примерах запросы XPath определены в соответствии со схемой сопоставления, которая содержится в файле SampleSchema1.xml. Сведения об этом примере схемы см. в разделе Пример схемы XSD с заметками для примеров XPath (SQLXML 4.0).
Примеры
A. Получение дочерних элементов контекстного узла
Следующий запрос XPath выбирает все дочерние <элементы Contact> узла контекста:
/child::Contact
В запросе — это ось и Contact
тест узла (true, child
если Contact
является <узлом элемента>, так как <элемент> является основным типом узла, связанным с осьюchild
).
Ось child
является осью по умолчанию. Поэтому указанный запрос может быть записан следующим образом:
/Contact
Проверка запроса XPath к схеме сопоставления
Скопируйте пример кода схемы и вставьте его в текстовый файл. Сохраните файл с именем SampleSchema1.xml.
Создайте следующий шаблон (XPathAxesSampleA.xml) и сохраните его в том же каталоге, в котором был сохранен файл SampleSchema1.xml.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="SampleSchema1.xml"> /Contact </sql:xpath-query> </ROOT>
Путь к каталогу схемы сопоставления (файл SampleSchema1.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:
mapping-schema="C:\MyDir\SampleSchema1.xml"
Создайте и запустите тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в статье Использование ADO для выполнения запросов SQLXML 4.0.
Далее приведен частичный результирующий набор, полученный в результате выполнения этого шаблона.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Contact ContactID="1" LastName="Achong" FirstName="Gustavo" Title="Mr." />
<Contact ContactID="2" LastName="Abel" FirstName="Catherine" Title="Ms." />
<Contact ContactID="3" LastName="Abercrombie" FirstName="Kim" Title="Ms." />
<Contact ContactID="4" LastName="Acevedo" FirstName="Humberto" Title="Sr." />
...
</ROOT>
Б. Получение внучатых элементов контекстного узла
Следующий запрос XPath выбирает все дочерние <элементы Order> дочерних <элементов элемента Customer> узла контекста:
/child::Customer/child::Order
В запросе — это ось, а Customer
и Order
— тесты узла (эти тесты узла имеют значение TRUE, child
если Customer и Order являются <узлами элементов>, так как <узел элемента> является основным узлом для child
оси). Для каждого узла, соответствующего <Customer>, к результату добавляются узлы, соответствующие <Заказы> . В результирующем наборе возвращается только <order> .
Ось child
является осью по умолчанию. Поэтому запрос можно определить следующим образом.
/Customer/Order
Проверка запроса XPath к схеме сопоставления
Скопируйте пример кода схемы и вставьте его в текстовый файл. Сохраните файл с именем SampleSchema1.xml.
Создайте следующий шаблон (XPathAxesSampleB.xml) и сохраните его в том же каталоге, в котором представлено:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="SampleSchema1.xml"> /Customer/Order </sql:xpath-query> </ROOT>
Путь к каталогу схемы сопоставления (файл SampleSchema1.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:
mapping-schema="C:\MyDir\SampleSchema1.xml"
Создайте и запустите тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в статье Использование ADO для выполнения запросов SQLXML 4.0.
Далее приведен частичный результирующий набор, полученный в результате выполнения этого шаблона.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order SalesOrderID="Ord-43860" SalesPersonID="280"
OrderDate="2001-08-01T00:00:00"
DueDate="2001-08-13T00:00:00"
ShipDate="2001-08-08T00:00:00">
<OrderDetail ProductID="Prod-729" UnitPrice="226.8571"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-732" UnitPrice="440.1742"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-738" UnitPrice="220.2496"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-753" UnitPrice="2576.3544"
OrderQty="2" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-756" UnitPrice="1049.7528"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-758" UnitPrice="1049.7528"
OrderQty="2" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-761" UnitPrice="503.3507"
OrderQty="2" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-762" UnitPrice="503.3507"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-763" UnitPrice="503.3507"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-765" UnitPrice="503.3507"
OrderQty="2" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-768" UnitPrice="503.3507"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-770" UnitPrice="503.3507"
OrderQty="1" UnitPriceDiscount="0" />
</Order>
...
</ROOT>
Если запрос XPath указан как Customer/Order/OrderDetail
, с каждого узла, соответствующего <Клиенту> , запрос переходит к своим <элементам Order> . И для каждого узла, соответствующего <Order>, запрос добавляет узлы <OrderDetail> в результат. В результирующем наборе возвращается только <OrderDetail> .
В. Использование символов . для указания родительской оси
Следующий запрос извлекает все <элементы Order> с родительским <элементом Customer> со значением атрибута CustomerID 1. Запрос использует child
ось в предикате для поиска родительского <элемента Order> .
/child::Customer/child::Order[../@CustomerID="1"]
Ось child
является осью по умолчанию. Поэтому запрос можно определить следующим образом.
/Customer/Order[../@CustomerID="1"]
Этот запрос XPath эквивалентен следующему:
/Customer[@CustomerID="1"]/Order.
Примечание
Запрос /Order[../@CustomerID="1"]
XPath вернет ошибку, так как для Order> нет родительского< элемента. Хотя в схеме сопоставления могут быть элементы, содержащие <Order>, XPath не начинается ни с одного из них. Следовательно, <Order> считается типом элементов верхнего уровня в документе.
Проверка запроса XPath к схеме сопоставления
Скопируйте пример кода схемы и вставьте его в текстовый файл. Сохраните файл с именем SampleSchema1.xml.
Создайте следующий шаблон (XPathAxesSampleC.xml) и сохраните его в том же каталоге, в котором представлено:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="SampleSchema1.xml"> /Customer/Order[../@CustomerID="1"] </sql:xpath-query> </ROOT>
Путь к каталогу схемы сопоставления (файл SampleSchema1.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:
mapping-schema="C:\MyDir\SampleSchema1.xml"
Создайте и запустите тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в статье Использование ADO для выполнения запросов SQLXML 4.0.
Далее приведен частичный результирующий набор, полученный в результате выполнения этого шаблона.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order SalesOrderID="Ord-43860" SalesPersonID="280"
OrderDate="2001-08-01T00:00:00"
DueDate="2001-08-13T00:00:00"
ShipDate="2001-08-08T00:00:00">
<OrderDetail ProductID="Prod-729" UnitPrice="226.8571"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-732" UnitPrice="440.1742"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-738" UnitPrice="220.2496"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-753" UnitPrice="2576.3544"
OrderQty="2" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-756" UnitPrice="1049.7528"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-758" UnitPrice="1049.7528"
OrderQty="2" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-761" UnitPrice="503.3507"
OrderQty="2" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-762" UnitPrice="503.3507"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-763" UnitPrice="503.3507"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-765" UnitPrice="503.3507"
OrderQty="2" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-768" UnitPrice="503.3507"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-770" UnitPrice="503.3507"
OrderQty="1" UnitPriceDiscount="0" />
</Order>
...
</Order>
</ROOT>
Г. Указание оси атрибутов
Следующий запрос XPath выбирает все дочерние <элементы Customer> узла контекста со значением атрибута CustomerID 1:
/child::Customer[attribute::CustomerID="1"]
В предикате attribute::CustomerID
— это ось, attribute
а CustomerID
тест узла (если CustomerID
является атрибутом, тест узла имеет значение TRUE, так как <узел атрибута> является основным узлом для оси attribute
).
Можно задать сокращенное обозначение оси attribute
(@), а поскольку ось child
является осью по умолчанию, в запросе ее можно опустить.
/Customer[@CustomerID="1"]
Проверка запроса XPath к схеме сопоставления
Скопируйте пример кода схемы и вставьте его в текстовый файл. Сохраните файл с именем SampleSchema1.xml.
Создайте следующий шаблон (XPathAxesSampleD.xml) и сохраните его в том же каталоге, в котором был сохранен файл SampleSchema1.xml.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="SampleSchema1.xml"> child::Customer[attribute::CustomerID="1"] </sql:xpath-query> </ROOT>
Путь к каталогу схемы сопоставления (файл SampleSchema1.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:
mapping-schema="C:\MyDir\SampleSchema1.xml"
Создайте и запустите тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в статье Использование ADO для выполнения запросов SQLXML 4.0.
Далее приведен частичный результирующий набор, полученный в результате выполнения этого шаблона.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Customer CustomerID="1" SalesPersonID="280"
TerritoryID="1" AccountNumber="1"
CustomerType="S" Orders="Ord-43860 Ord-44501 Ord-45283 Ord-46042">
<Order SalesOrderID="Ord-43860" SalesPersonID="280"
OrderDate="2001-08-01T00:00:00"
DueDate="2001-08-13T00:00:00"
ShipDate="2001-08-08T00:00:00">
<OrderDetail ProductID="Prod-729" UnitPrice="226.8571"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-732" UnitPrice="440.1742"
OrderQty="1" UnitPriceDiscount="0" />
<OrderDetail ProductID="Prod-738" UnitPrice="220.2496"
OrderQty="1" UnitPriceDiscount="0" />
...
</Order>
...
</Customer>
</ROOT>