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 die Attribute elementFormDefault und attributeFormDefault auf dem <xsd:schema>-Element verwenden, um die Qualifizierung der lokalen Elemente und Attribute global festzulegen, oder Sie können das form-Attribut verwenden, um einzelne Elemente und Attribute separat festzulegen.
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 Zielnamespace.
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). Dabei handelt es sich um eine globale Deklaration, die sich auf alle lokalen Elemente (<Order> im Schema) und Attribute (CustomerID, ContactName und OrderID im Schema) auswirkt.
<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. Somit wird ein Präfix festgelegt, das diesem Zielnamespace zugeordnet ist, wenn in der Deklaration des <Customer>-Elements und seiner untergeordneten <Order>-Elemente auf diese Typen verwiesen wird.
Das <Customer>-Element befindet sich auch im Zielnamespace des Schemas, da es sich um ein globales Element im Schema handelt.
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 gilt nur für das globale <Customer>-Element. (Das Element ist global, da es als untergeordnetes Element des <xsd:schema>-Elements im Schema deklariert wird.)
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 dessen Deklaration als untergeordnetes Element des <complexType>-Elements angezeigt wird, das wiederum 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
Kopieren Sie den oben stehenden Schemacode, und fügen Sie ihn in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen targetNameSpace.xml.
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 zurück, dessen CustomerID-Wert 1 ist. 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"
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 dann 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>