Conheça também: Onmasters . Ofertas . Divulgue! . Vai.la . Geraboleto . Baixa.la . Assista.la . Joga.la
» Início » Programação » XML » Um pouco além do XML: Introdução ao XML Schema (XSD) - Parte 5 -->
 
Avaliação: | Publicado em: 28/12/2006
Um pouco além do XML: Introdução ao XML Schema (XSD) - Parte 5


A cláusula KeyRef

A definição de elementos não é nenhuma novidade. O importante é atentar-se para as definições das chaves (elementos key e keyref). Para que eles fiquem no mesmo escopo (dentro do elemento “Remessa”) é necessário que ambos sejam declarados dentro do mesmo elemento. Como ambos estão dentro do elemento “Remessa” é preciso construir expressões XPATH que naveguem até os campos necessários. Na definição da chave primária é feita a navegação pelos nós “Remessa”, “Clientes” e “Cliente” até o atributo IdCliente (acompanhado do @). Na definição da chave primária é feita a navegação pelos nós “Remessa”, “Pedidos” e “Pedido” até o atributo IdCliente (acompanhado do @). O documento XML abaixo é considerado válido segundo o esquema especificado.

<?xml version="1.0"?>
<Remessa xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./Pedidos.xsd">
 <Clientes>
  <Cliente IdCliente="ALFKI">
   <Empresa>Alfreds Futterkiste</Empresa>
   <Contato>Maria Anders</Contato>
  </Cliente>
  <Cliente IdCliente="AROUT">
   <Empresa>Around the Horn</Empresa>
   <Contato>Thomas Hardy</Contato>
  </Cliente>
 </Clientes>
 <Pedidos>
  <Pedido Data="1997-10-03" IdCliente="ALFKI">
   <Item>
    <Produto>Vegie-spread</Produto>
    <Quantidade>20</Quantidade>
    <Preco>43.9000</Preco>
    <Total>878.0000</Total>
   </Item>
  </Pedido>
  <Pedido Data="1998-01-15" IdCliente="ALFKI">
   <Item>
    <Produto>Raclette Courdavault</Produto>
    <Quantidade>15</Quantidade>
    <Preco>55.0000</Preco>
    <Total>825.0000</Total>
   </Item>
  </Pedido>
  <Pedido Data="1997-06-04" IdCliente="AROUT">
   <Item>
    <Produto>Manjimup Dried Apples</Produto>
    <Quantidade>20</Quantidade>
    <Preco>53.0000</Preco>
    <Total>1060.0000</Total>
   </Item>
   <Item>
    <Produto>Rössle Sauerkraut</Produto>
    <Quantidade>15</Quantidade>
    <Preco>45.6000</Preco>
    <Total>684.0000</Total>
   </Item>
  </Pedido>
 </Pedidos>
</Remessa>

Para realizar uma verificação nas chaves primárias e estrangeiras, uma troca pode ser feita para que o identificador de cliente fique duplicado ou para que um pedido referencie um cliente inexistente.

<?xml version="1.0"?>
<Remessa xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./Pedidos.xsd">
 <Clientes>
  <Cliente IdCliente="ALFKI">
   <Empresa>Alfreds Futterkiste</Empresa>
   <Contato>Maria Anders</Contato>
  </Cliente>
  <Cliente IdCliente="ALFKI">
   <Empresa>Around the Horn</Empresa>
   <Contato>Thomas Hardy</Contato>
  </Cliente>
 </Clientes>
 <Pedidos>
  <Pedido Data="1997-10-03" IdCliente="Unknow">
   <Item>
    <Produto>Vegie-spread</Produto>
    <Quantidade>20</Quantidade>
    <Preco>43.9000</Preco>
    <Total>878.0000</Total>
   </Item>
  </Pedido>
 </Pedidos>
</Remessa>

A cláusula KeyRef só permite referências a elementos únicos definidos pela cláusula Key ou Unique. No entanto, se o campo referenciado pela cláusula KeyRef não for obrigatório o campo poderá ser omitido e o documento XML continuará válido. No exemplo citado, a cláusula KeyRef garante que todos os clientes referenciados em pedidos têm de ser válidos, mas ela por si só não impede a existência de pedidos sem cliente. O documento XML abaixo também é considerado válido, mesmo com um pedido sem cliente.

<?xml version="1.0"?>
<Remessa xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./Pedidos.xsd">
 <Clientes>
  <Cliente IdCliente="ALFKI">
   <Empresa>Alfreds Futterkiste</Empresa>
   <Contato>Maria Anders</Contato>
  </Cliente>
 </Clientes>
 <Pedidos>
  <Pedido Data="1997-10-03">
   <Item>
    <Produto>Vegie-spread</Produto>
    <Quantidade>20</Quantidade>
    <Preco>43.9000</Preco>
    <Total>878.0000</Total>
   </Item>
  </Pedido>
 </Pedidos>
</Remessa>

Para que a especificação de um cliente seja obrigatória em um pedido é preciso redefinir o esquema e adicionar a propriedade “use” no atributo IdCliente do elemento Pedido. Essa propriedade deve ser configurada como “required”.


Uderson Luis Fermino <uderson@gmail.com>
Cara, agradeço a seu artigo por te me ajudado muito e contribuito para meu maior crescimento.
Excelente o artigo, didático e muito util.
Parabéns pelo exelente artigo!
gostei muito dos artigos. Direto, prático e didático. Parabéns!
Edemilson A. de Almeida <ede_aparecido@yahoo.com.br>
Valeu Gustavo. Este seu artigo sobre XML me ajudou muito no projeto semestral na faculdade, porque você aliou técnica e clareza nele. Parabéns.
Euripedes Borges <euripedesborges@netsite.com.br>
Adorei esse artigo sobre XML, "Um pouco além do XML". Realmente foi muito bom.
O Grande problema de algumas especificações é possuir um vocabulário muito restrito.
Esse tutorial em 5 parte é excelente para quem quer aprender e não entende bem as descrições dadas pela W3C.
Parabéns
Gustavo Dettenborn <gustavodettenborn@gmail.com>
Muito bom o seu artigo cara...
Mas rolou um dúvida devido a pouca experiência com XPath e schema. Pode-se referenciar outro arquivo no selector?
Ex:
<xsd:key name="pkLivro">
<xsd:selector xpath="outroXML:elementoLivro"/>
<xsd:field xpath="@ISBN"/>
</xsd:key>
É possível???
Desde já agradeço...