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


Указание целевого пространства имен с помощью атрибута targetNamespace (SQLXML 4.0)

При написании схем XSD можно использовать атрибут XSD targetNamespace для указания целевого пространства имен. В этом разделе описывается, как работают атрибуты XSD targetNamespace, elementFormDefault и attributeFormDefault, как они влияют на созданный экземпляр XML и как запросы XPath задаются с помощью пространств имен.

Атрибут xsd:targetNamespace можно использовать для размещения элементов и атрибутов из пространства имен по умолчанию в другое пространство имен. Можно также указать, должны ли локально объявленные элементы и атрибуты схемы отображаться пространством имен либо явным образом, используя префикс или неявно по умолчанию. Атрибуты elementFormDefault и attributeFormDefault можно использовать в элементе <xsd:schema> , чтобы глобально указать квалификацию локальных элементов и атрибутов, или использовать атрибут формы для указания отдельных элементов и атрибутов отдельно.

Примеры

Чтобы создать рабочие образцы на основе следующих примеров, необходимо выполнить определенные требования. Дополнительные сведения см. в разделе "Требования к выполнению примеров SQLXML".

А. Указание целевого пространства имен

Следующая схема XSD указывает целевое пространство имен с помощью атрибута xsd:targetNamespace . Схема также задает значения атрибутов elementFormDefault и attributeFormDefault значение unqualified (значение по умолчанию для этих атрибутов). Это глобальное объявление и влияет на все локальные элементы (Порядок> в схеме) и атрибуты (<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> является локальным, так как его объявление отображается как дочерний элемент сложного< типа>, который определяет <элемент CustomerType>. Аналогичным образом атрибуты (CustomerID, OrderID и ContactName) являются локальными, а не глобальными.

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

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