Spécification d'un espace de noms cible à l'aide de l'attribut targetNamespace (SQLXML 4.0)
Lors de l'écriture de schémas XSD, vous pouvez utiliser l'attribut XSD targetNamespace pour spécifier un espace de noms cible. Cette rubrique décrit le fonctionnement des attributs XSD targetNamespace, elementFormDefault et attributeFormDefault, de quelle manière ils affectent l'instance XML qui est générée et comment les requêtes XPath sont spécifiées avec des espaces de noms.
Vous pouvez utiliser l'attribut xsd:targetNamespace pour placer des éléments et des attributs de l'espace de noms par défaut dans un espace de noms différent. Vous pouvez également spécifier si les éléments et attributs du schéma déclarés localement doivent apparaître qualifiés par un espace de noms, soit explicitement en utilisant un préfixe, soit implicitement par défaut. Vous pouvez utiliser les attributs elementFormDefault et attributeFormDefault sur l'élément <xsd:schema> pour spécifier globalement la qualification des éléments et attributs locaux, ou vous pouvez utiliser l'attribut form pour spécifier séparément des éléments et attributs individuels.
Exemples
Pour créer des exemples fonctionnels à l'aide des exemples suivants, vous devez répondre à certaines conditions requises. Pour plus d'informations, consultez Configuration requise pour l'exécution des exemples SQLXML.
A.Specifying a target namespace
Le schéma XSD suivant spécifie un espace de noms cible à l'aide de l'attribut xsd:targetNamespace. Ce schéma définit également les valeurs des attributs elementFormDefault et attributeFormDefault sur "unqualified" (valeur par défaut de ces attributs). Il s'agit d'une déclaration globale qui affecte tous les éléments (<Order> dans schéma) et attributs (CustomerID, ContactName et OrderID dans le schéma) locaux.
<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>
Dans le schéma :
Les déclarations de type CustomerType et OrderType sont globales et sont par conséquent incluses dans l'espace de noms cible du schéma. Par conséquent, lorsque ces types sont référencés dans la déclaration de l'élément <Customer> et de son élément enfant <Order>, un préfixe est spécifié et associé à l'espace de noms cible.
L'élément <Customer> est également inclus dans l'espace de noms cible du schéma car il s'agit d'un élément global dans le schéma.
Exécutez la requête XPath suivante sur le schéma :
(/CO:Customer[@CustomerID=1)
La requête XPath génère ce document d'instance (seules quelques commandes sont affichées) :
<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>
Ce document d'instance définit l'espace de noms urn:MyNamespace et lui associe un préfixe (y0). Le préfixe est appliqué uniquement à l'élément global <Customer>. (L'élément est global car il est déclaré en tant qu'enfant de l'élément <xsd:schema> dans le schéma.)
Le préfixe n'est pas appliqué aux éléments et attributs locaux car la valeur des attributs elementFormDefault et attributeFormDefault est définie sur "unqualified" dans le schéma. Notez que l'élément <Order> est local car sa déclaration apparaît en tant qu'enfant de l'élément <complexType> qui définit l' élément <CustomerType>. De la même façon, les attributs (CustomerID, OrderID et ContactName) sont locaux, et non globaux.
Pour créer un exemple fonctionnel de ce schéma
Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom targetNameSpace.xml.
Copiez le modèle suivant et collez-le dans un fichier texte. Enregistrez ce fichier sous le nom targetNameSpaceT.xml dans le répertoire où vous avez enregistré le fichier 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>
La requête XPath dans le modèle retourne l'élément <Customer> pour le client ayant le CustomerID 1. Notez que la requête XPath spécifie le préfixe d'espace de noms pour l'élément dans la requête et pas pour l'attribut. (Les attributs locaux ne sont pas qualifiés, comme spécifié dans le schéma.)
Le chemin d'accès au répertoire spécifié pour le schéma de mappage (targetNameSpace.xml) est relatif au répertoire dans lequel le modèle est enregistré. Vous pouvez également spécifier un chemin d'accès absolu, par exemple :
mapping-schema="C:\MyDir\targetNamepsace.xml"
Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.
Pour plus d'informations, consultez Utilisation d'ADO pour exécuter des requêtes SQLXML.
Si le schéma spécifie des attributs elementFormDefault et attributeFormDefault avec la valeur "qualified", tous les éléments et attributs locaux de l'instance de document seront qualifiés. Vous pouvez modifier le schéma précédent de manière à inclure ces attributs dans l'élément <xsd:schema> et exécuter de nouveau le modèle. Dans la mesure où les attributs sont désormais également qualifiés dans l'instance, la requête XPath sera modifiée pour inclure le préfixe d'espace de noms.
La requête XPath modifiée est présentée ci-dessous :
/CO:Customer[@CO:CustomerID=1]
Le document XML renvoyé est présenté ci-dessous :
<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>