Укажите целевое пространство имен с помощью атрибута targetNamespace (SQLXML 4.0)
Область применения: SQL Server База данных SQL Azure
При написании схем XSD можно использовать атрибут XSD targetNamespace
для указания целевого пространства имен. В этой статье описывается, как работают XSD targetNamespace
elementFormDefault
и attributeFormDefault
атрибуты, как они влияют на созданный экземпляр XML и как запросы XPath указываются с помощью пространств имен.
Атрибут можно использовать xsd:targetNamespace
для размещения элементов и атрибутов из пространства имен по умолчанию в другое пространство имен. Можно указать, будут ли локально объявленные элементы и атрибуты схемы уточняться пространством имен, использоваться явно путем применения префикса либо использоваться неявно. Для глобального указания квалификации локальных элементов и атрибутов можно использовать elementFormDefault
атрибуты <xsd:schema>
и attributeFormDefault
атрибуты для form
указания отдельных элементов и атрибутов отдельно.
Примеры
Чтобы создать рабочие образцы на основе следующих примеров, необходимо выполнить определенные требования. Дополнительные сведения см. в разделе "Требования к выполнению примеров SQLXML".
А. Указание целевого пространства имен
Следующая схема XSD указывает целевое пространство имен с помощью атрибута xsd:targetNamespace
. Схема также задает elementFormDefault
значения и attributeFormDefault
значения "unqualified"
атрибутов (значение по умолчанию для этих атрибутов). Это глобальное объявление и влияет на все локальные элементы (<Order>
в схеме) и атрибуты (CustomerID
, ContactName
а также OrderID
в схеме).
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
xmlns:CO="urn:MyNamespace"
targetNamespace="urn:MyNamespace">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="CustOrders"
parent="Sales.Customer"
parent-key="CustomerID"
child="Sales.SalesOrderHeader"
child-key="CustomerID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Customer"
sql:relation="Sales.Customer"
type="CO:CustomerType" />
<xsd:complexType name="CustomerType">
<xsd:sequence>
<xsd:element name="Order"
sql:relation="Sales.SalesOrderHeader"
sql:relationship="CustOrders"
type="CO:OrderType" />
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="SalesPersonID" type="xsd:string" />
</xsd:complexType>
<xsd:complexType name="OrderType">
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:schema>
В схеме:
CustomerType
Объявления типовOrderType
являются глобальными и, следовательно, включаются в целевое пространство имен схемы. В результате, когда эти типы ссылаются в объявлении элемента и его<Order>
дочернем<Customer>
элементе, указывается префикс, связанный с целевым пространством имен.Элемент
<Customer>
также включается в целевое пространство имен схемы, так как это глобальный элемент схемы.
Выполните следующий XPath-запрос к схеме:
(/CO:Customer[@CustomerID=1)
Этот XPath-запрос создает следующий экземпляр документа (показаны только несколько заказов):
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<y0:Customer xmlns:y0="urn:MyNamespace"
CustomerID="ALFKI" ContactName="Maria Anders">
<Order CustomerID="ALFKI" OrderID="10643" />
<Order CustomerID="ALFKI" OrderID="10692" />
...
</y0:Customer>
</ROOT>
Этот документ экземпляра определяет пространство имен urn:MyNamespace и связывает с ним префикс (y0). Префикс применяется только к глобальному элементу <Customer>
. (Элемент является глобальным, так как он объявлен как дочерний <xsd:schema>
элемент в схеме.)
Префикс не применяется к локальным элементам и атрибутам, так как значение elementFormDefault
и attributeFormDefault
атрибуты заданы "unqualified"
в схеме. Элемент <Order>
является локальным, так как его объявление отображается как дочерний <complexType>
элемент элемента, который определяет <CustomerType>
элемент. Аналогичным образом атрибуты (CustomerID
, OrderID
и ContactName
) являются локальными, а не глобальными.
Создание рабочего примера этой схемы
Скопируйте предыдущий код схемы и вставьте его в текстовый файл. Сохраните файл как
targetNamespace.xml
.Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл, как
targetNameSpaceT.xml
в том же каталоге, где вы сохранилиtargetNamespace.xml
.<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="targetNamespace.xml" xmlns:CO="urn:MyNamespace"> /CO:Customer[@CustomerID=1] </sql:xpath-query> </ROOT>
Запрос XPath в шаблоне возвращает
<Customer>
элемент для клиента с идентификатором CustomerID 1. Запрос XPath задает префикс пространства имен для элемента в запросе, а не атрибута. (Локальные атрибуты не являются квалифицированными, как указано в схеме.)Путь к каталогу, указанный для схемы сопоставления (
targetNamespace.xml
) относительно каталога, в котором сохраняется шаблон. Можно также задать абсолютный путь, например:mapping-schema="C:\MyDir\targetNamespace.xml"
Создайте и запустите тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в разделе "Использование ADO для выполнения запросов SQLXML 4.0".
Если схема указывает и attributeFormDefault
атрибуты со значением"qualified"
, документ экземпляра elementFormDefault
имеет все локальные элементы и атрибуты. Вы можете изменить предыдущую схему, чтобы включить эти атрибуты в <xsd:schema>
элемент и снова выполнить шаблон. Так как атрибуты теперь также квалифицированы в экземпляре, запрос XPath изменяется, чтобы включить префикс пространства имен.
Измененный XPath-запрос:
/CO:Customer[@CO:CustomerID=1]
Возвращаемый XML-документ:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<y0:Customer xmlns:y0="urn:MyNamespace" CustomerID="1" SalesPersonID="280">
<Order SalesOrderID="43860" CustomerID="1" />
<Order SalesOrderID="44501" CustomerID="1" />
<Order SalesOrderID="45283" CustomerID="1" />
<Order SalesOrderID="46042" CustomerID="1" />
</y0:Customer>
</ROOT>