XML Schema

22 respostas
E

Olá!

Usei o eclipse e ferramentas online de validação de XML Schema, mas todos estão reportando erro em meu arquivo xsd.

livro.xsd

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
	<xs:element name = "livro">
		<xs:complexType>
			<xs:sequence>
				<xs:element name = "capitulos">
					<xs:complexType>
						<xs:sequence>
							<xs:element name = "capitulo" type = "xs:string">
								<xs:attribute name = "numero">
									<xs:simpleType>
										<xs:restriction base = "xs:integer"/>
									</xs:simpleType>
								</xs:attribute>								
							
								<xs:attribute name = "paginas">
									<xs:simpleType>
										<xs:restriction base = "xs:string"/>
									</xs:simpleType>
								</xs:attribute>								
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

livro.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type = "text/xsl" href = "livro.xsl"?>
<livro>
	<capitulos>	
		<capitulo numero = "3" paginas = "35">A Burgesinha III</capitulo>
		<capitulo numero = "5" paginas = "32">A Burgesinha V</capitulo>
		<capitulo numero = "2" paginas = "20">A Burgesinha II</capitulo>
		<capitulo numero = "4" paginas = "19">A Burgesinha IV</capitulo>
		<apendice numero = "C" paginas = "2"></apendice>
		<apendice numero = "A" paginas = "1"></apendice>
		<apendice numero = "B" paginas = "2"></apendice>
		<capitulo numero = "1" paginas = "40">A Burgesinha I</capitulo>
	</capitulos>
</livro>

22 Respostas

G

Oi,

Um elemento simples (que é o caso do “capitulo”, do tipo xs:string) não pode ter atributos.
Nesse caso deve ser criado um novo tipo, que é uma extensão de xs:string porém com a inclusão de atributos.

Experimenta assim:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="livro">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="capitulos">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="capitulo">
								<xs:complexType>
									<xs:simpleContent>
										<xs:extension base="xs:string">
											<xs:attribute name="numero">
												<xs:simpleType>
													<xs:restriction base="xs:integer" />
												</xs:simpleType>
											</xs:attribute>

											<xs:attribute name="paginas">
												<xs:simpleType>
													<xs:restriction base="xs:string" />
												</xs:simpleType>
											</xs:attribute>
										</xs:extension>
									</xs:simpleContent>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

EDIT:
Ah… e também faltou definir o namespace para ligar o “livro” do XML ao “livro” do xsd, só assim a validação do xml será completa.

E

gomesrod:
Oi,

Um elemento simples (que é o caso do “capitulo”, do tipo xs:string) não pode ter atributos.
Nesse caso deve ser criado um novo tipo, que é uma extensão de xs:string porém com a inclusão de atributos.

Experimenta assim:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="livro">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="capitulos">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="capitulo">
								<xs:complexType>
									<xs:simpleContent>
										<xs:extension base="xs:string">
											<xs:attribute name="numero">
												<xs:simpleType>
													<xs:restriction base="xs:integer" />
												</xs:simpleType>
											</xs:attribute>

											<xs:attribute name="paginas">
												<xs:simpleType>
													<xs:restriction base="xs:string" />
												</xs:simpleType>
											</xs:attribute>
										</xs:extension>
									</xs:simpleContent>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

EDIT:
Ah… e também faltou definir o namespace para ligar o “livro” do XML ao “livro” do xsd, só assim a validação do xml será completa.

Por que simpleContent na linha 11 ?

G

O simpleContent indica que o tipo não contém tags filhas, apenas texto, “conteúdo simples” como o nome diz. A diferença em relação a usar um tipo pré-definido (por exemplo, xs:string) é justamente poder adicionar atributos, restrições, etc. Utiliza-se a herança de um tipo base e a partir daí se acrescenta o que for necessário.

Fiz uma modificação na estrutura do arquivo para que ele fique mais didático, com as declarações de cada tipo bem separadas:
O elemento raiz é “livro”, que contém um elemento do tipo “capitulos”, que por sua vez contém vários elementos do tipo “capitulo”.

