Freigeben über


Angeben eines Zielnamespaces mit dem 'targetNamespace'-Attribut (SQLXML 4.0)

Beim Schreiben von XSD-Schemas können Sie das XSD targetNamespace-Attribut verwenden, um einen Zielnamespace anzugeben. In diesem Thema wird die Funktionsweise von den XSD-Attributen targetNamespace, elementFormDefault und attributeFormDefault beschrieben, inwieweit sie sich auf die XML-Instanz, die erstellt wird, auswirken und wie XPath-Abfragen mit Namespaces festgelegt werden.

Mit dem xsd:targetNamespace-Attribut können Sie Elemente und Attribute aus dem Standardnamespace in einen anderen Namespace platzieren. Sie können auch festlegen, ob lokal deklarierte Elemente und Attribute des Schemas durch einen Namespace qualifiziert werden sollen, sei es explizit durch ein Präfix oder standardmäßig implizit. Sie können das elementFormDefault-Attribut und das attributeFormDefault-Attribut für das <xsd:schema>-Element verwenden, um die Qualifikation von lokalen Elementen und Attributen global anzugeben, oder mit dem form-Attribut einzelne Elemente und Attribute getrennt angeben.

Beispiele

Es müssen bestimmte Anforderungen erfüllt sein, damit aus den folgenden Beispielen funktionierende Beispiele erstellt werden können. Weitere Informationen finden Sie unter Anforderungen zum Ausführen von SQLXML-Beispielen.

A.Angeben eines Zielnamespaces

Das folgende XSD-Schema gibt mit dem xsd:targetNamespace-Attribut einen Zielnamespace an. Das Schema setzt auch die Werte der Attribute elementFormDefault und attributeFormDefault auf "unqualified" (Standardwert für diese Attribute). Dies ist eine globale Deklaration, die alle lokalen Elemente (<Order> im Schema) und Attribute beeinflusst (CustomerID, ContactName und OrderID im Schema).

<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>

Im Schema:

  • Die Typdeklarationen CustomerType und OrderType sind global und somit im Zielnamespace des Schemas enthalten. Infolgedessen wird bei einem Verweis auf diese Typen in der Deklaration des <Customer>-Elements und des untergeordneten <Order>-Elements ein Präfix angegeben, das dem Zielnamespace zugeordnet ist.

  • Das <Customer>-Element ist ebenfalls im Zielnamespace des Schemas enthalten, da es ein globales Element im Schema darstellt.

Führen Sie die folgende XPath-Abfrage für das Schema aus:

(/CO:Customer[@CustomerID=1) 

Die XPath-Abfrage generiert dieses Instanzdokument (nur einige der Bestellungen werden angezeigt):

<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>

Dieses Instanzdokument definiert den urn:MyNamespace-Namespace und ordnet ihm ein Präfix (y0) zu. Das Präfix wird nur auf das globale <Customer>-Element angewendet. (Das Element ist global, da es als untergeordnetes Element des <xsd:schema>-Elements im Schema deklariert wurde.)

Das Präfix wird nicht auf die lokalen Elemente und Attribute angewendet, da der Wert der Attribute elementFormDefault und attributeFormDefault im Schema auf "unqualified" gesetzt ist. Beachten Sie, dass das <Order>-Element lokal ist, da seine Deklaration als ein untergeordnetes Element des <complexType>-Elements angegeben ist, das das <CustomerType>-Element definiert. Auf ähnliche Weise sind die Attribute (CustomerID, OrderID und ContactName) lokal und nicht global.

So erstellen Sie ein funktionstüchtiges Beispiel für dieses Schema

  1. Kopieren Sie den oben stehenden Schemacode, und fügen Sie ihn in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen targetNameSpace.xml.

  2. Kopieren Sie die folgende Vorlage, und fügen Sie sie in eine Textdatei ein. Speichern Sie die Datei unter dem Namen targetNameSpaceT.xml im gleichen Verzeichnis, in dem Sie targetNameSpace.xml gespeichert haben.

    <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>
    

    Die XPath-Abfrage in der Vorlage gibt das <Customer>-Element für den Kunden mit der CustomerID 1 zurück. Beachten Sie, dass die XPath-Abfrage das Namespace-Präfix für das Element, nicht für das Attribut, in der Abfrage festlegt. (Lokale Attribute sind nicht qualifiziert, wie im Schema angegeben.)

    Der für das Zuordnungsschema (targetNameSpace.xml) angegebene Verzeichnispfad bezieht sich auf das Verzeichnis, in dem die Vorlage gespeichert ist. Es kann auch ein absoluter Pfad angegeben werden. Beispiel:

    mapping-schema="C:\MyDir\targetNamepsace.xml"
    
  3. Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um die Vorlage auszuführen.

    Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML-Abfragen.

Wenn mit dem Schema die Attribute elementFormDefault und attributeFormDefault auf den Wert "qualified" festgelegt werden, umfasst das Instanzdokument alle qualifizierten lokalen Elemente und Attribute. Sie können das vorherige Schema so ändern, dass diese Attribute im <xsd:schema>-Element enthalten sind, und die Vorlage erneut ausführen. Da die Attribute nun auch in der Instanz qualifiziert sind, ändert sich die XPath-Abfrage so, dass auch das Namespace-Präfix enthalten ist.

Dies ist die geänderte XPath-Abfrage:

/CO:Customer[@CO:CustomerID=1]

Dies ist das zurückgegebene XML-Dokument:

<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>