Поделиться через


Задание целевого пространства имен с помощью атрибута 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) являются локальными, а не глобальными.

Создание рабочего образца этой схемы

  1. Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл с именем targetNameSpace.xml.

  2. Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл с именем 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"
    
  3. Создайте и запустите тестовый сценарий 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>