Observe também as seguintes alterações:

  • Os elementos foram declarados no namespace especifico, para permitir que o XML seja validado por esse schema.
  • É preciso informar explicitamente que o elemento “capitulos” pode ter mais de um “capitulo”. Por padrão ele só aceita 1.
  • Aqueles xs:restriction não eram necessários, bastava usar o tipo pré-definido direto. O restriction serve para restringir os dados válidos (!), e você não estava utilizando esse recurso. Coloquei um exemplo de restrição no número do capítulo, que passa a aceitar apenas de 1 a 1000. E também marquei esse atributo como obrigatóio.
    No atributo paginas, como não queria utilizar nenhuma restrição, eliminei a declaração do simpletype e coloquei o tipo pré-definido direto.
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
		xmlns:li="LIVROS-NAMESPACE"
		targetNamespace="LIVROS-NAMESPACE">

	<xs:element name="livro" type="li:livro" />
	
	<xs:complexType name="livro">
		<xs:sequence>
			<xs:element name="capitulos" type="li:capitulos" />
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="capitulos">
		<xs:sequence>
			<xs:element name="capitulo" type="li:capitulo" minOccurs="1" maxOccurs="unbounded" />
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="capitulo">
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attribute name="numero" use="required">
					<xs:simpleType>
						<xs:restriction base="xs:integer">
							<xs:minInclusive value="1" />
							<xs:maxInclusive value="1000" />
						</xs:restriction>
					</xs:simpleType>
				</xs:attribute>

				<xs:attribute name="paginas" type="xs:string" />
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
</xs:schema>

E veja aqui o XML modificado para sofrer validação através do schema:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<li:livro xmlns:li="LIVROS-NAMESPACE"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="LIVROS-NAMESPACE livros.xsd">

	<capitulos>
		<capitulo numero="3" paginas="35">A Burgesinha III</capitulo>
		<capitulo numero="5">A Burgesinha V</capitulo>
		<capitulo paginas="20">A Burgesinha II</capitulo>
		<capitulo numero="5000">A Burgesinha IV</capitulo>

		<apendice numero="C" paginas="2"></apendice>
		<apendice numero="A" paginas="1"></apendice>
		<apendice numero="B" paginas="2"></apendice>
		<capitulo numero="1" paginas="40">A Burgesinha I</capitulo>
	</capitulos>
</li:livro>

Existem alguns erros comprovando que a validaçao funcionou:

  • Na terceira ocorrencia de “capitulo”, falta o atributo “numero”, que foi definido como obrigatorio.
  • Na quarta ocorrencia, o numero ultrapassa a restrição, que é 1000.
  • Os elementos apendice não fazem parte do livro de acordo com o schema.

A partir daí vc pode ir brincando e ver o efeito que tem cada alteração no schema ou no XML.

E

Eu entendi o que você fez, mas aparece o erro:

Linhas 11 e 41 : cvc-complex-type.2.4.d: Invalid content was found starting with element 'capitulo'. No child element is expected at this point.

livro.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type = "text/xsl" href = "livro.xsl"?>
<livro>
	<autor>
		<nome>A</nome>
		<sobrenome>B</sobrenome>
	</autor>
	
	<capitulos>	
		<capitulo numero = "3" paginas = "35">A Burgesinha III</capitulo>
		<capitulo numero = "5" paginas = "32">A Burgesinha V</capitulo>
		<capitulo numero = "2" paginas = "20">A Burgesinha II</capitulo>
		<capitulo numero = "4" paginas = "19">A Burgesinha IV</capitulo>
		<apendice numero = "C" paginas = "2"></apendice>
		<apendice numero = "A" paginas = "1"></apendice>
		<apendice numero = "B" paginas = "2"></apendice>
		<capitulo numero = "1" paginas = "40">A Burgesinha I</capitulo>
	</capitulos>
</livro>

