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 cláusula KeyRef funciona de forma análoga a uma chave estrangeira, ou seja, ela aceita um pré-determinado de valores possíveis desde que eles tenham sido especificados previamente como chave primária em outro local. No XML Schema é possível aplicar esse tipo de lógica entre os nós de um documento XML.

O esquema abaixo define os tipos cliente e pedido. Está imposto que um cliente deve ser identificado de forma única através de seu ID e que todos os pedidos só podem ter um cliente que tenha um ID válido.

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

 <!-- Definição do tipo Cliente-->
 <xsd:complexType name="tCliente">
  <xsd:sequence>
   <xsd:element name="Empresa" type="xsd:string"/>
   <xsd:element name="Contato" type="xsd:string"/>
  </xsd:sequence>
  <xsd:attribute name="IdCliente" type="xsd:string" use="required"/>
 </xsd:complexType>

 <!-- Definição do tipo Item-->
 <xsd:complexType name="tItem">
  <xsd:sequence>
   <xsd:element name="Produto" type="xsd:string"/>
   <xsd:element name="Quantidade" type="xsd:positiveInteger"/>
   <xsd:element name="Preco" type="xsd:decimal"/>
   <xsd:element name="Total" type="xsd:decimal"/>
  </xsd:sequence>
  <xsd:attribute name="Data" type="xsd:date"/>
  <xsd:attribute name="IdCliente" type="xsd:string"/>
 </xsd:complexType>

 <!-- Definição do tipo Pedido-->
 <xsd:complexType name="tPedido">
  <xsd:sequence>
   <xsd:element name="Item" type="tItem" minOccurs="1" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="Data" type="xsd:date"/>
  <xsd:attribute name="IdCliente" type="xsd:string"/>
 </xsd:complexType>

 <!-- Definição do tipo Clientes-->
 <xsd:complexType name="tClientes">
  <xsd:sequence>
   <xsd:element name="Cliente" type="tCliente" minOccurs="1" maxOccurs="unbounded"/>
  </xsd:sequence>
 </xsd:complexType>

 <!-- Definição do tipo Pedidos-->
 <xsd:complexType name="tPedidos">
  <xsd:sequence>
   <xsd:element name="Pedido" type="tPedido" minOccurs="1" maxOccurs="unbounded"/>
  </xsd:sequence>
 </xsd:complexType>

 <!-- Definição das Remessas-->
 <xsd:element name="Remessa">
  <xsd:complexType>
   <xsd:sequence>

    <!-- Definição do elemento Cliente-->
    <xsd:element name="Clientes" type="tClientes"/>

    <!-- Definição do elemento Pedidos-->
    <xsd:element name="Pedidos" type="tPedidos"/>

   </xsd:sequence>
  </xsd:complexType>

  <!-- Definição da chave primária em Clientes"-->
  <xsd:key name="PK_Clientes">
   <xsd:selector xpath="Clientes/Cliente"/>
   <xsd:field xpath="@IdCliente"/>
  </xsd:key>

  <!-- Definição da chave estrangeira em Pedidos.
   Essa chave referencia a chave primária em Clientes-->

  <xsd:keyref name="FK_Pedidos_Clientes" refer="PK_Clientes">
   <xsd:selector xpath="Pedidos/Pedido"/>
   <xsd:field xpath="@IdCliente"/>
  </xsd:keyref>

 </xsd:element>

</xsd:schema>


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