Указание осей в запросах XPath (SQLXML 4.0)
В следующих примерах показано, как задаются оси в запросах XPath.
В данных примерах запросы XPath определены в соответствии со схемой сопоставления, которая содержится в файле SampleSchema1.xml. Сведения об этом образце схемы см. в разделе Образец схемы XSD с заметками для примеров XPath (SQLXML 4.0).
Примеры
A. Получение дочерних элементов контекстного узла
В следующем запросе XPath происходит выборка всех дочерних элементов <Person> контекстного узла:
/child::Person
В запросе child является осью, а Contact представляет собой проверку узла (значение TRUE, если Person является узлом <element>, поскольку <element> — это тип основного узла, связанный с осью child).
Ось child является осью по умолчанию. Поэтому указанный запрос может быть записан следующим образом:
/Person
Проверка запроса XPath к схеме сопоставления
Скопируйте образец кода схемы и вставьте его в текстовый файл. Сохраните файл с именем SampleSchema1.xml.
Создайте следующий шаблон (XPathAxesSampleA.xml) и сохраните его в том же каталоге, в котором был сохранен файл SampleSchema1.xml.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="SampleSchema1.xml"> /Person </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">
<Person BusinessEntityID="1" LastName="Achong" FirstName="Gustavo" Title="Mr." />
<Person BusinessEntityID="2" LastName="Abel" FirstName="Catherine" Title="Ms." />
<Person BusinessEntityID="3" LastName="Abercrombie" FirstName="Kim" Title="Ms." />
<Person BusinessEntityID="4" LastName="Acevedo" FirstName="Humberto" Title="Sr." />
...
</ROOT>
Б. Получение внучатых элементов контекстного узла
В следующем запросе XPath происходит выборка всех элементов <Order>, дочерних по отношению к дочерним элементам <Customer> контекстного узла:
/child::Customer/child::Order
В запросе child является осью, а Customer и Order представляют собой проверки узлов (значение TRUE, если Customer и Order имеют тип <element>, поскольку узел <element> является основным узлом для оси child). Для каждого узла, совпадающего с <Customer>, к результату добавляются узлы, соответствующие <Orders>. В результирующем наборе возвращается только <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="2005-08-01T00:00:00"
DueDate="2005-08-13T00:00:00"
ShipDate="2005-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, то из каждого узла, совпадающего с <Customer>, он переходит к элементам <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.
Примечание |
---|
Запрос XPath /Order[../@CustomerID="1"] возвращает ошибку, поскольку отсутствует родитель элемента <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="2005-08-01T00:00:00"
DueDate="2005-08-13T00:00:00"
ShipDate="2005-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).
Можно задать сокращенное обозначение оси 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="2005-08-01T00:00:00"
DueDate="2005-08-13T00:00:00"
ShipDate="2005-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>