livro.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="livro">
		<xs:complexType> <!-- utiliza complexType quando o elemento possui atributos ou outros elementos dentro dele -->
			<xs:sequence>
			
				<xs:element name = "autor">
					<xs:complexType>
						<xs:sequence>
												
							<xs:element name = "nome">
								<xs:simpleType>
									<xs:restriction base = "xs:string"/>
								</xs:simpleType>
							</xs:element>
							
							<xs:element name = "sobrenome">
								<xs:simpleType>
									<xs:restriction base = "xs:string"/>
								</xs:simpleType>
							</xs:element>
							
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				
				<xs:element name = "capitulos">
					<xs:complexType>
						<xs:sequence>
							<xs:element name = "capitulo">
								<xs:complexType>
									<xs:simpleContent>
										<xs:extension base="xs:string">
										
											<xs:attribute name = "numero">
												<xs:simpleType>
													<xs:restriction base = "xs:integer"/>
												</xs:simpleType>
											</xs:attribute>
											
											<xs:attribute name = "paginas">
												<xs:simpleType>
													<xs:restriction base = "xs:integer"/>
												</xs:simpleType>
											</xs:attribute>
											
										</xs:extension>
									</xs:simpleContent>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>
E

Eu não atualizei a página antes de responder! Vou ver direito a sua nova explicação!!!

E

gomesrod:
O simpleContent indica que o tipo não contém tags filhas, apenas texto, “conteúdo simples” como o nome diz. A diferença em relação a usar um tipo pré-definido (por exemplo, xs:string) é justamente poder adicionar atributos, restrições, etc. Utiliza-se a herança de um tipo base e a partir daí se acrescenta o que for necessário.

Fiz uma modificação na estrutura do arquivo para que ele fique mais didático, com as declarações de cada tipo bem separadas:
O elemento raiz é “livro”, que contém um elemento do tipo “capitulos”, que por sua vez contém vários elementos do tipo “capitulo”.

Observe também as seguintes alterações:

  • Os elementos foram declarados no namespace especifico, para permitir que o XML seja validado por esse schema.
  • É preciso informar explicitamente que o elemento “capitulos” pode ter mais de um “capitulo”. Por padrão ele só aceita 1.
  • Aqueles xs:restriction não eram necessários, bastava usar o tipo pré-definido direto. O restriction serve para restringir os dados válidos (!), e você não estava utilizando esse recurso. Coloquei um exemplo de restrição no número do capítulo, que passa a aceitar apenas de 1 a 1000. E também marquei esse atributo como obrigatóio.
    No atributo paginas, como não queria utilizar nenhuma restrição, eliminei a declaração do simpletype e coloquei o tipo pré-definido direto.
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
		xmlns:li="LIVROS-NAMESPACE"
		targetNamespace="LIVROS-NAMESPACE">

	<xs:element name="livro" type="li:livro" />
	
	<xs:complexType name="livro">
		<xs:sequence>
			<xs:element name="capitulos" type="li:capitulos" />
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="capitulos">
		<xs:sequence>
			<xs:element name="capitulo" type="li:capitulo" minOccurs="1" maxOccurs="unbounded" />
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="capitulo">
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attribute name="numero" use="required">
					<xs:simpleType>
						<xs:restriction base="xs:integer">
							<xs:minInclusive value="1" />
							<xs:maxInclusive value="1000" />
						</xs:restriction>
					</xs:simpleType>
				</xs:attribute>

				<xs:attribute name="paginas" type="xs:string" />
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
</xs:schema>

E veja aqui o XML modificado para sofrer validação através do schema:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<li:livro xmlns:li="LIVROS-NAMESPACE"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="LIVROS-NAMESPACE livros.xsd">

	<capitulos>
		<capitulo numero="3" paginas="35">A Burgesinha III</capitulo>
		<capitulo numero="5">A Burgesinha V</capitulo>
		<capitulo paginas="20">A Burgesinha II</capitulo>
		<capitulo numero="5000">A Burgesinha IV</capitulo>

		<apendice numero="C" paginas="2"></apendice>
		<apendice numero="A" paginas="1"></apendice>
		<apendice numero="B" paginas="2"></apendice>
		<capitulo numero="1" paginas="40">A Burgesinha I</capitulo>
	</capitulos>
</li:livro>

