Partilhar via


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

Ao escrever esquemas XSD, você pode usar o atributo targetNamespace de XSD para especificar um namespace de destino. Este tópico descreve como os atributos de XSD targetNamespace, elementFormDefault e attributeFormDefault funcionam, como eles afetam a instância XML gerada e como as consultas de 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. É possível usar os atributos elementFormDefault e attributeFormDefault no elemento <xsd:schema> para especificar globalmente a qualificação dos atributos e elementos locais, ou você pode usar o atributo form para especificar elementos e atributos específicos 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 do 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 “unqualified” ( o valor padrão para estes atributos). Essa é uma declaração global e afeta todos os elementos locais (<Ordem> no esquema) e atributos (Identificação do Cliente, ContactNamee 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, sã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 e associado ao namespace de destino.

  • O elemento <Customer> também é 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 só é se aplicado 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, pois o valor dos atributos elementFormDefault e attributeFormDefault é definido como "unqualified" 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, OrderIDe ContactName) são locais, e 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 os atributos elementFormDefault e attributeFormDefault com valor ”qualified", o documento de instância terá todos os elementos locais e atributos qualificados. Você pode alterar o esquema anterior para incluir estes 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>