Compartilhar via


Especificando um namespace de destino usando o atributo targetNamespace (SQLXML 4.0)

Ao escrever esquemas XSD, você pode usar o atributo targetNamespace XSD para especificar um namespace de destino. Este tópico descreve como os atributos targetNamespace, elementFormDefault e attributeFormDefault do XSD funcionam, como eles afetam a instância XML gerada e como as consultas XPath são especificadas com namespaces.

Você pode usar o atributo xsd:targetNamespace para colocar elementos e atributos do namespace padrão em um namespace diferente. Você também pode especificar se os elementos e atributos do esquema declarados localmente devem aparecer qualificados por um namespace, seja explicitamente, usando um prefixo, ou implicitamente, por padrão. Você pode usar os atributos elementFormDefault e attributeFormDefault no <elemento xsd:schema> para especificar globalmente a qualificação de elementos e atributos locais ou usar o atributo form para especificar elementos e atributos individuais separadamente.

Exemplos

Para criar exemplos de funcionamento usando os exemplos a seguir, é necessário atender a determinados requisitos. Para obter mais informações, consulte Requisitos para executar exemplos de SQLXML.

a. Especificando um namespace de destino

O esquema XSD a seguir especifica um namespace de destino usando o atributo xsd:targetNamespace . O esquema também define os valores de atributo elementFormDefault e attributeFormDefault como "não qualificados" (o valor padrão para esses atributos). Essa é uma declaração global e afeta todos os elementos locais (<Order> no esquema) e atributos (CustomerID, ContactName e OrderID no esquema).

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

No esquema:

  • As declarações de tipo CustomerType e OrderType são globais e, portanto, estão incluídas no namespace de destino do esquema. Como resultado, quando esses tipos são referenciados na declaração do <elemento Customer> e seu <elemento filho Order> , um prefixo é especificado associado ao namespace de destino.

  • O <elemento Customer> também está incluído no namespace de destino do esquema porque é um elemento global no esquema.

Execute a consulta XPath a seguir no esquema:

(/CO:Customer[@CustomerID=1)   

A consulta de XPath gera este documento da instância (somente alguns pedidos são mostrados):

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

Este documento de instância define o namespace urn:MyNamespace e associa um prefixo (y0) a ele. O prefixo é aplicado somente ao <elemento global Customer> . (O elemento é global porque é declarado como um filho do <elemento xsd:schema> no esquema.)

O prefixo não é aplicado aos elementos e atributos locais porque o valor dos atributos elementFormDefault e attributeFormDefault é definido como "não qualificado" no esquema. Observe que o <elemento Order> é local porque sua declaração aparece como um filho do <elemento complexType> que define o <elemento CustomerType> . Da mesma forma, os atributos (CustomerID, OrderID e ContactName) são locais, não globais.

Para criar um exemplo de funcionamento deste esquema
  1. Copie o código de esquema acima e cole-o em um arquivo de texto. Salve o arquivo como target.NameSpace.xml.

  2. Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como target.NameSpaceT.xml no mesmo diretório em que você salvou 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>  
    

    A consulta XPath no modelo retorna o <elemento Customer> para o cliente com uma CustomerID de 1. Observe que a consulta XPath especifica o prefixo de namespace para o elemento na consulta e não para o atributo. (Não são qualificados atributos locais, como especificado no esquema.)

    O caminho de diretório especificado para o esquema de mapeamento (targetNamespace.xml) é relativo ao diretório onde o modelo está salvo. Também é possível especificar um caminho absoluto, por exemplo:

    mapping-schema="C:\MyDir\targetNamepsace.xml"  
    
  3. Crie e use o script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o modelo.

    Para obter mais informações, consulte Usando o ADO para executar consultas SQLXML.

Se o esquema especificar atributos elementFormDefault e attributeFormDefault com valor "qualificado", o documento de instância terá todos os elementos e atributos locais qualificados. Você pode alterar o esquema anterior para incluir esses atributos no <elemento xsd:schema> e executar o modelo novamente. Como os atributos agora são qualificados também na instância, a consulta XPath será alterada para incluir o prefixo de namespace.

Esta é a consulta XPath revisada:

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

Este é o documento XML retornado:

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