Existem alguns erros comprovando que a validaçao funcionou:

  • Na terceira ocorrencia de “capitulo”, falta o atributo “numero”, que foi definido como obrigatorio.
  • Na quarta ocorrencia, o numero ultrapassa a restrição, que é 1000.
  • Os elementos apendice não fazem parte do livro de acordo com o schema.

A partir daí vc pode ir brincando e ver o efeito que tem cada alteração no schema ou no XML.

Entendi…vou fazer um com base no seu…obrigado!

E

@gomesrod

Estou tendo problemas com Namespaces. Mesmo no seu exemplo, o namespace li não está sendo reconhecido!!

G

Que estranho… funcionou aqui, usando eclipse.
E ele também chegou a fazer validação aí na sua maquina, quando deu o erro "Invalid content was found starting with element ‘capitulo’ " …

Mudou alguma coisa? Os dois arquivos estao no mesmo diretório?

E

gomesrod:
Que estranho… funcionou aqui, usando eclipse.
E ele também chegou a fazer validação aí na sua maquina, quando deu o erro "Invalid content was found starting with element ‘capitulo’ " …

Mudou alguma coisa? Os dois arquivos estao no mesmo diretório?

Bem, estou usando o eclipse…

No elemento capitulos, vc tratou apenas o sub elemento numero. Não tratou paginas.
O elemento apendice, sub elemento de capitulos, também não foi tratado no Schema.

Não entendi por que o seu validou…

Para validar, verifico antes se tem erros apontados pelo eclipse. Depois, uso o site http://tools.decisionsoft.com/schemaValidate/

G

Ah sim… como eu disse em uma outra mensagem esses erros estão aí de propósito, só pra ver que a validação foi feita conforme o schema.
Só que não me expliquei bem, quando disse que a validação funcionou na verdade queria dizer que ela apontou os erros corretamente, não que teve sucesso!

O que eu achei estranho foi o erro para reconhecer o namespace, esse sim é que não devia acontecer.

E

gomesrod:
ECO2004:

No elemento capitulos, vc tratou apenas o sub elemento numero. Não tratou paginas.
O elemento apendice, sub elemento de capitulos, também não foi tratado no Schema.

Ah sim… como eu disse em uma outra mensagem esses erros estão aí de propósito, só pra ver que a validação foi feita conforme o schema.
Só que não me expliquei bem, quando disse que a validação funcionou na verdade queria dizer que ela apontou os erros corretamente, não que teve sucesso!

O que eu achei estranho foi o erro para reconhecer o namespace, esse sim é que não devia acontecer.

Entendi…
Olha…o namespace está sendo reconhecido agora…eu vou ver os erros mais uma vez…

Vc tá sendo uma jauda e tanto! :smiley:

E

@gomesrod

Faz me um favor…está o meu documento legível para ser lido? Outra coisa…só que estou com dúvida é com relação ao uso do extension base. Ele serve para derivar, mas por que foi usado aí? Foi para dizer que o conteúdo do elemento é uma string?

PS: Os xsd agora é válido.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:li="LIVROS-NAMESPACE" 
	targetNamespace="LIVROS-NAMESPACE">
	
	<xs:element name = "livro" type = "li:livro"/>
	
	<xs:complexType name = "livro">
		<xs:sequence>
			<xs:element name = "autor" type = "li:autor"/>
			<xs:element name = "capitulos" type = "li:capitulos"/>
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name = "autor">
		<xs:sequence>
			<xs:element name = "nome" type = "xs:string" minOccurs = "1" maxOccurs = "1"/>
			<xs:element name = "sobrenome" type = "xs:string" minOccurs = "1" maxOccurs = "1"/>
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name = "capitulos">
		<xs:sequence>
			<xs:element name = "capitulo" type = "li:capitulo" minOccurs = "1" maxOccurs = "unbounded"/>
			<xs:element name = "apendice" type = "li:apendice" minOccurs = "1" maxOccurs = "unbounded"/>
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="capitulo">
		<xs:simpleContent>
			<xs:extension base="xs:string">
			
				<xs:attribute name = "numero">
					<xs:simpleType>
						<xs:restriction base = "xs:integer">
							<xs:minInclusive value = "1"/>
						</xs:restriction>
					</xs:simpleType>
				</xs:attribute>	
				
				<xs:attribute name = "paginas">
					<xs:simpleType>
						<xs:restriction base = "xs:integer">
							<xs:minInclusive value = "0"/>
						</xs:restriction>
					</xs:simpleType>
				</xs:attribute>	
							
			</xs:extension>
		</xs:simpleContent>
		
	</xs:complexType>
	
	<xs:complexType name="apendice">
		<xs:simpleContent>
			<xs:extension base="xs:string">
			
				<xs:attribute name = "numero">
					<xs:simpleType>
						<xs:restriction base = "xs:string">
							<xs:pattern value = "[A-Z]"/>
						</xs:restriction>
					</xs:simpleType>
				</xs:attribute>	
				
				<xs:attribute name = "paginas">
					<xs:simpleType>
						<xs:restriction base = "xs:integer">
							<xs:minInclusive value = "0"/>
						</xs:restriction>
					</xs:simpleType>
				</xs:attribute>
								
			</xs:extension>
		</xs:simpleContent>
		
	</xs:complexType>
	
