Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При написании схем 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>