Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Ao escrever esquemas XSD, você pode usar o atributo XSD targetNamespace para especificar um namespace de destino. Este tópico descreve como os atributos XSD targetNamespace, elementFormDefault e attributeFormDefault 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 declarados localmente do esquema devem aparecer qualificados por um namespace, 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 pode usar o atributo de formulário 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.
Um. 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 (<Ordem> 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, 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 em 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 ele é um elemento global no esquema.
Execute a seguinte consulta XPath no esquema:
(/CO:Customer[@CustomerID=1)
A consulta XPath gera este documento de instância (apenas alguns dos 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 trabalho desse esquema
Copie o código de esquema acima 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ê 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. (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\targetNamepsace.xml"Crie e use o script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o modelo.
Para obter mais informações, consulte Como usar o ADO para executar consultas SQLXML.
Se o esquema especificar atributos elementFormDefault e attributeFormDefault com o valor "qualificado", o documento da 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 também são qualificados na instância, a consulta XPath será 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>