</xs:schema>
G

Está legal, bem simples.
Na verdade tem algumas coisas que poderiam ser retiradas, como:

  • minOccurs=1 / maxOccurs=1 : Esse já é o padrão, não precisa colocar explicitamente.

  • xs:minInclusive value = “0” : Se o mínimo é zero então acaba não tendo restrição*, pode tirar toda a declaração do tipo e usar o pré-definido direto.
    Por exemplo, trocar

<xs:attribute name = "paginas"> <xs:simpleType> <xs:restriction base = "xs:integer"> <xs:minInclusive value = "0"/> </xs:restriction> </xs:simpleType> </xs:attribute>
Por

<xs:attribute name = "paginas" type="xs:integer" />

Fica bem mais enxuto.

  • A não ser que a intenção seja proibir os números negativos… eu acho que é uma preocupação um pouco exagerada, mas claro que depende da situação.

Sobre sua pergunta específica: a idéia do extension é bem parecida com a herança na orientação a objetos. Serve para derivar um tipo qualquer, adicionando mais “coisas”.
Quando se cria extensão de um tipo complexo podemos adicionar/retirar tags filhas ou atributos, e para extensão de tipos simples só se pode adicionar atributos e/ou restrições no valor.

Veja por exemplo as extensões usadas nesse XSD, todas foram a partir de tipos simples:
Capitulo é um valor String, que inclui também os atributos “numero” e “paginas” (um campo tipo xs:string normal não aceita atributos).
O número de páginas do capítulo é um Integer, com restrição nos valores permitidos.

E

Cara, valeu mesmo pela ajuda!!!

Abraço!

E

@gomesrod

Estou tendo uns problemas de entendimento:

Quala diferença entre simpleContent e complexContent?

Pelo que andei lendo, simpleContent é usado quando o elemento possuir restrições ou derivações, tanto de seu conteúdo quanto de seus atributos. simpleContent é usado dentro de um complexType, ou seja, um elemento que possui ou elementos dentro dele ou atributos.

EX:

<estado regiao = "sudeste">MG</estado>
<element name = "estado">
   <complexType>
      <simpleContent>

         <restriction base = "string">
            <pattern value = "[A-Z]"/>
            <minLength value = "2"/>
            <maxLength value = "2"/>
         </restriction>

         <attribute name = "regiao" type = "string"/>

      </simpleContent>
   </complexType>
</element>

O complexContent é possui quase a mesma teoria. Também é usado depois de um complexType para sinalizar restrições ou extensões, onde se recebe outras características pré-definidas.

EX:

<element name = "carro">
   <sequence>
      <element name = "numeroPortas" type = "integer" />
      <element name = "ano" type = "integer" />
      <element name = "cilindro" type = "integer" />
   </sequence>
</element>
<element name = "nomeCarro">
   <complexType>
      <complexContent>
         <extension base = "carro">
            <element name = "nomeCarro" type = "string"/>
            <element name = "montadora" type = "string"/>
         </extension>
      </complexContent>
   </compleType>
</elemento>

