Partilhar via


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

Aplica-se a:SQL ServerBanco de Dados SQL do Azure

Ao escrever esquemas XSD, pode usar o atributo XSD targetNamespace para especificar um namespace alvo. Este artigo descreve como funcionam os atributos XSD targetNamespace, elementFormDefault, e attributeFormDefault como afetam a instância XML gerada e como as consultas XPath são especificadas com namespaces.

Podes usar o xsd:targetNamespace atributo para colocar elementos e atributos do namespace predefinido para outro namespace. Também pode especificar se os elementos e atributos localmente declarados do esquema devem parecer qualificados por um namespace, seja explicitamente usando um prefixo ou implicitamente por defeito. Pode usar os elementFormDefault atributos e attributeFormDefault no <xsd:schema> elemento para especificar globalmente a qualificação dos elementos e atributos locais, ou pode usar o form atributo para especificar elementos e atributos individuais separadamente.

Examples

Para criar exemplos funcionais usando os seguintes exemplos, deve cumprir certos requisitos. Para mais informações, consulte Requisitos para Executar Exemplos de SQLXML.

A. Especificar um espaço de nomes alvo

O seguinte esquema XSD especifica um namespace alvo usando o xsd:targetNamespace atributo. O esquema também define os elementFormDefault valores do atributo e attributeFormDefault para "unqualified" (o valor padrão destes atributos). Esta é 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 CustomerType declarações do tipo e OrderType são globais e, por isso, estão incluídas no espaço de nomes alvo do esquema. Como resultado, quando estes tipos são referenciados na declaração do <Customer> elemento e do seu <Order> elemento filho, é especificado um prefixo associado ao namespace de destino.

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

Execute a seguinte consulta XPath contra o esquema:

(/CO:Customer[@CustomerID=1)

A consulta XPath gera este documento de instância (apenas algumas das ordens são mostradas):

<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 espaço de nomes urn:MyNamespace e associa-lhe um prefixo (y0). O prefixo é aplicado apenas ao <Customer> elemento global. (O elemento é global porque é declarado como filho do <xsd:schema> elemento no esquema.)

O prefixo não é aplicado aos elementos e atributos locais porque o valor de elementFormDefault e attributeFormDefault attributes está definido como "unqualified" no esquema. O <Order> elemento é local porque a sua declaração aparece como um filho do <complexType> elemento que define o <CustomerType> elemento. De forma semelhante, os atributos (CustomerID, OrderID, e ContactName) são locais, não globais.

Crie um exemplo de trabalho deste esquema

  1. Copie o código de esquema anterior e cole num ficheiro de texto. Guarde o ficheiro como targetNamespace.xml.

  2. Copie o modelo seguinte e cole-o num ficheiro de texto. Guarde o ficheiro no targetNameSpaceT.xml mesmo diretório onde guardou 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 template devolve o <Customer> elemento para o cliente com um CustomerID de 1. A consulta XPath especifica o prefixo de namespace para o elemento na consulta e não para o atributo. (Os atributos locais não são qualificados, conforme especificado no esquema.)

    O caminho do diretório especificado para o esquema de mapeamento (targetNamespace.xml) é relativo ao diretório onde o modelo é guardado. Um caminho absoluto também pode ser especificado, por exemplo:

    mapping-schema="C:\MyDir\targetNamespace.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 4.0.

Se o esquema especificar elementFormDefault e attributeFormDefault atributos com valor "qualified", o documento de instância tem todos os elementos e atributos locais qualificados. Pode alterar o esquema anterior para incluir estes atributos no <xsd:schema> elemento e executar o modelo novamente. Como os atributos agora também são qualificados na instância, a consulta XPath muda para incluir o prefixo do namespace.

Esta é a consulta XPath revista:

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

Este é o documento XML que é devolvido:

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