Задание целевого пространства имен с помощью атрибута targetNamespace (SQLXML 4.0)
При написании схем XSD можно использовать XSD-атрибут targetNamespace для указания целевого пространства имен. В данном разделе описывается как работают XSD-атрибуты targetNamespace, elementFormDefault, и attributeFormDefault, как они влияют на создаваемые XML-экземпляры и как указываются XPath-запросы при помощи пространств имен.
Можно использовать атрибут xsd:targetNamespace для того, чтобы поместить элементы и атрибуты пространства имен по умолчанию в другое пространство имен. Можно указать будут ли локально объявленные элементы и атрибуты схемы уточняться пространством имен, либо использоваться явно путем применения префикса, либо использоваться неявно. Можно использовать атрибуты elementFormDefault и attributeFormDefault элемента <xsd:schema> для глобального указания уточнения локальных элементов и атрибутов, или использовать атрибут 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 являются глобальными, и поэтому включаются в целевое пространство имен схемы. В результате, когда декларации элемента <Customer> и его дочернего элемента <Order> ссылаются на эти типы, префикс показывает, что элемент связывается с целевым пространством имен.
Элемент <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.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл с именем targetNameSpace.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\targetNamepsace.xml"
Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в разделе Использование объектов ADO для выполнения запросов SQLXML.
Если в схеме атрибуты elementFormDefault и attributeFormDefault указаны со значением "qualified", тогда экземпляр все локальные элементы и атрибуты документа будут обработаны квалификатором. Можно изменить предыдущую схему так, чтобы она включала в себя атрибуты элемента <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>