Está certo o que eu afirmei? Corrija-me se eu estiver errado!!!

G

Vamos comentar por partes as suas duvidas…

Uma coisa que acho que não está clara é a diferença entre nome do elemento e nome do tipo.

Veja esse schema:

<!-- Considerando que estamos trabalhando no namespace TESTE-NAMESPACE, prefixo "tns" -->

<element name="turma" type="tns:turma" />

<complexType name="turma">
	<sequence>
		<element name="professor" type="tns:pessoa" />
		<element name="aluno" type="tns:pessoa" maxOccurs="30" />
	</sequence>
</complexType>

<complexType name="pessoa">
	<sequence>
		<element name="nome" type="string" />
		<element name="idade" type="int" />
	</sequence>
</complexType>

E um xml válido:

<tns:turma>
	<professor>
		<nome>Professor Tavares</nome>
		<idade>50</idade>
	</professor>
	<aluno>
		<nome>Joaozinho</nome>
		<idade>10</idade>
	</aluno>
	<aluno>
		<nome>Maria</nome>
		<idade>11</idade>
	</aluno>
</tns:turma>

O elemento “turma” é do tipo “turma”. Os nomes do tipo e do elemento são iguais apenas por coincidencia, mas são coisas diferentes. Uma turma possui um professor e vários alunos.
Os elementos “professor” e “aluno” são do mesmo tipo, que é “pessoa”.
Uma pessoa possui um “nome”, do tipo String, e uma “idade”, do tipo int.

Vemos assim que o nome do elemento (no XSD) é o que vai dar nome à tag no XML, enquanto o tipo determina o que vai dentro dessa tag.

Fazendo uma comparação com Java, é como isso:

String valor = "teste"; // "valor" é o nome do elemento, String é o tipo
Cliente cliente = new Cliente(); // "cliente" é o nome, "Cliente" é o tipo. Por coincidencia  são iguais

Quando se define o tipo diretamente no elemento, é criado um tipo anônimo, que é mais ou menos como um anonymous class do Java:
É um tipo que só vai ser usado para criar aquele elemento, nem tem nome porque garantimos que ele não será referenciado em nenhum outro lugar…

Runnable myRunnable = new Runnable() {
   public void run() {
       // faz algo...
   }
};

O XSD anterior ficaria assim se fosse feito todo com tipos anônimos:
(Procure observar bem as diferenças e semelhanças em relação ao outro modo)

<element name="turma">
	<complexType>
		<sequence>
			<element name="professor">
				<complexType>
					<sequence>
						<element name="nome" type="string" />
						<element name="idade" type="int" />
					</sequence>
				</complexType>
			</element>
			<element name="aluno" maxOccurs="30">
				<complexType>
					<sequence>
						<element name="nome" type="string" />
						<element name="idade" type="int" />
					</sequence>
				</complexType>
			</element>
		</sequence>
	</complexType>
</element>

Isso tudo para chegar em um erro em um dos seus exemplos:

<element name="carro">  
...
    </element>  

    ...
    ...
             <extension base = "carro">  
                <element name = "nomeCarro" type = "string"/>  
                <element name = "montadora" type = "string"/>  
             </extension>

Não se pode criar uma extensão de “carro” porque ele não é um tipo!
Para usar a extensão (que é uma idéia parecida com a herança no java), seria necessário definir um tipo que represente um carro. Não dá para herdar de um tipo anônimo.
Seria como fazer:

Runnable myRunnable = new Runnable() {
   public void run() {
       // faz algo...
   }
};

class RunnaFilha extends myRunnable {
// (!! NO NO NO !!)
}

Acredito que tenha ficado bem claro o conceito dos tipos. Insisti bastante nisso porque entendendo bem o resto fica fácil.

*** SimpleType

É um tipo que só possui como conteúdo um valor. Só isso. Não pode ter tags filhas, nem atributos.
São usados como tags apenas-texto ou como atributos de outras tags.
Os tipos “string”, “int”, “boolean”, e a maioria dos tipos pré-definidos, são simpleTypes.

  • Mas porque criar um simpletype ao invés de usar um tipo pré-definido? Para ter maior controle sobre o conteúdo!

