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