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

Применимо к:SQL Server База данных SQL Azure

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

Атрибут можно использовать xsd:targetNamespace для размещения элементов и атрибутов из пространства имен по умолчанию в другое пространство имен. Можно указать, будут ли локально объявленные элементы и атрибуты схемы уточняться пространством имен, использоваться явно путем применения префикса либо использоваться неявно. Для глобального указания квалификации локальных элементов и атрибутов можно использовать elementFormDefault атрибуты <xsd:schema> и attributeFormDefault атрибуты для 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 являются глобальными и, следовательно, включаются в целевое пространство имен схемы. В результате, когда эти типы ссылаются в объявлении элемента и его <Order> дочернем <Customer> элементе, указывается префикс, связанный с целевым пространством имен.

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

Если схема указывает и attributeFormDefault атрибуты со значением"qualified", документ экземпляра elementFormDefault имеет все локальные элементы и атрибуты. Вы можете изменить предыдущую схему, чтобы включить эти атрибуты в <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>