Um exemplo, no caso anterior ao invés de usar “int” para a idade, vamos criar um novo tipo:

<complexType name="pessoa">
		<sequence>
			<element name="nome" type="string" />
			<element name="idade" type="tns:tipoIdade" />
		</sequence>
	</complexType>

	<simpleType name="tipoIdade">
		<restriction base="int">
			<minInclusive value="0" />
			<maxInclusive value="150" />
		</restriction>
	</simpleType>

*** ComplexType

Não há muito mais a acrescentar… são tipos que possuem tags filhas e/ou atributos. Como exemplo no caso anterior, temos “turma” e “pessoa”.

Seu conteúdo pode definido de uma das seguintes formas:

  • Uma sequencia ou conjunto de tags filhas + atributos.
  • Herança de um outro ComplexType
  • Herança de um SimpleType

*** ComplexContent

Indica que o complexType que estamos definindo vai herdar de outro tipo complexo.
No XML existem dois tipos de herança, extension (quando se adiciona elementos ou atributos) ou restriction (quando se retira elementos ou atributos, ou ainda quando se restringe o valor para tipos simples).

A tag complexContent sempre vem seguida de ou

Poderiamos usar o seguinte exemplo, aproveitando o tipo “pessoa” definido anteriormente:

<element name="heroi" type="tns:pessoaComPoderes" />
	<complexType name="pessoaComPoderes">
		<complexContent>
			<extension base="tns:pessoa">
				<sequence>
					<element name="poder" type="string" />
				</sequence>
			</extension>
		</complexContent>
	</complexType>
<heroi>
		<nome>Superman</nome>
		<idade>35</idade>
		<poder>Voar + Superforça</poder>
	</heroi>

*** SimpleContent

Indica que o complexType que estamos definindo vai herdar de um tipo simples (elemento apenas texto).
Quando herdamos de um tipo simples, só é possível restringir o valor e adicionar atributos.
Repare que tipos simples não possuem atributos, mas este é um tipo complexo criado a partir de um tipo simples. É um tipo complexo com “conteúdo simples”, quer dizer, apenas texto e sem tags filhas, porém pode ter atributos.

Exatamente como você fez no tipo da tag “estado” (só lembrando que “estado” não é o tipo, e sim o nome do elemento - o tipo é anônimo). Herdou de string, restringindo o valor, e adicionou o atributo regiao.

Ele deixa de ser um tipo simples pois agora possui um atributo, mas é um “tipo complexo com conteúdo simples”

Acho que é isso… sei la se expliquei direito rsrs
Gostaria de sugerir a leitura do seguinte tutorial:
http://www.w3schools.com/Schema/default.asp

E

@gomesrod

Show de bola nas explicações!!! Brigadaummmm
Tá melhor que o site do w3school !

G

Que bom que ajudou :smiley:

Para mim tambem foi útil, eu estava ha algumas semanas justamente estudando essas coisas, e ensinar ajuda a aprender melhor…

E

@gomesrod

Tou com um problema com um xls…

XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type = "text/xsl" href = "escola.xsl"?>
<es:escola xmlns:es = "ESCOLA-NAMESPACE"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation = "ESCOLA-NAMESPACE escola.xsd">
	<diretor>
	
		<professor nome = "João" disciplina = "Inglês">
			<aluno sexo  = "M" serie = "8">Carlos</aluno>
			<aluno sexo  = "F" serie = "8">Maria</aluno>
			<aluno sexo  = "M" serie = "8">Sérgio</aluno>
			<aluno sexo  = "M" serie = "8">Nícolas</aluno>
		</professor>
		
		<professor nome = "Carla" disciplina = "Português">
			<aluno sexo  = "M" serie = "8">Carlos</aluno>
			<aluno sexo  = "F" serie = "8">Maria</aluno>
			<aluno sexo  = "M" serie = "8">Sérgio</aluno>
			<aluno sexo  = "M" serie = "8">Nícolas</aluno>
		</professor>
		
		<professor nome = "Pedro" disciplina = "Matemática">
			<aluno sexo  = "M" serie = "8">Carlos</aluno>
			<aluno sexo  = "F" serie = "8">Maria</aluno>
			<aluno sexo  = "M" serie = "8">Sérgio</aluno>
			<aluno sexo  = "M" serie = "8">Nícolas</aluno>
		</professor>
		
		<secretaria turno = "manha">Maria</secretaria>
		<secretaria turno = "tarde">Fátima</secretaria>
		
	</diretor>
