Especificar um namespace de destino usando o atributo targetNamespace (SQLXML 4.0)
Aplica-se a: SQL Server Banco de Dados SQL do Azure
Ao escrever esquemas XSD, você pode usar o atributo XSD targetNamespace
para especificar um namespace de destino. Este artigo descreve como os atributos XSD targetNamespace
, elementFormDefault
e attributeFormDefault
e funcionam, como eles afetam a instância XML gerada e como as consultas XPath são especificadas com namespaces.
Você pode usar o xsd:targetNamespace
atributo 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 elementFormDefault
atributos and attributeFormDefault
no <xsd:schema>
elemento para especificar globalmente a qualificação de elementos e atributos locais, ou pode usar o form
atributo 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.
R. Especificar um namespace de destino
O esquema XSD a seguir especifica um namespace de destino usando o xsd:targetNamespace
atributo. O esquema também define os valores de elementFormDefault
atributo e attributeFormDefault
como "unqualified"
(o valor padrão para esses 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 de tipo eOrderType
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<Customer>
elemento e seu<Order>
elemento filho, um prefixo é especificado 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 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 <Customer>
é aplicado somente ao elemento global. (O elemento é global porque é declarado como um filho do <xsd:schema>
elemento no esquema.)
O prefixo não é aplicado aos elementos e atributos locais porque o valor de elementFormDefault
e attributeFormDefault
atributos é definido como "unqualified"
no esquema. O <Order>
elemento é local porque sua declaração aparece como um filho do <complexType>
elemento que define o <CustomerType>
elemento. Da mesma forma, os atributos (CustomerID
, OrderID
, e ContactName
) são locais, não globais.
Criar uma amostra de trabalho desse esquema
Copie o código do esquema anterior e cole-o em um arquivo de texto. Salve o arquivo como
targetNamespace.xml
.Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como
targetNameSpaceT.xml
no mesmo diretório em que você salvoutargetNamespace.xml
o .<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
<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 em que o modelo é salvo. Também é possível especificar um caminho absoluto, por exemplo:mapping-schema="C:\MyDir\targetNamespace.xml"
Crie e use o script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o modelo.
Para obter mais informações, consulte Usar o ADO para executar consultas SQLXML 4.0.
Se o esquema especificar elementFormDefault
e attributeFormDefault
atributos com valor "qualified"
, o documento de instância terá todos os elementos e atributos locais qualificados. Você pode alterar o esquema anterior para incluir esses 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 é alterada para incluir o prefixo do 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>