</es:escola>

XSL 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "html" omit-xml-declaration = "no"
	doctype-system = "www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd" doctype-public = "-//W3C//DTD XHTML 1.0 Strict//EN"/>
	
	<!-- The <xsl:template> element contains rules to apply when a specified node is matched
	The match attribute is used to associate the template with an XML element. The match attribute
	can also be used to define a template for a whole branch of the XML document
	(i.e. match="/" defines the whole document). -->
	
	<xsl:template match = "/">
		<html xmlns = "http://www.w3.org/1999/xhtml">
			<head>
				<title>Escola</title>
			</head>
			
			<body><xsl:apply-templates/></body>
		</html>
	</xsl:template>
	
	<xsl:template match = "diretor">
		<table border = "1">
			<thead>
				<tr>
					<td><strong>Professor</strong></td>
					<td><strong>Disciplina</strong></td>
				</tr>				
			</thead>
			
			<tbody>
				<xsl:for-each select = "//professor">
					<tr>
						<td>
							<xsl:value-of select = "@nome"/>
						</td>
						
						<td>
							<xsl:value-of select = "@disciplina"/>
						</td>				
					</tr>
				</xsl:for-each>
			</tbody>
			
		</table>
	</xsl:template>
	
</xsl:stylesheet>

XSL 2

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "html" omit-xml-declaration = "no"
	doctype-system = "www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd" doctype-public = "-//W3C//DTD XHTML 1.0 Strict//EN"/>
	
	<!-- The <xsl:template> element contains rules to apply when a specified node is matched
	The match attribute is used to associate the template with an XML element. The match attribute
	can also be used to define a template for a whole branch of the XML document
	(i.e. match="/" defines the whole document). -->
	
	<xsl:template match = "/">
		<html xmlns = "http://www.w3.org/1999/xhtml">
			<head>
				<title>Escola</title>
			</head>
			
			<body><xsl:apply-templates/></body>
		</html>
	</xsl:template>
	
	<xsl:template match = "diretor">
		<table border = "1">
			<thead>
				<tr>
					<td><strong>Professor</strong></td>
					<td><strong>Disciplina</strong></td>
				</tr>				
			</thead>
			
			<tbody>
				<xsl:apply-templates select = "professor"/>	
			</tbody>
			
		</table>
	</xsl:template>

	<xsl:template match = "professor">		

		<xsl:for-each select = "//professor">
			<tr>
				<td>
					<xsl:value-of select = "@nome"/>
				</td>
				
				<td>
					<xsl:value-of select = "@disciplina"/>
				</td>				
			</tr>
		</xsl:for-each>
		
	</xsl:template>
</xsl:stylesheet>

Eu quero fazer funcionar pelo XSL 2, mas está imprimindo a tabela três vezes, pois no XML há três elementos professor. Como que eu poderia fazer usando apply-templates, como no XSL 2 e manter a impressão da XSL 1? A XSL 1 imprime o que quero: apenas uma tabela.

G

Oi,

De formatação com XSL eu não entendo muito não… sugiro abrir um outro tópico, para ficar claro que é um problema com xsl, e também para chamar atenção das pessoas por ser um assunto novo e ainda não respondido.

E

É melhor mesmo! Obrigado!!

J

Olá,
minha aplicação precisa ler um XSD e com base nele permitir que o usuário crie uma estrutura em uma TreeView, simples.
Estou usanso o XSOM mas não sei como identificar quais elementos compõem um tipo complexo. Alguém sabe como posso fazer isso usando o XSOM?
Ou alguma outra API que permita fazer essa identificação mais facilmente?
Obrigado

Criado 4 de outubro de 2011
Ultima resposta 16 de dez. de 2011
Respostas 22
Participantes 3