62
RICARDO TERRA NUNES BUENO VILLELA XML: Utilização, validação e transformação. BELO HORIZONTE 2009

XML - Apostila Completa

Embed Size (px)

Citation preview

Page 1: XML - Apostila Completa

RICARDO TERRA NUNES BUENO VILLELA

XML

Utilizaccedilatildeo validaccedilatildeo e transformaccedilatildeo

BELO HORIZONTE

2009

SUMAacuteRIO

1 INTRODUCcedilAtildeO A LINGUAGEM XML 3

11 W3C 3

12 XML 3

13 XML x HTML 5

2 SINTAXE XML 6

21 Sintaxe HTML 6

22 Partes do documento 6

23 Elementos 7

24 Elementos do documento 7

25 Aninhamento de elementos 8

26 Atributos 8

27 Referecircncias de caractere e entidade 9

28 Instruccedilotildees de processamento 10

29 Comentaacuterio 10

210 Seccedilotildees CDATA 10

3 ESQUEMAS DE VALIDACcedilAtildeO 11

31 Modelagem de dados 11

32 XML bem formado e vaacutelido 11

33 Esquemas de validaccedilatildeo 12

34 DTD 14

341 Declaraccedilatildeo Interna 14

342 Declaraccedilatildeo Externa 14

343 Blocos de Construccedilatildeo de Documento XML 15

344 Elementos 16

345 Atributos 19

346 Entidades 22

35 XML Schema 24

351 Declaraccedilatildeo 24

352 O elemento Schema 24

353 Referenciando um Schema em um documento XML 25

354 Elementos XSD Simples 26

355 Elementos XSD Complexos 34

4 XSLT 46

41 XSLT e CSS 47

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis 47

43 Praacutetica do XSLT 49

431 Regras (Templates) 51

432 O elemento ltxslvalue-ofgt 52

433 O elemento ltxslfor-eachgt 53

434 O elemento ltxslsortgt 55

435 O elemento ltxslifgt 56

436 O elemento ltxslchoosegt 57

437 O elemento ltxslapply-templatesgt 59

438 O elemento ltxsloutputgt 60

439 O elemento ltxslvariablegt 60

3

1 INTRODUCcedilAtildeO A LINGUAGEM XML

11 W3C

World Wide Web Consortium (W3C) eacute um consoacutercio de vaacuterias empresas mundiais de tecnologia (aproximadamente 500 empresas) fundada por Tim Berners Lee no ano de 1994 com o objetivo de levar a Internet ao seu potencial maacuteximo atraveacutes de desenvolvimento de protocolos comuns e foacuteruns abertos que promovem a sua evoluccedilatildeo e garantem a sua interoperabilidade

O W3C desenvolve tecnologias ou melhor padrotildees para a criaccedilatildeo e a interpretaccedilatildeo dos conteuacutedos para a Internet Sites desenvolvidos segundo esses padrotildees podem ser acessados e visualizados por qualquer pessoa ou tecnologia independente do hardware ou do software utilizados por exemplo PC com Linux PDA com Windows CE entre outros exemplos

Apesar do W3C natildeo ser muito conhecido no Brasil seus padrotildees como Hyper Text Markup Language (HTML) Extensible Hypertext Markup Language (XHTML) Extensible Markup Language (XML) e Cascading Style Sheets (CSS) satildeo muito populares contudo em muitos casos satildeo usados de forma errocircnea devido ao natildeo conhecimento da especificaccedilatildeo Eacute da responsabilidade do desenvolvedor Web respeitar e seguir os padrotildees deste oacutergatildeo pois se assim natildeo fizer estaraacute impondo barreiras tecnoloacutegicas a diversas pessoas e com isto desestimulando e ateacute mesmo impedindo o acesso a suas paacuteginas

12 XML

121 Conceitos

Extensible Markup Language (XML) se tornou uma recomendaccedilatildeo da W3C no dia 10 de fevereiro de 1998 cujo objetivo seria a geraccedilatildeo de linguagens de marcaccedilatildeo para necessidades especiais

O W3C comeccedilou a trabalhar em um projeto de uma linguagem de marcaccedilatildeo que combinasse a flexibilidade do SGML (Standard Generalized Markup Language) com a simplicidade do HTML O principio do projeto era criar uma linguagem que pudesse ser lida por software e se integrar com as demais linguagens Sua filosofia seria incorporada por vaacuterios princiacutepios importantes

separaccedilatildeo do conteuacutedo e da formataccedilatildeo eacute uma linguagem cujo aspecto importante eacute o conteuacutedo A formataccedilatildeo poderia ser realizada por uma outra linguagem

possibilidade de criaccedilatildeo de tags sem limitaccedilatildeo o uso de tags pode ser altamente utilizado sem nenhuma limitaccedilatildeo contudo a estrutura deve ser respeitada e seguida

legibilidade tanto pelas pessoas quanto por maacutequinas a estrutura do XML eacute bem completa e ilimitada e ao mesmo tempo simples tornando de faacutecil leitura por pessoas

4

criaccedilatildeo de arquivos para validaccedilatildeo de estrutura arquivos de validaccedilatildeo a serem visto posteriormente neste estudo permitem verificar se um XML aleacutem de bem formado eacute tambeacutem vaacutelido de acordo com uma estrutura

interligaccedilatildeo sua utilizaccedilatildeo permite interligar SGBDs (Sistema de Gerenciamento de Banco de Dados) distintos

simplicidade

Existem linguagens baseadas em XML como RDF SMIL MathML NCL XSIL e SVG O SVG por exemplo eacute um formato graacutefico vetorial (graphics scalar vector) e o MathML eacute uma linguagem de marcaccedilatildeo desenvolvida para o aspecto matemaacutetico

122 Motivaccedilatildeo

Maioria dos formatos de troca de dados eram

proprietaacuterios (custo)

necessidades especiacuteficas (soluccedilatildeo especiacutefica)

binaacuterios (diferentes aplicaccedilotildees e plataformas)

123 Caracteriacutesticas

Provecirc uma forma baseada em texto

caractere eacute sua unidade principal

aplica uma estrutura baseada em aacutervore para armazenar a informaccedilatildeo

facilidade na ediccedilatildeo e manutenccedilatildeo

Foco na informaccedilatildeo

Simplicidade e legibilidade

Criaccedilatildeo de marcaccedilotildees sem limitaccedilatildeo

124 Vantagens e Desvantagens

Dentre as principais vantagens destacam-se

Formato legiacutevel para pessoas e maacutequinas

Suporta UNICODE permitindo que quase qualquer linguagem escrita possa ser comunicada

Representa a maioria das estruturas de dados da computaccedilatildeo registros listas e aacutervores

Seu proacuteprio formato descreve a estrutura e os nomes dos campos

Dentre algumas desvantagens destacam-se

Sintaxe cheia e redundante

A redundacircncia pode afetar a eficiecircncia atraveacutes do armazenamento alto e do custo de transmissatildeo

A interpretaccedilatildeo natildeo suporta diretamente tipos de dados

5

Mapear o XML em um paradigma relacional ou orientado a objetos eacute uma tarefa custosa entretanto o inverso eacute faacutecil

Algumas pessoas insistem em dizer que o XML pode ser utilizado para armazenamento de dados somente se o arquivo eacute de baixo volume Todavia este informaccedilatildeo natildeo eacute verdadeira grandes estruturas XML podem ser acessadas muito rapidamente

13 XML x HTML

Tanto o XML quanto o HTML satildeo linguagens derivadas do SGML O que alguns pensam eacute que o XML foi criado com o propoacutesito de substituir o HTML Isto natildeo eacute verdade e antes de comentarmos o porquecirc falaremos um pouco sobre o HTML

O HTML eacute uma linguagem de marcaccedilatildeo cujo objetivo eacute produzir paacuteginas na internet Suas tags consistem em uma marca de iniacutecio e outra de teacutermino suas marca de iniacutecio eacute simbolizada por lt e sua marca de teacutermino por gt

O XML funciona como o HTML possui tags de iniacutecio e teacutermino utiliza os mesmos siacutembolos todavia natildeo possui a maior caracteriacutestica do HTML tags preacute-estabelecidas O XML eacute amplo as tags satildeo ilimitadas e qualquer tag pode ser criada desde que a estrutura seja mantida

Enquanto o HTML eacute mais flexiacutevel permitindo que natildeo se feche algumas das tags o XML eacute altamente estruturado Isto indica que no XML ao criar uma tag deve-se obrigatoriamente fechaacute-la caso contraacuterio sua estrutura natildeo seraacute validada e o arquivo estaraacute invaacutelido problema que natildeo ocorre com o HTML no quais algumas de suas tags geralmente natildeo satildeo fechadas ou possuem alguma flexibilidade de estruturaccedilatildeo

6

2 SINTAXE XML

21 Sintaxe HTML Certamente vocecircs devem estar familiarizados com as tags de marcaccedilatildeo de

elementos HTML

ltH1 ALIGN=rsquoCENTERrsquogt Conteuacutedo do Elemento ltH1gt

Tag Inicial Conteuacutedo Tag Final

Elemento

A estrutura de marcaccedilatildeo do XML eacute basicamente a mesma que no HTML com a delimitaccedilatildeo de tags com o uso de lsquomenor quersquo (lt) e lsquomaior quersquo (gt)

Ex lth1gtOlaacutelth1gt

vaacutelido tanto na sintaxe HTML com na XML ltbrgt

invaacutelido na sintaxe XML todavia vaacutelido em HTML

22 Partes do documento

Um documento XML bem-formado compreende trecircs partes

Proacutelogo Opcional

Corpo Conteacutem um ou mais elementos na forma de uma aacutervore hieraacuterquica

Epiacutelogo Opcional

221 Proacutelogo

Um documento XML comeccedila com um proacutelogo O proacutelogo eacute usado para sinalizar o comeccedilo dos dados XML descrever seu meacutetodo de codificaccedilatildeo de caracteree apresentar algumas outras dicas de configuraccedilatildeo ao parser XML

O mais importante componente do proacutelogo eacute a declaraccedilatildeo XML

Todos os documento XML podem (e devem) comeccedilar com uma uacutenica declaraccedilatildeo XML Apesar da declaraccedilatildeo usar uma sintaxe similar a uma instruccedilatildeo de processamento tecnicamento falando dentro dos termos da recomendaccedilatildeo XML natildeo se trata de uma instruccedilatildeo Veja a sintaxe completa da declaraccedilatildeo XML

ltxml version=10 encoding=ISO-8859-1 standalone=yesgt

Os atributos definidos pela especificaccedilatildeo XML 10

version

obrigatoacuteria valor tem que ser 10 este atributo permite o suporte de futuras versotildees do XML

encoding

opcional O valor tem que ser uma codificaccedilatildeo de caractere legal como UTF-8 UTF-16 ou ISO-8859-1 (a

7

codificaccedilatildeo de latin1) Todos os parses XML devem oferecer suporte a pelo menos UTF-8 e UTF-16

standalone

opcional O valor tem que ser ldquoyesrdquo ou ldquonordquo onde ldquoyesldquo

significa que todas as declaraccedilotildees de entidade necessaacuterias estatildeo contidas no elemento e ldquonordquo significa que um DTD externo eacute necessaacuterio

23 Elementos

Os elementos satildeo blocos de construccedilatildeo baacutesicos de uma marcaccedilatildeo XML Eles podem conter outros elementos dados de caractere referecircncia de caractere referecircncias de entidade instruccedilotildees de processamento comentaacuterios eou seccedilotildees de CDATA Todos estes termos seratildeo abordados

Os elementos satildeo delimitados usando tags que consistem em nome de tipo de elemento fechada por um par de parecircnteses angulares (ldquolt gtrdquo)

Todo elemento deve conter uma tag inicial e outra tag final (que natildeo pode ser esquecida como no HTML)

lth1gtOlaacutelth1gt

vaacutelido ltbrgt

invaacutelido Deve ser ltbrgtltbrgt

Exceccedilatildeo uacutenica quando eacute um elemento sem conteuacutedo onde o elemento eacute representado por um par de tags inicialfinal ou usando-se uma forma hiacutebrida abreviada a tag de elemento vazia Ex

ltbrgt

invaacutelido ltbr gt

vaacutelido

Uma vez que representam objetos discretos os elementos podem ser considerados como ldquosubstantivosrdquo

24 Elementos do documento

Documentos XML bem-formados satildeo definidos como tendo a forma de uma aacutervore hieraacuterquica simples cada documento tendo um e somente um noacute raiz chamado de entidade do documento ou a raiz do documento

ltxml version=10gt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt

ltxml version=10gt ltpublicacoesgt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt ltpublicacoesgt

Invaacutelido Possui mais de uma raiz do documento

Vaacutelido Possui apenas uma raiz do documento

8

A raiz do documento conteacutem uma aacutervore de elementos secundaacuterios

chamado de elemento do documento

25 Aninhamento de elementos

XML impotildee um restriccedilatildeo-chave aos documentos ndash eles precisam estar apropriadamente aninhados

Veja em HTML um exemplo

ltBgtJoatildeo foi a ltIgtEscolaltBgt mas acabou perdendo a provaltIgt

Em uma sintaxe XML isto estaria invaacutelido pois os elementos devem estar aninhados O exemplo acima em uma sintaxe XML poderia ser representado como abaixo

ltBgtJoatildeo foi a ltIgtEscolaltIgtltBgtltIgt mas acabou perdendo a provaltIgt

26 Atributos

Se os elementos satildeo ldquosubstantivosrdquo entatildeo os atributos satildeo seus ldquoadjetivosrdquo

Frequumlentemente existe alguma informaccedilatildeo sobre um elemento que queremos anexar a ele ao contraacuterio da informaccedilatildeo que eacute contida no elemento Isto pode e deve ser feito utilizando atributos cada um composto de um par nome=valor utilizando um dos seguintes formatos

nome-atributo=valor-atributo utilizando aspas duplas nome-atributo=valor-atributo utilizando aspas simples

Os atributos precisam sempre ser delimitados utilizando aspas simples ou duplas

Devem sempre ser inseridos na tag inicial ou na tag hiacutebrida de elemento vazio Exemplo

ltpessoa nome=Ricardo Terra profissao=Professor gt

ltpessoa nome=Ricardo Terra profissao=Professorgt ltpessoagt

Somente uma apariccedilatildeo de um nome de atributo eacute permitida na mesma tag Por exempo o seguinte natildeo seria legal em XML uma vez que titulo aparece duas vezes

ltlivro titulo=XML Professional titulo=Iniciando XMLgtltlivrogt

Em HTML permite atributos numeacutericos como ltimg width=300gt ou atributos natildeo delimitados como ltfont face=Arialgt - poreacutem nenhum destes eacute permitido em XML

9

27 Referecircncias de caractere e entidade

Assim como no SGML e HTML o XML oferece dois meacutetodos simples de representar os dados que natildeo existem no conjunto de caracteres ASCII

Referecircncias de caractere

Referecircncias de entidade

271 Referecircncias de caractere

Representam um caractere exibiacutevel e satildeo compostas por um nuacutemero decimal ou hexadecimal precedido por strings literais ldquoamprdquo ou ldquoampxrdquo (respectivamente) e seguidos por um ponto-e-viacutergula ()

Exemplo amp169 (notaccedilatildeo decimal) ampxA9 (notaccedilatildeo hexadecimal)

Iratildeo exibir em um browser de visualizaccedilatildeo o caractere copy

272 Referecircncias de entidade

Permitem a inserccedilatildeo de qualquer string literal no conteuacutedo de elementos ou valores de atributo assim como oferecem alternativas mnemocircnicas para referecircncia de caracteres

Satildeo um nome legal para XML precedidas por um amp e seguidas de um ponto-e-viacutergula ()

Cinco identificadores satildeo definifidos como uma parte integral do XML e satildeo usadas como sequecircncia de escape para os caracteres delimitadores de marcaccedilatildeo do XML

Entidade Valor Uso ampamp amp Sempre utilizado para o escape do caractere amp (exceto em

seccedilotildees de CDATA) amplt lt Sempre utilizado para o escape do caractere lt (exceto em

seccedilotildees de CDATA) ampgt gt Sempre utilizado para o escape do caractere lt (ateacute mesmo

em seccedilotildees de CDATA) ampapos Pode ser usado no escape do caractere em strings literais ampquot Pode ser usado no escape do caractere em strings literais

Exemplos

ATampampT seraacute exibido ATampT

lttaggtampltlttaggt o o conteuacutedo da tag eacute lt que natildeo funcionaria assim lttaggtltlttaggt

ltlivro nome=O uso das aspas (ampquot) gt o O conteuacutedo da tag eacute O uso das aspas () que natildeo funcionaria se

fosse ltlivro nome=O uso das aspas () gt

10

28 Instruccedilotildees de processamento

Existem ocasiotildees em que eacute desejaacutevel poder passar dicas a uma aplicaccedilatildeo junto com o documento As instruccedilotildees de processamento (PIs ndash processing instructions) satildeo um mecanismo que o XML oferece para este propoacutesito

Os PIs utilizam uma sintaxe como a do elemento XML

lttarget hellipinstructionshellip gt

Uma utilizaccedilatildeo de PIs eacute na associaccedilatildeo de uma folha de estilos

ltxml-stylesheet hellip gt

29 Comentaacuterio

Pode ser uacutetil inserir notas ou comentaacuterios em um documento Estes comentaacuterios podem servir para revisatildeo histoacuterico ou qualquer outro metadados importantes contudo natildeo satildeo realmente parte do conteuacutedo de um documento

A sintaxe baacutesica de um comentaacuterio XML eacute

lt-- Comentaacuterio Qualquer --gt

Exemplos

lt-- XML de importaccedilatildeo criado por Ricardo Terra em 01jan2007 --gt ltbibliotecagt ltlivrogtltlivrogt lt-- Eis um livro --gt ltlivrogtltlivrogt lt-- Eis mais um livro --gt ltbibliotecagt

210 Seccedilotildees CDATA

Seccedilotildees CDATA satildeo um meacutetodo de inclusatildeo de texto que conteacutem caracteres que de outro forma seriam reconhecidos como marcaccedilatildeo

As seccedilotildees CDATA natildeo podem ser aninhadas e soacute devem ser utilizadas quando realmente necessaacuterio

A sintaxe baacutesica eacute

lt[CDATA[hellip]]gt onde pode ser qualquer string de caractere que natildeo seja ]]gt

Exemplo ltbibliotecagt ltlivrogt lt[CDATA[ltxml version=10gtltfaculdadegtltcurso nome=SIgtltfaculdadegt]]gt ltlivrogt ltbibliotecagt

11

3 ESQUEMAS DE VALIDACcedilAtildeO

31 Modelagem de dados

As aplicaccedilotildees podem realizar a mesma funcionalidade embora conforme as ideacuteias de Braganholo e Heuser seja completamente provaacutevel que os dados armazenados estejam modelados de forma diferente Ao citar que a modelagem estaacute diferente natildeo se refere aos campos com nomes distintos mas sim a todos os seguintes casos

Nomenclatura distinta de campos

Tipos distintos

Gravaccedilatildeo em formatos distintos

Modos de relacionamento entre os dados feitos de diferentes formas Exemplificando os trecircs primeiros casos acima posso citar o armazenamento

de um CPF (cadastro de pessoa fiacutesica) de cliente Ele pode ser armazenado com o nome de NUM_CPF ser do tipo numeacuterico ou pode ser armazenado com o nome de CPF_CLIENTE ser do tipo texto e ser armazenado com maacutescara Neste caso a mesma informaccedilatildeo pode ser extraiacuteda de ambas as bases de dados com o entendimento de forma intuitiva mas internamente foram modeladas de forma distinta

Baseado no problema acima pode-se entender o real significado da palavra intuiccedilatildeo embora o computador natildeo possua este entendimento O sistema que trabalha com o CPF na forma numeacuterica natildeo conseguiria abstrair uma informaccedilatildeo de um XML bem formado e vaacutelido cujo campo de CPF seja alfanumeacuterico Eacute neste ponto que a utilizaccedilatildeo do XSLT eacute funcionalmente adequada e antes de entrarmos no toacutepico de como fazer esta conversatildeo utilizando XSLT falaremos um pouco sobre o que eacute um documento XML bem formado e vaacutelido destacando os tipos de validaccedilotildees existentes

32 XML bem formado e vaacutelido

Segundo Myer (2005) existem dois tipos de ldquolegalidaderdquo de documentos XML documento bem formado e documento vaacutelido

Um documento XML bem formado segue as seguintes regras []

Um documento XML deve conter um uacutenico elemento raiz que contenham outros elementos

Todos os elementos devem ser corretamente aninhados

Todos os elementos devem ser fechados com uma tag ou com um ldquoauto-fechamentordquo de elemento vazio (por exemplo lttag gt)

Todos os valores de atributos devem ser citados Um documento XML vaacutelido eacute tanto bem formado quanto segue todas as regras explicitadas em um documento DTD (document type definition) Um documento vaacutelido entatildeo eacute nada mais que um documento bem formado vinculado a seu DTD (MYER 2005 Traduccedilatildeo nossa)

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 2: XML - Apostila Completa

SUMAacuteRIO

1 INTRODUCcedilAtildeO A LINGUAGEM XML 3

11 W3C 3

12 XML 3

13 XML x HTML 5

2 SINTAXE XML 6

21 Sintaxe HTML 6

22 Partes do documento 6

23 Elementos 7

24 Elementos do documento 7

25 Aninhamento de elementos 8

26 Atributos 8

27 Referecircncias de caractere e entidade 9

28 Instruccedilotildees de processamento 10

29 Comentaacuterio 10

210 Seccedilotildees CDATA 10

3 ESQUEMAS DE VALIDACcedilAtildeO 11

31 Modelagem de dados 11

32 XML bem formado e vaacutelido 11

33 Esquemas de validaccedilatildeo 12

34 DTD 14

341 Declaraccedilatildeo Interna 14

342 Declaraccedilatildeo Externa 14

343 Blocos de Construccedilatildeo de Documento XML 15

344 Elementos 16

345 Atributos 19

346 Entidades 22

35 XML Schema 24

351 Declaraccedilatildeo 24

352 O elemento Schema 24

353 Referenciando um Schema em um documento XML 25

354 Elementos XSD Simples 26

355 Elementos XSD Complexos 34

4 XSLT 46

41 XSLT e CSS 47

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis 47

43 Praacutetica do XSLT 49

431 Regras (Templates) 51

432 O elemento ltxslvalue-ofgt 52

433 O elemento ltxslfor-eachgt 53

434 O elemento ltxslsortgt 55

435 O elemento ltxslifgt 56

436 O elemento ltxslchoosegt 57

437 O elemento ltxslapply-templatesgt 59

438 O elemento ltxsloutputgt 60

439 O elemento ltxslvariablegt 60

3

1 INTRODUCcedilAtildeO A LINGUAGEM XML

11 W3C

World Wide Web Consortium (W3C) eacute um consoacutercio de vaacuterias empresas mundiais de tecnologia (aproximadamente 500 empresas) fundada por Tim Berners Lee no ano de 1994 com o objetivo de levar a Internet ao seu potencial maacuteximo atraveacutes de desenvolvimento de protocolos comuns e foacuteruns abertos que promovem a sua evoluccedilatildeo e garantem a sua interoperabilidade

O W3C desenvolve tecnologias ou melhor padrotildees para a criaccedilatildeo e a interpretaccedilatildeo dos conteuacutedos para a Internet Sites desenvolvidos segundo esses padrotildees podem ser acessados e visualizados por qualquer pessoa ou tecnologia independente do hardware ou do software utilizados por exemplo PC com Linux PDA com Windows CE entre outros exemplos

Apesar do W3C natildeo ser muito conhecido no Brasil seus padrotildees como Hyper Text Markup Language (HTML) Extensible Hypertext Markup Language (XHTML) Extensible Markup Language (XML) e Cascading Style Sheets (CSS) satildeo muito populares contudo em muitos casos satildeo usados de forma errocircnea devido ao natildeo conhecimento da especificaccedilatildeo Eacute da responsabilidade do desenvolvedor Web respeitar e seguir os padrotildees deste oacutergatildeo pois se assim natildeo fizer estaraacute impondo barreiras tecnoloacutegicas a diversas pessoas e com isto desestimulando e ateacute mesmo impedindo o acesso a suas paacuteginas

12 XML

121 Conceitos

Extensible Markup Language (XML) se tornou uma recomendaccedilatildeo da W3C no dia 10 de fevereiro de 1998 cujo objetivo seria a geraccedilatildeo de linguagens de marcaccedilatildeo para necessidades especiais

O W3C comeccedilou a trabalhar em um projeto de uma linguagem de marcaccedilatildeo que combinasse a flexibilidade do SGML (Standard Generalized Markup Language) com a simplicidade do HTML O principio do projeto era criar uma linguagem que pudesse ser lida por software e se integrar com as demais linguagens Sua filosofia seria incorporada por vaacuterios princiacutepios importantes

separaccedilatildeo do conteuacutedo e da formataccedilatildeo eacute uma linguagem cujo aspecto importante eacute o conteuacutedo A formataccedilatildeo poderia ser realizada por uma outra linguagem

possibilidade de criaccedilatildeo de tags sem limitaccedilatildeo o uso de tags pode ser altamente utilizado sem nenhuma limitaccedilatildeo contudo a estrutura deve ser respeitada e seguida

legibilidade tanto pelas pessoas quanto por maacutequinas a estrutura do XML eacute bem completa e ilimitada e ao mesmo tempo simples tornando de faacutecil leitura por pessoas

4

criaccedilatildeo de arquivos para validaccedilatildeo de estrutura arquivos de validaccedilatildeo a serem visto posteriormente neste estudo permitem verificar se um XML aleacutem de bem formado eacute tambeacutem vaacutelido de acordo com uma estrutura

interligaccedilatildeo sua utilizaccedilatildeo permite interligar SGBDs (Sistema de Gerenciamento de Banco de Dados) distintos

simplicidade

Existem linguagens baseadas em XML como RDF SMIL MathML NCL XSIL e SVG O SVG por exemplo eacute um formato graacutefico vetorial (graphics scalar vector) e o MathML eacute uma linguagem de marcaccedilatildeo desenvolvida para o aspecto matemaacutetico

122 Motivaccedilatildeo

Maioria dos formatos de troca de dados eram

proprietaacuterios (custo)

necessidades especiacuteficas (soluccedilatildeo especiacutefica)

binaacuterios (diferentes aplicaccedilotildees e plataformas)

123 Caracteriacutesticas

Provecirc uma forma baseada em texto

caractere eacute sua unidade principal

aplica uma estrutura baseada em aacutervore para armazenar a informaccedilatildeo

facilidade na ediccedilatildeo e manutenccedilatildeo

Foco na informaccedilatildeo

Simplicidade e legibilidade

Criaccedilatildeo de marcaccedilotildees sem limitaccedilatildeo

124 Vantagens e Desvantagens

Dentre as principais vantagens destacam-se

Formato legiacutevel para pessoas e maacutequinas

Suporta UNICODE permitindo que quase qualquer linguagem escrita possa ser comunicada

Representa a maioria das estruturas de dados da computaccedilatildeo registros listas e aacutervores

Seu proacuteprio formato descreve a estrutura e os nomes dos campos

Dentre algumas desvantagens destacam-se

Sintaxe cheia e redundante

A redundacircncia pode afetar a eficiecircncia atraveacutes do armazenamento alto e do custo de transmissatildeo

A interpretaccedilatildeo natildeo suporta diretamente tipos de dados

5

Mapear o XML em um paradigma relacional ou orientado a objetos eacute uma tarefa custosa entretanto o inverso eacute faacutecil

Algumas pessoas insistem em dizer que o XML pode ser utilizado para armazenamento de dados somente se o arquivo eacute de baixo volume Todavia este informaccedilatildeo natildeo eacute verdadeira grandes estruturas XML podem ser acessadas muito rapidamente

13 XML x HTML

Tanto o XML quanto o HTML satildeo linguagens derivadas do SGML O que alguns pensam eacute que o XML foi criado com o propoacutesito de substituir o HTML Isto natildeo eacute verdade e antes de comentarmos o porquecirc falaremos um pouco sobre o HTML

O HTML eacute uma linguagem de marcaccedilatildeo cujo objetivo eacute produzir paacuteginas na internet Suas tags consistem em uma marca de iniacutecio e outra de teacutermino suas marca de iniacutecio eacute simbolizada por lt e sua marca de teacutermino por gt

O XML funciona como o HTML possui tags de iniacutecio e teacutermino utiliza os mesmos siacutembolos todavia natildeo possui a maior caracteriacutestica do HTML tags preacute-estabelecidas O XML eacute amplo as tags satildeo ilimitadas e qualquer tag pode ser criada desde que a estrutura seja mantida

Enquanto o HTML eacute mais flexiacutevel permitindo que natildeo se feche algumas das tags o XML eacute altamente estruturado Isto indica que no XML ao criar uma tag deve-se obrigatoriamente fechaacute-la caso contraacuterio sua estrutura natildeo seraacute validada e o arquivo estaraacute invaacutelido problema que natildeo ocorre com o HTML no quais algumas de suas tags geralmente natildeo satildeo fechadas ou possuem alguma flexibilidade de estruturaccedilatildeo

6

2 SINTAXE XML

21 Sintaxe HTML Certamente vocecircs devem estar familiarizados com as tags de marcaccedilatildeo de

elementos HTML

ltH1 ALIGN=rsquoCENTERrsquogt Conteuacutedo do Elemento ltH1gt

Tag Inicial Conteuacutedo Tag Final

Elemento

A estrutura de marcaccedilatildeo do XML eacute basicamente a mesma que no HTML com a delimitaccedilatildeo de tags com o uso de lsquomenor quersquo (lt) e lsquomaior quersquo (gt)

Ex lth1gtOlaacutelth1gt

vaacutelido tanto na sintaxe HTML com na XML ltbrgt

invaacutelido na sintaxe XML todavia vaacutelido em HTML

22 Partes do documento

Um documento XML bem-formado compreende trecircs partes

Proacutelogo Opcional

Corpo Conteacutem um ou mais elementos na forma de uma aacutervore hieraacuterquica

Epiacutelogo Opcional

221 Proacutelogo

Um documento XML comeccedila com um proacutelogo O proacutelogo eacute usado para sinalizar o comeccedilo dos dados XML descrever seu meacutetodo de codificaccedilatildeo de caracteree apresentar algumas outras dicas de configuraccedilatildeo ao parser XML

O mais importante componente do proacutelogo eacute a declaraccedilatildeo XML

Todos os documento XML podem (e devem) comeccedilar com uma uacutenica declaraccedilatildeo XML Apesar da declaraccedilatildeo usar uma sintaxe similar a uma instruccedilatildeo de processamento tecnicamento falando dentro dos termos da recomendaccedilatildeo XML natildeo se trata de uma instruccedilatildeo Veja a sintaxe completa da declaraccedilatildeo XML

ltxml version=10 encoding=ISO-8859-1 standalone=yesgt

Os atributos definidos pela especificaccedilatildeo XML 10

version

obrigatoacuteria valor tem que ser 10 este atributo permite o suporte de futuras versotildees do XML

encoding

opcional O valor tem que ser uma codificaccedilatildeo de caractere legal como UTF-8 UTF-16 ou ISO-8859-1 (a

7

codificaccedilatildeo de latin1) Todos os parses XML devem oferecer suporte a pelo menos UTF-8 e UTF-16

standalone

opcional O valor tem que ser ldquoyesrdquo ou ldquonordquo onde ldquoyesldquo

significa que todas as declaraccedilotildees de entidade necessaacuterias estatildeo contidas no elemento e ldquonordquo significa que um DTD externo eacute necessaacuterio

23 Elementos

Os elementos satildeo blocos de construccedilatildeo baacutesicos de uma marcaccedilatildeo XML Eles podem conter outros elementos dados de caractere referecircncia de caractere referecircncias de entidade instruccedilotildees de processamento comentaacuterios eou seccedilotildees de CDATA Todos estes termos seratildeo abordados

Os elementos satildeo delimitados usando tags que consistem em nome de tipo de elemento fechada por um par de parecircnteses angulares (ldquolt gtrdquo)

Todo elemento deve conter uma tag inicial e outra tag final (que natildeo pode ser esquecida como no HTML)

lth1gtOlaacutelth1gt

vaacutelido ltbrgt

invaacutelido Deve ser ltbrgtltbrgt

Exceccedilatildeo uacutenica quando eacute um elemento sem conteuacutedo onde o elemento eacute representado por um par de tags inicialfinal ou usando-se uma forma hiacutebrida abreviada a tag de elemento vazia Ex

ltbrgt

invaacutelido ltbr gt

vaacutelido

Uma vez que representam objetos discretos os elementos podem ser considerados como ldquosubstantivosrdquo

24 Elementos do documento

Documentos XML bem-formados satildeo definidos como tendo a forma de uma aacutervore hieraacuterquica simples cada documento tendo um e somente um noacute raiz chamado de entidade do documento ou a raiz do documento

ltxml version=10gt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt

ltxml version=10gt ltpublicacoesgt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt ltpublicacoesgt

Invaacutelido Possui mais de uma raiz do documento

Vaacutelido Possui apenas uma raiz do documento

8

A raiz do documento conteacutem uma aacutervore de elementos secundaacuterios

chamado de elemento do documento

25 Aninhamento de elementos

XML impotildee um restriccedilatildeo-chave aos documentos ndash eles precisam estar apropriadamente aninhados

Veja em HTML um exemplo

ltBgtJoatildeo foi a ltIgtEscolaltBgt mas acabou perdendo a provaltIgt

Em uma sintaxe XML isto estaria invaacutelido pois os elementos devem estar aninhados O exemplo acima em uma sintaxe XML poderia ser representado como abaixo

ltBgtJoatildeo foi a ltIgtEscolaltIgtltBgtltIgt mas acabou perdendo a provaltIgt

26 Atributos

Se os elementos satildeo ldquosubstantivosrdquo entatildeo os atributos satildeo seus ldquoadjetivosrdquo

Frequumlentemente existe alguma informaccedilatildeo sobre um elemento que queremos anexar a ele ao contraacuterio da informaccedilatildeo que eacute contida no elemento Isto pode e deve ser feito utilizando atributos cada um composto de um par nome=valor utilizando um dos seguintes formatos

nome-atributo=valor-atributo utilizando aspas duplas nome-atributo=valor-atributo utilizando aspas simples

Os atributos precisam sempre ser delimitados utilizando aspas simples ou duplas

Devem sempre ser inseridos na tag inicial ou na tag hiacutebrida de elemento vazio Exemplo

ltpessoa nome=Ricardo Terra profissao=Professor gt

ltpessoa nome=Ricardo Terra profissao=Professorgt ltpessoagt

Somente uma apariccedilatildeo de um nome de atributo eacute permitida na mesma tag Por exempo o seguinte natildeo seria legal em XML uma vez que titulo aparece duas vezes

ltlivro titulo=XML Professional titulo=Iniciando XMLgtltlivrogt

Em HTML permite atributos numeacutericos como ltimg width=300gt ou atributos natildeo delimitados como ltfont face=Arialgt - poreacutem nenhum destes eacute permitido em XML

9

27 Referecircncias de caractere e entidade

Assim como no SGML e HTML o XML oferece dois meacutetodos simples de representar os dados que natildeo existem no conjunto de caracteres ASCII

Referecircncias de caractere

Referecircncias de entidade

271 Referecircncias de caractere

Representam um caractere exibiacutevel e satildeo compostas por um nuacutemero decimal ou hexadecimal precedido por strings literais ldquoamprdquo ou ldquoampxrdquo (respectivamente) e seguidos por um ponto-e-viacutergula ()

Exemplo amp169 (notaccedilatildeo decimal) ampxA9 (notaccedilatildeo hexadecimal)

Iratildeo exibir em um browser de visualizaccedilatildeo o caractere copy

272 Referecircncias de entidade

Permitem a inserccedilatildeo de qualquer string literal no conteuacutedo de elementos ou valores de atributo assim como oferecem alternativas mnemocircnicas para referecircncia de caracteres

Satildeo um nome legal para XML precedidas por um amp e seguidas de um ponto-e-viacutergula ()

Cinco identificadores satildeo definifidos como uma parte integral do XML e satildeo usadas como sequecircncia de escape para os caracteres delimitadores de marcaccedilatildeo do XML

Entidade Valor Uso ampamp amp Sempre utilizado para o escape do caractere amp (exceto em

seccedilotildees de CDATA) amplt lt Sempre utilizado para o escape do caractere lt (exceto em

seccedilotildees de CDATA) ampgt gt Sempre utilizado para o escape do caractere lt (ateacute mesmo

em seccedilotildees de CDATA) ampapos Pode ser usado no escape do caractere em strings literais ampquot Pode ser usado no escape do caractere em strings literais

Exemplos

ATampampT seraacute exibido ATampT

lttaggtampltlttaggt o o conteuacutedo da tag eacute lt que natildeo funcionaria assim lttaggtltlttaggt

ltlivro nome=O uso das aspas (ampquot) gt o O conteuacutedo da tag eacute O uso das aspas () que natildeo funcionaria se

fosse ltlivro nome=O uso das aspas () gt

10

28 Instruccedilotildees de processamento

Existem ocasiotildees em que eacute desejaacutevel poder passar dicas a uma aplicaccedilatildeo junto com o documento As instruccedilotildees de processamento (PIs ndash processing instructions) satildeo um mecanismo que o XML oferece para este propoacutesito

Os PIs utilizam uma sintaxe como a do elemento XML

lttarget hellipinstructionshellip gt

Uma utilizaccedilatildeo de PIs eacute na associaccedilatildeo de uma folha de estilos

ltxml-stylesheet hellip gt

29 Comentaacuterio

Pode ser uacutetil inserir notas ou comentaacuterios em um documento Estes comentaacuterios podem servir para revisatildeo histoacuterico ou qualquer outro metadados importantes contudo natildeo satildeo realmente parte do conteuacutedo de um documento

A sintaxe baacutesica de um comentaacuterio XML eacute

lt-- Comentaacuterio Qualquer --gt

Exemplos

lt-- XML de importaccedilatildeo criado por Ricardo Terra em 01jan2007 --gt ltbibliotecagt ltlivrogtltlivrogt lt-- Eis um livro --gt ltlivrogtltlivrogt lt-- Eis mais um livro --gt ltbibliotecagt

210 Seccedilotildees CDATA

Seccedilotildees CDATA satildeo um meacutetodo de inclusatildeo de texto que conteacutem caracteres que de outro forma seriam reconhecidos como marcaccedilatildeo

As seccedilotildees CDATA natildeo podem ser aninhadas e soacute devem ser utilizadas quando realmente necessaacuterio

A sintaxe baacutesica eacute

lt[CDATA[hellip]]gt onde pode ser qualquer string de caractere que natildeo seja ]]gt

Exemplo ltbibliotecagt ltlivrogt lt[CDATA[ltxml version=10gtltfaculdadegtltcurso nome=SIgtltfaculdadegt]]gt ltlivrogt ltbibliotecagt

11

3 ESQUEMAS DE VALIDACcedilAtildeO

31 Modelagem de dados

As aplicaccedilotildees podem realizar a mesma funcionalidade embora conforme as ideacuteias de Braganholo e Heuser seja completamente provaacutevel que os dados armazenados estejam modelados de forma diferente Ao citar que a modelagem estaacute diferente natildeo se refere aos campos com nomes distintos mas sim a todos os seguintes casos

Nomenclatura distinta de campos

Tipos distintos

Gravaccedilatildeo em formatos distintos

Modos de relacionamento entre os dados feitos de diferentes formas Exemplificando os trecircs primeiros casos acima posso citar o armazenamento

de um CPF (cadastro de pessoa fiacutesica) de cliente Ele pode ser armazenado com o nome de NUM_CPF ser do tipo numeacuterico ou pode ser armazenado com o nome de CPF_CLIENTE ser do tipo texto e ser armazenado com maacutescara Neste caso a mesma informaccedilatildeo pode ser extraiacuteda de ambas as bases de dados com o entendimento de forma intuitiva mas internamente foram modeladas de forma distinta

Baseado no problema acima pode-se entender o real significado da palavra intuiccedilatildeo embora o computador natildeo possua este entendimento O sistema que trabalha com o CPF na forma numeacuterica natildeo conseguiria abstrair uma informaccedilatildeo de um XML bem formado e vaacutelido cujo campo de CPF seja alfanumeacuterico Eacute neste ponto que a utilizaccedilatildeo do XSLT eacute funcionalmente adequada e antes de entrarmos no toacutepico de como fazer esta conversatildeo utilizando XSLT falaremos um pouco sobre o que eacute um documento XML bem formado e vaacutelido destacando os tipos de validaccedilotildees existentes

32 XML bem formado e vaacutelido

Segundo Myer (2005) existem dois tipos de ldquolegalidaderdquo de documentos XML documento bem formado e documento vaacutelido

Um documento XML bem formado segue as seguintes regras []

Um documento XML deve conter um uacutenico elemento raiz que contenham outros elementos

Todos os elementos devem ser corretamente aninhados

Todos os elementos devem ser fechados com uma tag ou com um ldquoauto-fechamentordquo de elemento vazio (por exemplo lttag gt)

Todos os valores de atributos devem ser citados Um documento XML vaacutelido eacute tanto bem formado quanto segue todas as regras explicitadas em um documento DTD (document type definition) Um documento vaacutelido entatildeo eacute nada mais que um documento bem formado vinculado a seu DTD (MYER 2005 Traduccedilatildeo nossa)

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 3: XML - Apostila Completa

355 Elementos XSD Complexos 34

4 XSLT 46

41 XSLT e CSS 47

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis 47

43 Praacutetica do XSLT 49

431 Regras (Templates) 51

432 O elemento ltxslvalue-ofgt 52

433 O elemento ltxslfor-eachgt 53

434 O elemento ltxslsortgt 55

435 O elemento ltxslifgt 56

436 O elemento ltxslchoosegt 57

437 O elemento ltxslapply-templatesgt 59

438 O elemento ltxsloutputgt 60

439 O elemento ltxslvariablegt 60

3

1 INTRODUCcedilAtildeO A LINGUAGEM XML

11 W3C

World Wide Web Consortium (W3C) eacute um consoacutercio de vaacuterias empresas mundiais de tecnologia (aproximadamente 500 empresas) fundada por Tim Berners Lee no ano de 1994 com o objetivo de levar a Internet ao seu potencial maacuteximo atraveacutes de desenvolvimento de protocolos comuns e foacuteruns abertos que promovem a sua evoluccedilatildeo e garantem a sua interoperabilidade

O W3C desenvolve tecnologias ou melhor padrotildees para a criaccedilatildeo e a interpretaccedilatildeo dos conteuacutedos para a Internet Sites desenvolvidos segundo esses padrotildees podem ser acessados e visualizados por qualquer pessoa ou tecnologia independente do hardware ou do software utilizados por exemplo PC com Linux PDA com Windows CE entre outros exemplos

Apesar do W3C natildeo ser muito conhecido no Brasil seus padrotildees como Hyper Text Markup Language (HTML) Extensible Hypertext Markup Language (XHTML) Extensible Markup Language (XML) e Cascading Style Sheets (CSS) satildeo muito populares contudo em muitos casos satildeo usados de forma errocircnea devido ao natildeo conhecimento da especificaccedilatildeo Eacute da responsabilidade do desenvolvedor Web respeitar e seguir os padrotildees deste oacutergatildeo pois se assim natildeo fizer estaraacute impondo barreiras tecnoloacutegicas a diversas pessoas e com isto desestimulando e ateacute mesmo impedindo o acesso a suas paacuteginas

12 XML

121 Conceitos

Extensible Markup Language (XML) se tornou uma recomendaccedilatildeo da W3C no dia 10 de fevereiro de 1998 cujo objetivo seria a geraccedilatildeo de linguagens de marcaccedilatildeo para necessidades especiais

O W3C comeccedilou a trabalhar em um projeto de uma linguagem de marcaccedilatildeo que combinasse a flexibilidade do SGML (Standard Generalized Markup Language) com a simplicidade do HTML O principio do projeto era criar uma linguagem que pudesse ser lida por software e se integrar com as demais linguagens Sua filosofia seria incorporada por vaacuterios princiacutepios importantes

separaccedilatildeo do conteuacutedo e da formataccedilatildeo eacute uma linguagem cujo aspecto importante eacute o conteuacutedo A formataccedilatildeo poderia ser realizada por uma outra linguagem

possibilidade de criaccedilatildeo de tags sem limitaccedilatildeo o uso de tags pode ser altamente utilizado sem nenhuma limitaccedilatildeo contudo a estrutura deve ser respeitada e seguida

legibilidade tanto pelas pessoas quanto por maacutequinas a estrutura do XML eacute bem completa e ilimitada e ao mesmo tempo simples tornando de faacutecil leitura por pessoas

4

criaccedilatildeo de arquivos para validaccedilatildeo de estrutura arquivos de validaccedilatildeo a serem visto posteriormente neste estudo permitem verificar se um XML aleacutem de bem formado eacute tambeacutem vaacutelido de acordo com uma estrutura

interligaccedilatildeo sua utilizaccedilatildeo permite interligar SGBDs (Sistema de Gerenciamento de Banco de Dados) distintos

simplicidade

Existem linguagens baseadas em XML como RDF SMIL MathML NCL XSIL e SVG O SVG por exemplo eacute um formato graacutefico vetorial (graphics scalar vector) e o MathML eacute uma linguagem de marcaccedilatildeo desenvolvida para o aspecto matemaacutetico

122 Motivaccedilatildeo

Maioria dos formatos de troca de dados eram

proprietaacuterios (custo)

necessidades especiacuteficas (soluccedilatildeo especiacutefica)

binaacuterios (diferentes aplicaccedilotildees e plataformas)

123 Caracteriacutesticas

Provecirc uma forma baseada em texto

caractere eacute sua unidade principal

aplica uma estrutura baseada em aacutervore para armazenar a informaccedilatildeo

facilidade na ediccedilatildeo e manutenccedilatildeo

Foco na informaccedilatildeo

Simplicidade e legibilidade

Criaccedilatildeo de marcaccedilotildees sem limitaccedilatildeo

124 Vantagens e Desvantagens

Dentre as principais vantagens destacam-se

Formato legiacutevel para pessoas e maacutequinas

Suporta UNICODE permitindo que quase qualquer linguagem escrita possa ser comunicada

Representa a maioria das estruturas de dados da computaccedilatildeo registros listas e aacutervores

Seu proacuteprio formato descreve a estrutura e os nomes dos campos

Dentre algumas desvantagens destacam-se

Sintaxe cheia e redundante

A redundacircncia pode afetar a eficiecircncia atraveacutes do armazenamento alto e do custo de transmissatildeo

A interpretaccedilatildeo natildeo suporta diretamente tipos de dados

5

Mapear o XML em um paradigma relacional ou orientado a objetos eacute uma tarefa custosa entretanto o inverso eacute faacutecil

Algumas pessoas insistem em dizer que o XML pode ser utilizado para armazenamento de dados somente se o arquivo eacute de baixo volume Todavia este informaccedilatildeo natildeo eacute verdadeira grandes estruturas XML podem ser acessadas muito rapidamente

13 XML x HTML

Tanto o XML quanto o HTML satildeo linguagens derivadas do SGML O que alguns pensam eacute que o XML foi criado com o propoacutesito de substituir o HTML Isto natildeo eacute verdade e antes de comentarmos o porquecirc falaremos um pouco sobre o HTML

O HTML eacute uma linguagem de marcaccedilatildeo cujo objetivo eacute produzir paacuteginas na internet Suas tags consistem em uma marca de iniacutecio e outra de teacutermino suas marca de iniacutecio eacute simbolizada por lt e sua marca de teacutermino por gt

O XML funciona como o HTML possui tags de iniacutecio e teacutermino utiliza os mesmos siacutembolos todavia natildeo possui a maior caracteriacutestica do HTML tags preacute-estabelecidas O XML eacute amplo as tags satildeo ilimitadas e qualquer tag pode ser criada desde que a estrutura seja mantida

Enquanto o HTML eacute mais flexiacutevel permitindo que natildeo se feche algumas das tags o XML eacute altamente estruturado Isto indica que no XML ao criar uma tag deve-se obrigatoriamente fechaacute-la caso contraacuterio sua estrutura natildeo seraacute validada e o arquivo estaraacute invaacutelido problema que natildeo ocorre com o HTML no quais algumas de suas tags geralmente natildeo satildeo fechadas ou possuem alguma flexibilidade de estruturaccedilatildeo

6

2 SINTAXE XML

21 Sintaxe HTML Certamente vocecircs devem estar familiarizados com as tags de marcaccedilatildeo de

elementos HTML

ltH1 ALIGN=rsquoCENTERrsquogt Conteuacutedo do Elemento ltH1gt

Tag Inicial Conteuacutedo Tag Final

Elemento

A estrutura de marcaccedilatildeo do XML eacute basicamente a mesma que no HTML com a delimitaccedilatildeo de tags com o uso de lsquomenor quersquo (lt) e lsquomaior quersquo (gt)

Ex lth1gtOlaacutelth1gt

vaacutelido tanto na sintaxe HTML com na XML ltbrgt

invaacutelido na sintaxe XML todavia vaacutelido em HTML

22 Partes do documento

Um documento XML bem-formado compreende trecircs partes

Proacutelogo Opcional

Corpo Conteacutem um ou mais elementos na forma de uma aacutervore hieraacuterquica

Epiacutelogo Opcional

221 Proacutelogo

Um documento XML comeccedila com um proacutelogo O proacutelogo eacute usado para sinalizar o comeccedilo dos dados XML descrever seu meacutetodo de codificaccedilatildeo de caracteree apresentar algumas outras dicas de configuraccedilatildeo ao parser XML

O mais importante componente do proacutelogo eacute a declaraccedilatildeo XML

Todos os documento XML podem (e devem) comeccedilar com uma uacutenica declaraccedilatildeo XML Apesar da declaraccedilatildeo usar uma sintaxe similar a uma instruccedilatildeo de processamento tecnicamento falando dentro dos termos da recomendaccedilatildeo XML natildeo se trata de uma instruccedilatildeo Veja a sintaxe completa da declaraccedilatildeo XML

ltxml version=10 encoding=ISO-8859-1 standalone=yesgt

Os atributos definidos pela especificaccedilatildeo XML 10

version

obrigatoacuteria valor tem que ser 10 este atributo permite o suporte de futuras versotildees do XML

encoding

opcional O valor tem que ser uma codificaccedilatildeo de caractere legal como UTF-8 UTF-16 ou ISO-8859-1 (a

7

codificaccedilatildeo de latin1) Todos os parses XML devem oferecer suporte a pelo menos UTF-8 e UTF-16

standalone

opcional O valor tem que ser ldquoyesrdquo ou ldquonordquo onde ldquoyesldquo

significa que todas as declaraccedilotildees de entidade necessaacuterias estatildeo contidas no elemento e ldquonordquo significa que um DTD externo eacute necessaacuterio

23 Elementos

Os elementos satildeo blocos de construccedilatildeo baacutesicos de uma marcaccedilatildeo XML Eles podem conter outros elementos dados de caractere referecircncia de caractere referecircncias de entidade instruccedilotildees de processamento comentaacuterios eou seccedilotildees de CDATA Todos estes termos seratildeo abordados

Os elementos satildeo delimitados usando tags que consistem em nome de tipo de elemento fechada por um par de parecircnteses angulares (ldquolt gtrdquo)

Todo elemento deve conter uma tag inicial e outra tag final (que natildeo pode ser esquecida como no HTML)

lth1gtOlaacutelth1gt

vaacutelido ltbrgt

invaacutelido Deve ser ltbrgtltbrgt

Exceccedilatildeo uacutenica quando eacute um elemento sem conteuacutedo onde o elemento eacute representado por um par de tags inicialfinal ou usando-se uma forma hiacutebrida abreviada a tag de elemento vazia Ex

ltbrgt

invaacutelido ltbr gt

vaacutelido

Uma vez que representam objetos discretos os elementos podem ser considerados como ldquosubstantivosrdquo

24 Elementos do documento

Documentos XML bem-formados satildeo definidos como tendo a forma de uma aacutervore hieraacuterquica simples cada documento tendo um e somente um noacute raiz chamado de entidade do documento ou a raiz do documento

ltxml version=10gt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt

ltxml version=10gt ltpublicacoesgt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt ltpublicacoesgt

Invaacutelido Possui mais de uma raiz do documento

Vaacutelido Possui apenas uma raiz do documento

8

A raiz do documento conteacutem uma aacutervore de elementos secundaacuterios

chamado de elemento do documento

25 Aninhamento de elementos

XML impotildee um restriccedilatildeo-chave aos documentos ndash eles precisam estar apropriadamente aninhados

Veja em HTML um exemplo

ltBgtJoatildeo foi a ltIgtEscolaltBgt mas acabou perdendo a provaltIgt

Em uma sintaxe XML isto estaria invaacutelido pois os elementos devem estar aninhados O exemplo acima em uma sintaxe XML poderia ser representado como abaixo

ltBgtJoatildeo foi a ltIgtEscolaltIgtltBgtltIgt mas acabou perdendo a provaltIgt

26 Atributos

Se os elementos satildeo ldquosubstantivosrdquo entatildeo os atributos satildeo seus ldquoadjetivosrdquo

Frequumlentemente existe alguma informaccedilatildeo sobre um elemento que queremos anexar a ele ao contraacuterio da informaccedilatildeo que eacute contida no elemento Isto pode e deve ser feito utilizando atributos cada um composto de um par nome=valor utilizando um dos seguintes formatos

nome-atributo=valor-atributo utilizando aspas duplas nome-atributo=valor-atributo utilizando aspas simples

Os atributos precisam sempre ser delimitados utilizando aspas simples ou duplas

Devem sempre ser inseridos na tag inicial ou na tag hiacutebrida de elemento vazio Exemplo

ltpessoa nome=Ricardo Terra profissao=Professor gt

ltpessoa nome=Ricardo Terra profissao=Professorgt ltpessoagt

Somente uma apariccedilatildeo de um nome de atributo eacute permitida na mesma tag Por exempo o seguinte natildeo seria legal em XML uma vez que titulo aparece duas vezes

ltlivro titulo=XML Professional titulo=Iniciando XMLgtltlivrogt

Em HTML permite atributos numeacutericos como ltimg width=300gt ou atributos natildeo delimitados como ltfont face=Arialgt - poreacutem nenhum destes eacute permitido em XML

9

27 Referecircncias de caractere e entidade

Assim como no SGML e HTML o XML oferece dois meacutetodos simples de representar os dados que natildeo existem no conjunto de caracteres ASCII

Referecircncias de caractere

Referecircncias de entidade

271 Referecircncias de caractere

Representam um caractere exibiacutevel e satildeo compostas por um nuacutemero decimal ou hexadecimal precedido por strings literais ldquoamprdquo ou ldquoampxrdquo (respectivamente) e seguidos por um ponto-e-viacutergula ()

Exemplo amp169 (notaccedilatildeo decimal) ampxA9 (notaccedilatildeo hexadecimal)

Iratildeo exibir em um browser de visualizaccedilatildeo o caractere copy

272 Referecircncias de entidade

Permitem a inserccedilatildeo de qualquer string literal no conteuacutedo de elementos ou valores de atributo assim como oferecem alternativas mnemocircnicas para referecircncia de caracteres

Satildeo um nome legal para XML precedidas por um amp e seguidas de um ponto-e-viacutergula ()

Cinco identificadores satildeo definifidos como uma parte integral do XML e satildeo usadas como sequecircncia de escape para os caracteres delimitadores de marcaccedilatildeo do XML

Entidade Valor Uso ampamp amp Sempre utilizado para o escape do caractere amp (exceto em

seccedilotildees de CDATA) amplt lt Sempre utilizado para o escape do caractere lt (exceto em

seccedilotildees de CDATA) ampgt gt Sempre utilizado para o escape do caractere lt (ateacute mesmo

em seccedilotildees de CDATA) ampapos Pode ser usado no escape do caractere em strings literais ampquot Pode ser usado no escape do caractere em strings literais

Exemplos

ATampampT seraacute exibido ATampT

lttaggtampltlttaggt o o conteuacutedo da tag eacute lt que natildeo funcionaria assim lttaggtltlttaggt

ltlivro nome=O uso das aspas (ampquot) gt o O conteuacutedo da tag eacute O uso das aspas () que natildeo funcionaria se

fosse ltlivro nome=O uso das aspas () gt

10

28 Instruccedilotildees de processamento

Existem ocasiotildees em que eacute desejaacutevel poder passar dicas a uma aplicaccedilatildeo junto com o documento As instruccedilotildees de processamento (PIs ndash processing instructions) satildeo um mecanismo que o XML oferece para este propoacutesito

Os PIs utilizam uma sintaxe como a do elemento XML

lttarget hellipinstructionshellip gt

Uma utilizaccedilatildeo de PIs eacute na associaccedilatildeo de uma folha de estilos

ltxml-stylesheet hellip gt

29 Comentaacuterio

Pode ser uacutetil inserir notas ou comentaacuterios em um documento Estes comentaacuterios podem servir para revisatildeo histoacuterico ou qualquer outro metadados importantes contudo natildeo satildeo realmente parte do conteuacutedo de um documento

A sintaxe baacutesica de um comentaacuterio XML eacute

lt-- Comentaacuterio Qualquer --gt

Exemplos

lt-- XML de importaccedilatildeo criado por Ricardo Terra em 01jan2007 --gt ltbibliotecagt ltlivrogtltlivrogt lt-- Eis um livro --gt ltlivrogtltlivrogt lt-- Eis mais um livro --gt ltbibliotecagt

210 Seccedilotildees CDATA

Seccedilotildees CDATA satildeo um meacutetodo de inclusatildeo de texto que conteacutem caracteres que de outro forma seriam reconhecidos como marcaccedilatildeo

As seccedilotildees CDATA natildeo podem ser aninhadas e soacute devem ser utilizadas quando realmente necessaacuterio

A sintaxe baacutesica eacute

lt[CDATA[hellip]]gt onde pode ser qualquer string de caractere que natildeo seja ]]gt

Exemplo ltbibliotecagt ltlivrogt lt[CDATA[ltxml version=10gtltfaculdadegtltcurso nome=SIgtltfaculdadegt]]gt ltlivrogt ltbibliotecagt

11

3 ESQUEMAS DE VALIDACcedilAtildeO

31 Modelagem de dados

As aplicaccedilotildees podem realizar a mesma funcionalidade embora conforme as ideacuteias de Braganholo e Heuser seja completamente provaacutevel que os dados armazenados estejam modelados de forma diferente Ao citar que a modelagem estaacute diferente natildeo se refere aos campos com nomes distintos mas sim a todos os seguintes casos

Nomenclatura distinta de campos

Tipos distintos

Gravaccedilatildeo em formatos distintos

Modos de relacionamento entre os dados feitos de diferentes formas Exemplificando os trecircs primeiros casos acima posso citar o armazenamento

de um CPF (cadastro de pessoa fiacutesica) de cliente Ele pode ser armazenado com o nome de NUM_CPF ser do tipo numeacuterico ou pode ser armazenado com o nome de CPF_CLIENTE ser do tipo texto e ser armazenado com maacutescara Neste caso a mesma informaccedilatildeo pode ser extraiacuteda de ambas as bases de dados com o entendimento de forma intuitiva mas internamente foram modeladas de forma distinta

Baseado no problema acima pode-se entender o real significado da palavra intuiccedilatildeo embora o computador natildeo possua este entendimento O sistema que trabalha com o CPF na forma numeacuterica natildeo conseguiria abstrair uma informaccedilatildeo de um XML bem formado e vaacutelido cujo campo de CPF seja alfanumeacuterico Eacute neste ponto que a utilizaccedilatildeo do XSLT eacute funcionalmente adequada e antes de entrarmos no toacutepico de como fazer esta conversatildeo utilizando XSLT falaremos um pouco sobre o que eacute um documento XML bem formado e vaacutelido destacando os tipos de validaccedilotildees existentes

32 XML bem formado e vaacutelido

Segundo Myer (2005) existem dois tipos de ldquolegalidaderdquo de documentos XML documento bem formado e documento vaacutelido

Um documento XML bem formado segue as seguintes regras []

Um documento XML deve conter um uacutenico elemento raiz que contenham outros elementos

Todos os elementos devem ser corretamente aninhados

Todos os elementos devem ser fechados com uma tag ou com um ldquoauto-fechamentordquo de elemento vazio (por exemplo lttag gt)

Todos os valores de atributos devem ser citados Um documento XML vaacutelido eacute tanto bem formado quanto segue todas as regras explicitadas em um documento DTD (document type definition) Um documento vaacutelido entatildeo eacute nada mais que um documento bem formado vinculado a seu DTD (MYER 2005 Traduccedilatildeo nossa)

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 4: XML - Apostila Completa

3

1 INTRODUCcedilAtildeO A LINGUAGEM XML

11 W3C

World Wide Web Consortium (W3C) eacute um consoacutercio de vaacuterias empresas mundiais de tecnologia (aproximadamente 500 empresas) fundada por Tim Berners Lee no ano de 1994 com o objetivo de levar a Internet ao seu potencial maacuteximo atraveacutes de desenvolvimento de protocolos comuns e foacuteruns abertos que promovem a sua evoluccedilatildeo e garantem a sua interoperabilidade

O W3C desenvolve tecnologias ou melhor padrotildees para a criaccedilatildeo e a interpretaccedilatildeo dos conteuacutedos para a Internet Sites desenvolvidos segundo esses padrotildees podem ser acessados e visualizados por qualquer pessoa ou tecnologia independente do hardware ou do software utilizados por exemplo PC com Linux PDA com Windows CE entre outros exemplos

Apesar do W3C natildeo ser muito conhecido no Brasil seus padrotildees como Hyper Text Markup Language (HTML) Extensible Hypertext Markup Language (XHTML) Extensible Markup Language (XML) e Cascading Style Sheets (CSS) satildeo muito populares contudo em muitos casos satildeo usados de forma errocircnea devido ao natildeo conhecimento da especificaccedilatildeo Eacute da responsabilidade do desenvolvedor Web respeitar e seguir os padrotildees deste oacutergatildeo pois se assim natildeo fizer estaraacute impondo barreiras tecnoloacutegicas a diversas pessoas e com isto desestimulando e ateacute mesmo impedindo o acesso a suas paacuteginas

12 XML

121 Conceitos

Extensible Markup Language (XML) se tornou uma recomendaccedilatildeo da W3C no dia 10 de fevereiro de 1998 cujo objetivo seria a geraccedilatildeo de linguagens de marcaccedilatildeo para necessidades especiais

O W3C comeccedilou a trabalhar em um projeto de uma linguagem de marcaccedilatildeo que combinasse a flexibilidade do SGML (Standard Generalized Markup Language) com a simplicidade do HTML O principio do projeto era criar uma linguagem que pudesse ser lida por software e se integrar com as demais linguagens Sua filosofia seria incorporada por vaacuterios princiacutepios importantes

separaccedilatildeo do conteuacutedo e da formataccedilatildeo eacute uma linguagem cujo aspecto importante eacute o conteuacutedo A formataccedilatildeo poderia ser realizada por uma outra linguagem

possibilidade de criaccedilatildeo de tags sem limitaccedilatildeo o uso de tags pode ser altamente utilizado sem nenhuma limitaccedilatildeo contudo a estrutura deve ser respeitada e seguida

legibilidade tanto pelas pessoas quanto por maacutequinas a estrutura do XML eacute bem completa e ilimitada e ao mesmo tempo simples tornando de faacutecil leitura por pessoas

4

criaccedilatildeo de arquivos para validaccedilatildeo de estrutura arquivos de validaccedilatildeo a serem visto posteriormente neste estudo permitem verificar se um XML aleacutem de bem formado eacute tambeacutem vaacutelido de acordo com uma estrutura

interligaccedilatildeo sua utilizaccedilatildeo permite interligar SGBDs (Sistema de Gerenciamento de Banco de Dados) distintos

simplicidade

Existem linguagens baseadas em XML como RDF SMIL MathML NCL XSIL e SVG O SVG por exemplo eacute um formato graacutefico vetorial (graphics scalar vector) e o MathML eacute uma linguagem de marcaccedilatildeo desenvolvida para o aspecto matemaacutetico

122 Motivaccedilatildeo

Maioria dos formatos de troca de dados eram

proprietaacuterios (custo)

necessidades especiacuteficas (soluccedilatildeo especiacutefica)

binaacuterios (diferentes aplicaccedilotildees e plataformas)

123 Caracteriacutesticas

Provecirc uma forma baseada em texto

caractere eacute sua unidade principal

aplica uma estrutura baseada em aacutervore para armazenar a informaccedilatildeo

facilidade na ediccedilatildeo e manutenccedilatildeo

Foco na informaccedilatildeo

Simplicidade e legibilidade

Criaccedilatildeo de marcaccedilotildees sem limitaccedilatildeo

124 Vantagens e Desvantagens

Dentre as principais vantagens destacam-se

Formato legiacutevel para pessoas e maacutequinas

Suporta UNICODE permitindo que quase qualquer linguagem escrita possa ser comunicada

Representa a maioria das estruturas de dados da computaccedilatildeo registros listas e aacutervores

Seu proacuteprio formato descreve a estrutura e os nomes dos campos

Dentre algumas desvantagens destacam-se

Sintaxe cheia e redundante

A redundacircncia pode afetar a eficiecircncia atraveacutes do armazenamento alto e do custo de transmissatildeo

A interpretaccedilatildeo natildeo suporta diretamente tipos de dados

5

Mapear o XML em um paradigma relacional ou orientado a objetos eacute uma tarefa custosa entretanto o inverso eacute faacutecil

Algumas pessoas insistem em dizer que o XML pode ser utilizado para armazenamento de dados somente se o arquivo eacute de baixo volume Todavia este informaccedilatildeo natildeo eacute verdadeira grandes estruturas XML podem ser acessadas muito rapidamente

13 XML x HTML

Tanto o XML quanto o HTML satildeo linguagens derivadas do SGML O que alguns pensam eacute que o XML foi criado com o propoacutesito de substituir o HTML Isto natildeo eacute verdade e antes de comentarmos o porquecirc falaremos um pouco sobre o HTML

O HTML eacute uma linguagem de marcaccedilatildeo cujo objetivo eacute produzir paacuteginas na internet Suas tags consistem em uma marca de iniacutecio e outra de teacutermino suas marca de iniacutecio eacute simbolizada por lt e sua marca de teacutermino por gt

O XML funciona como o HTML possui tags de iniacutecio e teacutermino utiliza os mesmos siacutembolos todavia natildeo possui a maior caracteriacutestica do HTML tags preacute-estabelecidas O XML eacute amplo as tags satildeo ilimitadas e qualquer tag pode ser criada desde que a estrutura seja mantida

Enquanto o HTML eacute mais flexiacutevel permitindo que natildeo se feche algumas das tags o XML eacute altamente estruturado Isto indica que no XML ao criar uma tag deve-se obrigatoriamente fechaacute-la caso contraacuterio sua estrutura natildeo seraacute validada e o arquivo estaraacute invaacutelido problema que natildeo ocorre com o HTML no quais algumas de suas tags geralmente natildeo satildeo fechadas ou possuem alguma flexibilidade de estruturaccedilatildeo

6

2 SINTAXE XML

21 Sintaxe HTML Certamente vocecircs devem estar familiarizados com as tags de marcaccedilatildeo de

elementos HTML

ltH1 ALIGN=rsquoCENTERrsquogt Conteuacutedo do Elemento ltH1gt

Tag Inicial Conteuacutedo Tag Final

Elemento

A estrutura de marcaccedilatildeo do XML eacute basicamente a mesma que no HTML com a delimitaccedilatildeo de tags com o uso de lsquomenor quersquo (lt) e lsquomaior quersquo (gt)

Ex lth1gtOlaacutelth1gt

vaacutelido tanto na sintaxe HTML com na XML ltbrgt

invaacutelido na sintaxe XML todavia vaacutelido em HTML

22 Partes do documento

Um documento XML bem-formado compreende trecircs partes

Proacutelogo Opcional

Corpo Conteacutem um ou mais elementos na forma de uma aacutervore hieraacuterquica

Epiacutelogo Opcional

221 Proacutelogo

Um documento XML comeccedila com um proacutelogo O proacutelogo eacute usado para sinalizar o comeccedilo dos dados XML descrever seu meacutetodo de codificaccedilatildeo de caracteree apresentar algumas outras dicas de configuraccedilatildeo ao parser XML

O mais importante componente do proacutelogo eacute a declaraccedilatildeo XML

Todos os documento XML podem (e devem) comeccedilar com uma uacutenica declaraccedilatildeo XML Apesar da declaraccedilatildeo usar uma sintaxe similar a uma instruccedilatildeo de processamento tecnicamento falando dentro dos termos da recomendaccedilatildeo XML natildeo se trata de uma instruccedilatildeo Veja a sintaxe completa da declaraccedilatildeo XML

ltxml version=10 encoding=ISO-8859-1 standalone=yesgt

Os atributos definidos pela especificaccedilatildeo XML 10

version

obrigatoacuteria valor tem que ser 10 este atributo permite o suporte de futuras versotildees do XML

encoding

opcional O valor tem que ser uma codificaccedilatildeo de caractere legal como UTF-8 UTF-16 ou ISO-8859-1 (a

7

codificaccedilatildeo de latin1) Todos os parses XML devem oferecer suporte a pelo menos UTF-8 e UTF-16

standalone

opcional O valor tem que ser ldquoyesrdquo ou ldquonordquo onde ldquoyesldquo

significa que todas as declaraccedilotildees de entidade necessaacuterias estatildeo contidas no elemento e ldquonordquo significa que um DTD externo eacute necessaacuterio

23 Elementos

Os elementos satildeo blocos de construccedilatildeo baacutesicos de uma marcaccedilatildeo XML Eles podem conter outros elementos dados de caractere referecircncia de caractere referecircncias de entidade instruccedilotildees de processamento comentaacuterios eou seccedilotildees de CDATA Todos estes termos seratildeo abordados

Os elementos satildeo delimitados usando tags que consistem em nome de tipo de elemento fechada por um par de parecircnteses angulares (ldquolt gtrdquo)

Todo elemento deve conter uma tag inicial e outra tag final (que natildeo pode ser esquecida como no HTML)

lth1gtOlaacutelth1gt

vaacutelido ltbrgt

invaacutelido Deve ser ltbrgtltbrgt

Exceccedilatildeo uacutenica quando eacute um elemento sem conteuacutedo onde o elemento eacute representado por um par de tags inicialfinal ou usando-se uma forma hiacutebrida abreviada a tag de elemento vazia Ex

ltbrgt

invaacutelido ltbr gt

vaacutelido

Uma vez que representam objetos discretos os elementos podem ser considerados como ldquosubstantivosrdquo

24 Elementos do documento

Documentos XML bem-formados satildeo definidos como tendo a forma de uma aacutervore hieraacuterquica simples cada documento tendo um e somente um noacute raiz chamado de entidade do documento ou a raiz do documento

ltxml version=10gt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt

ltxml version=10gt ltpublicacoesgt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt ltpublicacoesgt

Invaacutelido Possui mais de uma raiz do documento

Vaacutelido Possui apenas uma raiz do documento

8

A raiz do documento conteacutem uma aacutervore de elementos secundaacuterios

chamado de elemento do documento

25 Aninhamento de elementos

XML impotildee um restriccedilatildeo-chave aos documentos ndash eles precisam estar apropriadamente aninhados

Veja em HTML um exemplo

ltBgtJoatildeo foi a ltIgtEscolaltBgt mas acabou perdendo a provaltIgt

Em uma sintaxe XML isto estaria invaacutelido pois os elementos devem estar aninhados O exemplo acima em uma sintaxe XML poderia ser representado como abaixo

ltBgtJoatildeo foi a ltIgtEscolaltIgtltBgtltIgt mas acabou perdendo a provaltIgt

26 Atributos

Se os elementos satildeo ldquosubstantivosrdquo entatildeo os atributos satildeo seus ldquoadjetivosrdquo

Frequumlentemente existe alguma informaccedilatildeo sobre um elemento que queremos anexar a ele ao contraacuterio da informaccedilatildeo que eacute contida no elemento Isto pode e deve ser feito utilizando atributos cada um composto de um par nome=valor utilizando um dos seguintes formatos

nome-atributo=valor-atributo utilizando aspas duplas nome-atributo=valor-atributo utilizando aspas simples

Os atributos precisam sempre ser delimitados utilizando aspas simples ou duplas

Devem sempre ser inseridos na tag inicial ou na tag hiacutebrida de elemento vazio Exemplo

ltpessoa nome=Ricardo Terra profissao=Professor gt

ltpessoa nome=Ricardo Terra profissao=Professorgt ltpessoagt

Somente uma apariccedilatildeo de um nome de atributo eacute permitida na mesma tag Por exempo o seguinte natildeo seria legal em XML uma vez que titulo aparece duas vezes

ltlivro titulo=XML Professional titulo=Iniciando XMLgtltlivrogt

Em HTML permite atributos numeacutericos como ltimg width=300gt ou atributos natildeo delimitados como ltfont face=Arialgt - poreacutem nenhum destes eacute permitido em XML

9

27 Referecircncias de caractere e entidade

Assim como no SGML e HTML o XML oferece dois meacutetodos simples de representar os dados que natildeo existem no conjunto de caracteres ASCII

Referecircncias de caractere

Referecircncias de entidade

271 Referecircncias de caractere

Representam um caractere exibiacutevel e satildeo compostas por um nuacutemero decimal ou hexadecimal precedido por strings literais ldquoamprdquo ou ldquoampxrdquo (respectivamente) e seguidos por um ponto-e-viacutergula ()

Exemplo amp169 (notaccedilatildeo decimal) ampxA9 (notaccedilatildeo hexadecimal)

Iratildeo exibir em um browser de visualizaccedilatildeo o caractere copy

272 Referecircncias de entidade

Permitem a inserccedilatildeo de qualquer string literal no conteuacutedo de elementos ou valores de atributo assim como oferecem alternativas mnemocircnicas para referecircncia de caracteres

Satildeo um nome legal para XML precedidas por um amp e seguidas de um ponto-e-viacutergula ()

Cinco identificadores satildeo definifidos como uma parte integral do XML e satildeo usadas como sequecircncia de escape para os caracteres delimitadores de marcaccedilatildeo do XML

Entidade Valor Uso ampamp amp Sempre utilizado para o escape do caractere amp (exceto em

seccedilotildees de CDATA) amplt lt Sempre utilizado para o escape do caractere lt (exceto em

seccedilotildees de CDATA) ampgt gt Sempre utilizado para o escape do caractere lt (ateacute mesmo

em seccedilotildees de CDATA) ampapos Pode ser usado no escape do caractere em strings literais ampquot Pode ser usado no escape do caractere em strings literais

Exemplos

ATampampT seraacute exibido ATampT

lttaggtampltlttaggt o o conteuacutedo da tag eacute lt que natildeo funcionaria assim lttaggtltlttaggt

ltlivro nome=O uso das aspas (ampquot) gt o O conteuacutedo da tag eacute O uso das aspas () que natildeo funcionaria se

fosse ltlivro nome=O uso das aspas () gt

10

28 Instruccedilotildees de processamento

Existem ocasiotildees em que eacute desejaacutevel poder passar dicas a uma aplicaccedilatildeo junto com o documento As instruccedilotildees de processamento (PIs ndash processing instructions) satildeo um mecanismo que o XML oferece para este propoacutesito

Os PIs utilizam uma sintaxe como a do elemento XML

lttarget hellipinstructionshellip gt

Uma utilizaccedilatildeo de PIs eacute na associaccedilatildeo de uma folha de estilos

ltxml-stylesheet hellip gt

29 Comentaacuterio

Pode ser uacutetil inserir notas ou comentaacuterios em um documento Estes comentaacuterios podem servir para revisatildeo histoacuterico ou qualquer outro metadados importantes contudo natildeo satildeo realmente parte do conteuacutedo de um documento

A sintaxe baacutesica de um comentaacuterio XML eacute

lt-- Comentaacuterio Qualquer --gt

Exemplos

lt-- XML de importaccedilatildeo criado por Ricardo Terra em 01jan2007 --gt ltbibliotecagt ltlivrogtltlivrogt lt-- Eis um livro --gt ltlivrogtltlivrogt lt-- Eis mais um livro --gt ltbibliotecagt

210 Seccedilotildees CDATA

Seccedilotildees CDATA satildeo um meacutetodo de inclusatildeo de texto que conteacutem caracteres que de outro forma seriam reconhecidos como marcaccedilatildeo

As seccedilotildees CDATA natildeo podem ser aninhadas e soacute devem ser utilizadas quando realmente necessaacuterio

A sintaxe baacutesica eacute

lt[CDATA[hellip]]gt onde pode ser qualquer string de caractere que natildeo seja ]]gt

Exemplo ltbibliotecagt ltlivrogt lt[CDATA[ltxml version=10gtltfaculdadegtltcurso nome=SIgtltfaculdadegt]]gt ltlivrogt ltbibliotecagt

11

3 ESQUEMAS DE VALIDACcedilAtildeO

31 Modelagem de dados

As aplicaccedilotildees podem realizar a mesma funcionalidade embora conforme as ideacuteias de Braganholo e Heuser seja completamente provaacutevel que os dados armazenados estejam modelados de forma diferente Ao citar que a modelagem estaacute diferente natildeo se refere aos campos com nomes distintos mas sim a todos os seguintes casos

Nomenclatura distinta de campos

Tipos distintos

Gravaccedilatildeo em formatos distintos

Modos de relacionamento entre os dados feitos de diferentes formas Exemplificando os trecircs primeiros casos acima posso citar o armazenamento

de um CPF (cadastro de pessoa fiacutesica) de cliente Ele pode ser armazenado com o nome de NUM_CPF ser do tipo numeacuterico ou pode ser armazenado com o nome de CPF_CLIENTE ser do tipo texto e ser armazenado com maacutescara Neste caso a mesma informaccedilatildeo pode ser extraiacuteda de ambas as bases de dados com o entendimento de forma intuitiva mas internamente foram modeladas de forma distinta

Baseado no problema acima pode-se entender o real significado da palavra intuiccedilatildeo embora o computador natildeo possua este entendimento O sistema que trabalha com o CPF na forma numeacuterica natildeo conseguiria abstrair uma informaccedilatildeo de um XML bem formado e vaacutelido cujo campo de CPF seja alfanumeacuterico Eacute neste ponto que a utilizaccedilatildeo do XSLT eacute funcionalmente adequada e antes de entrarmos no toacutepico de como fazer esta conversatildeo utilizando XSLT falaremos um pouco sobre o que eacute um documento XML bem formado e vaacutelido destacando os tipos de validaccedilotildees existentes

32 XML bem formado e vaacutelido

Segundo Myer (2005) existem dois tipos de ldquolegalidaderdquo de documentos XML documento bem formado e documento vaacutelido

Um documento XML bem formado segue as seguintes regras []

Um documento XML deve conter um uacutenico elemento raiz que contenham outros elementos

Todos os elementos devem ser corretamente aninhados

Todos os elementos devem ser fechados com uma tag ou com um ldquoauto-fechamentordquo de elemento vazio (por exemplo lttag gt)

Todos os valores de atributos devem ser citados Um documento XML vaacutelido eacute tanto bem formado quanto segue todas as regras explicitadas em um documento DTD (document type definition) Um documento vaacutelido entatildeo eacute nada mais que um documento bem formado vinculado a seu DTD (MYER 2005 Traduccedilatildeo nossa)

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 5: XML - Apostila Completa

4

criaccedilatildeo de arquivos para validaccedilatildeo de estrutura arquivos de validaccedilatildeo a serem visto posteriormente neste estudo permitem verificar se um XML aleacutem de bem formado eacute tambeacutem vaacutelido de acordo com uma estrutura

interligaccedilatildeo sua utilizaccedilatildeo permite interligar SGBDs (Sistema de Gerenciamento de Banco de Dados) distintos

simplicidade

Existem linguagens baseadas em XML como RDF SMIL MathML NCL XSIL e SVG O SVG por exemplo eacute um formato graacutefico vetorial (graphics scalar vector) e o MathML eacute uma linguagem de marcaccedilatildeo desenvolvida para o aspecto matemaacutetico

122 Motivaccedilatildeo

Maioria dos formatos de troca de dados eram

proprietaacuterios (custo)

necessidades especiacuteficas (soluccedilatildeo especiacutefica)

binaacuterios (diferentes aplicaccedilotildees e plataformas)

123 Caracteriacutesticas

Provecirc uma forma baseada em texto

caractere eacute sua unidade principal

aplica uma estrutura baseada em aacutervore para armazenar a informaccedilatildeo

facilidade na ediccedilatildeo e manutenccedilatildeo

Foco na informaccedilatildeo

Simplicidade e legibilidade

Criaccedilatildeo de marcaccedilotildees sem limitaccedilatildeo

124 Vantagens e Desvantagens

Dentre as principais vantagens destacam-se

Formato legiacutevel para pessoas e maacutequinas

Suporta UNICODE permitindo que quase qualquer linguagem escrita possa ser comunicada

Representa a maioria das estruturas de dados da computaccedilatildeo registros listas e aacutervores

Seu proacuteprio formato descreve a estrutura e os nomes dos campos

Dentre algumas desvantagens destacam-se

Sintaxe cheia e redundante

A redundacircncia pode afetar a eficiecircncia atraveacutes do armazenamento alto e do custo de transmissatildeo

A interpretaccedilatildeo natildeo suporta diretamente tipos de dados

5

Mapear o XML em um paradigma relacional ou orientado a objetos eacute uma tarefa custosa entretanto o inverso eacute faacutecil

Algumas pessoas insistem em dizer que o XML pode ser utilizado para armazenamento de dados somente se o arquivo eacute de baixo volume Todavia este informaccedilatildeo natildeo eacute verdadeira grandes estruturas XML podem ser acessadas muito rapidamente

13 XML x HTML

Tanto o XML quanto o HTML satildeo linguagens derivadas do SGML O que alguns pensam eacute que o XML foi criado com o propoacutesito de substituir o HTML Isto natildeo eacute verdade e antes de comentarmos o porquecirc falaremos um pouco sobre o HTML

O HTML eacute uma linguagem de marcaccedilatildeo cujo objetivo eacute produzir paacuteginas na internet Suas tags consistem em uma marca de iniacutecio e outra de teacutermino suas marca de iniacutecio eacute simbolizada por lt e sua marca de teacutermino por gt

O XML funciona como o HTML possui tags de iniacutecio e teacutermino utiliza os mesmos siacutembolos todavia natildeo possui a maior caracteriacutestica do HTML tags preacute-estabelecidas O XML eacute amplo as tags satildeo ilimitadas e qualquer tag pode ser criada desde que a estrutura seja mantida

Enquanto o HTML eacute mais flexiacutevel permitindo que natildeo se feche algumas das tags o XML eacute altamente estruturado Isto indica que no XML ao criar uma tag deve-se obrigatoriamente fechaacute-la caso contraacuterio sua estrutura natildeo seraacute validada e o arquivo estaraacute invaacutelido problema que natildeo ocorre com o HTML no quais algumas de suas tags geralmente natildeo satildeo fechadas ou possuem alguma flexibilidade de estruturaccedilatildeo

6

2 SINTAXE XML

21 Sintaxe HTML Certamente vocecircs devem estar familiarizados com as tags de marcaccedilatildeo de

elementos HTML

ltH1 ALIGN=rsquoCENTERrsquogt Conteuacutedo do Elemento ltH1gt

Tag Inicial Conteuacutedo Tag Final

Elemento

A estrutura de marcaccedilatildeo do XML eacute basicamente a mesma que no HTML com a delimitaccedilatildeo de tags com o uso de lsquomenor quersquo (lt) e lsquomaior quersquo (gt)

Ex lth1gtOlaacutelth1gt

vaacutelido tanto na sintaxe HTML com na XML ltbrgt

invaacutelido na sintaxe XML todavia vaacutelido em HTML

22 Partes do documento

Um documento XML bem-formado compreende trecircs partes

Proacutelogo Opcional

Corpo Conteacutem um ou mais elementos na forma de uma aacutervore hieraacuterquica

Epiacutelogo Opcional

221 Proacutelogo

Um documento XML comeccedila com um proacutelogo O proacutelogo eacute usado para sinalizar o comeccedilo dos dados XML descrever seu meacutetodo de codificaccedilatildeo de caracteree apresentar algumas outras dicas de configuraccedilatildeo ao parser XML

O mais importante componente do proacutelogo eacute a declaraccedilatildeo XML

Todos os documento XML podem (e devem) comeccedilar com uma uacutenica declaraccedilatildeo XML Apesar da declaraccedilatildeo usar uma sintaxe similar a uma instruccedilatildeo de processamento tecnicamento falando dentro dos termos da recomendaccedilatildeo XML natildeo se trata de uma instruccedilatildeo Veja a sintaxe completa da declaraccedilatildeo XML

ltxml version=10 encoding=ISO-8859-1 standalone=yesgt

Os atributos definidos pela especificaccedilatildeo XML 10

version

obrigatoacuteria valor tem que ser 10 este atributo permite o suporte de futuras versotildees do XML

encoding

opcional O valor tem que ser uma codificaccedilatildeo de caractere legal como UTF-8 UTF-16 ou ISO-8859-1 (a

7

codificaccedilatildeo de latin1) Todos os parses XML devem oferecer suporte a pelo menos UTF-8 e UTF-16

standalone

opcional O valor tem que ser ldquoyesrdquo ou ldquonordquo onde ldquoyesldquo

significa que todas as declaraccedilotildees de entidade necessaacuterias estatildeo contidas no elemento e ldquonordquo significa que um DTD externo eacute necessaacuterio

23 Elementos

Os elementos satildeo blocos de construccedilatildeo baacutesicos de uma marcaccedilatildeo XML Eles podem conter outros elementos dados de caractere referecircncia de caractere referecircncias de entidade instruccedilotildees de processamento comentaacuterios eou seccedilotildees de CDATA Todos estes termos seratildeo abordados

Os elementos satildeo delimitados usando tags que consistem em nome de tipo de elemento fechada por um par de parecircnteses angulares (ldquolt gtrdquo)

Todo elemento deve conter uma tag inicial e outra tag final (que natildeo pode ser esquecida como no HTML)

lth1gtOlaacutelth1gt

vaacutelido ltbrgt

invaacutelido Deve ser ltbrgtltbrgt

Exceccedilatildeo uacutenica quando eacute um elemento sem conteuacutedo onde o elemento eacute representado por um par de tags inicialfinal ou usando-se uma forma hiacutebrida abreviada a tag de elemento vazia Ex

ltbrgt

invaacutelido ltbr gt

vaacutelido

Uma vez que representam objetos discretos os elementos podem ser considerados como ldquosubstantivosrdquo

24 Elementos do documento

Documentos XML bem-formados satildeo definidos como tendo a forma de uma aacutervore hieraacuterquica simples cada documento tendo um e somente um noacute raiz chamado de entidade do documento ou a raiz do documento

ltxml version=10gt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt

ltxml version=10gt ltpublicacoesgt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt ltpublicacoesgt

Invaacutelido Possui mais de uma raiz do documento

Vaacutelido Possui apenas uma raiz do documento

8

A raiz do documento conteacutem uma aacutervore de elementos secundaacuterios

chamado de elemento do documento

25 Aninhamento de elementos

XML impotildee um restriccedilatildeo-chave aos documentos ndash eles precisam estar apropriadamente aninhados

Veja em HTML um exemplo

ltBgtJoatildeo foi a ltIgtEscolaltBgt mas acabou perdendo a provaltIgt

Em uma sintaxe XML isto estaria invaacutelido pois os elementos devem estar aninhados O exemplo acima em uma sintaxe XML poderia ser representado como abaixo

ltBgtJoatildeo foi a ltIgtEscolaltIgtltBgtltIgt mas acabou perdendo a provaltIgt

26 Atributos

Se os elementos satildeo ldquosubstantivosrdquo entatildeo os atributos satildeo seus ldquoadjetivosrdquo

Frequumlentemente existe alguma informaccedilatildeo sobre um elemento que queremos anexar a ele ao contraacuterio da informaccedilatildeo que eacute contida no elemento Isto pode e deve ser feito utilizando atributos cada um composto de um par nome=valor utilizando um dos seguintes formatos

nome-atributo=valor-atributo utilizando aspas duplas nome-atributo=valor-atributo utilizando aspas simples

Os atributos precisam sempre ser delimitados utilizando aspas simples ou duplas

Devem sempre ser inseridos na tag inicial ou na tag hiacutebrida de elemento vazio Exemplo

ltpessoa nome=Ricardo Terra profissao=Professor gt

ltpessoa nome=Ricardo Terra profissao=Professorgt ltpessoagt

Somente uma apariccedilatildeo de um nome de atributo eacute permitida na mesma tag Por exempo o seguinte natildeo seria legal em XML uma vez que titulo aparece duas vezes

ltlivro titulo=XML Professional titulo=Iniciando XMLgtltlivrogt

Em HTML permite atributos numeacutericos como ltimg width=300gt ou atributos natildeo delimitados como ltfont face=Arialgt - poreacutem nenhum destes eacute permitido em XML

9

27 Referecircncias de caractere e entidade

Assim como no SGML e HTML o XML oferece dois meacutetodos simples de representar os dados que natildeo existem no conjunto de caracteres ASCII

Referecircncias de caractere

Referecircncias de entidade

271 Referecircncias de caractere

Representam um caractere exibiacutevel e satildeo compostas por um nuacutemero decimal ou hexadecimal precedido por strings literais ldquoamprdquo ou ldquoampxrdquo (respectivamente) e seguidos por um ponto-e-viacutergula ()

Exemplo amp169 (notaccedilatildeo decimal) ampxA9 (notaccedilatildeo hexadecimal)

Iratildeo exibir em um browser de visualizaccedilatildeo o caractere copy

272 Referecircncias de entidade

Permitem a inserccedilatildeo de qualquer string literal no conteuacutedo de elementos ou valores de atributo assim como oferecem alternativas mnemocircnicas para referecircncia de caracteres

Satildeo um nome legal para XML precedidas por um amp e seguidas de um ponto-e-viacutergula ()

Cinco identificadores satildeo definifidos como uma parte integral do XML e satildeo usadas como sequecircncia de escape para os caracteres delimitadores de marcaccedilatildeo do XML

Entidade Valor Uso ampamp amp Sempre utilizado para o escape do caractere amp (exceto em

seccedilotildees de CDATA) amplt lt Sempre utilizado para o escape do caractere lt (exceto em

seccedilotildees de CDATA) ampgt gt Sempre utilizado para o escape do caractere lt (ateacute mesmo

em seccedilotildees de CDATA) ampapos Pode ser usado no escape do caractere em strings literais ampquot Pode ser usado no escape do caractere em strings literais

Exemplos

ATampampT seraacute exibido ATampT

lttaggtampltlttaggt o o conteuacutedo da tag eacute lt que natildeo funcionaria assim lttaggtltlttaggt

ltlivro nome=O uso das aspas (ampquot) gt o O conteuacutedo da tag eacute O uso das aspas () que natildeo funcionaria se

fosse ltlivro nome=O uso das aspas () gt

10

28 Instruccedilotildees de processamento

Existem ocasiotildees em que eacute desejaacutevel poder passar dicas a uma aplicaccedilatildeo junto com o documento As instruccedilotildees de processamento (PIs ndash processing instructions) satildeo um mecanismo que o XML oferece para este propoacutesito

Os PIs utilizam uma sintaxe como a do elemento XML

lttarget hellipinstructionshellip gt

Uma utilizaccedilatildeo de PIs eacute na associaccedilatildeo de uma folha de estilos

ltxml-stylesheet hellip gt

29 Comentaacuterio

Pode ser uacutetil inserir notas ou comentaacuterios em um documento Estes comentaacuterios podem servir para revisatildeo histoacuterico ou qualquer outro metadados importantes contudo natildeo satildeo realmente parte do conteuacutedo de um documento

A sintaxe baacutesica de um comentaacuterio XML eacute

lt-- Comentaacuterio Qualquer --gt

Exemplos

lt-- XML de importaccedilatildeo criado por Ricardo Terra em 01jan2007 --gt ltbibliotecagt ltlivrogtltlivrogt lt-- Eis um livro --gt ltlivrogtltlivrogt lt-- Eis mais um livro --gt ltbibliotecagt

210 Seccedilotildees CDATA

Seccedilotildees CDATA satildeo um meacutetodo de inclusatildeo de texto que conteacutem caracteres que de outro forma seriam reconhecidos como marcaccedilatildeo

As seccedilotildees CDATA natildeo podem ser aninhadas e soacute devem ser utilizadas quando realmente necessaacuterio

A sintaxe baacutesica eacute

lt[CDATA[hellip]]gt onde pode ser qualquer string de caractere que natildeo seja ]]gt

Exemplo ltbibliotecagt ltlivrogt lt[CDATA[ltxml version=10gtltfaculdadegtltcurso nome=SIgtltfaculdadegt]]gt ltlivrogt ltbibliotecagt

11

3 ESQUEMAS DE VALIDACcedilAtildeO

31 Modelagem de dados

As aplicaccedilotildees podem realizar a mesma funcionalidade embora conforme as ideacuteias de Braganholo e Heuser seja completamente provaacutevel que os dados armazenados estejam modelados de forma diferente Ao citar que a modelagem estaacute diferente natildeo se refere aos campos com nomes distintos mas sim a todos os seguintes casos

Nomenclatura distinta de campos

Tipos distintos

Gravaccedilatildeo em formatos distintos

Modos de relacionamento entre os dados feitos de diferentes formas Exemplificando os trecircs primeiros casos acima posso citar o armazenamento

de um CPF (cadastro de pessoa fiacutesica) de cliente Ele pode ser armazenado com o nome de NUM_CPF ser do tipo numeacuterico ou pode ser armazenado com o nome de CPF_CLIENTE ser do tipo texto e ser armazenado com maacutescara Neste caso a mesma informaccedilatildeo pode ser extraiacuteda de ambas as bases de dados com o entendimento de forma intuitiva mas internamente foram modeladas de forma distinta

Baseado no problema acima pode-se entender o real significado da palavra intuiccedilatildeo embora o computador natildeo possua este entendimento O sistema que trabalha com o CPF na forma numeacuterica natildeo conseguiria abstrair uma informaccedilatildeo de um XML bem formado e vaacutelido cujo campo de CPF seja alfanumeacuterico Eacute neste ponto que a utilizaccedilatildeo do XSLT eacute funcionalmente adequada e antes de entrarmos no toacutepico de como fazer esta conversatildeo utilizando XSLT falaremos um pouco sobre o que eacute um documento XML bem formado e vaacutelido destacando os tipos de validaccedilotildees existentes

32 XML bem formado e vaacutelido

Segundo Myer (2005) existem dois tipos de ldquolegalidaderdquo de documentos XML documento bem formado e documento vaacutelido

Um documento XML bem formado segue as seguintes regras []

Um documento XML deve conter um uacutenico elemento raiz que contenham outros elementos

Todos os elementos devem ser corretamente aninhados

Todos os elementos devem ser fechados com uma tag ou com um ldquoauto-fechamentordquo de elemento vazio (por exemplo lttag gt)

Todos os valores de atributos devem ser citados Um documento XML vaacutelido eacute tanto bem formado quanto segue todas as regras explicitadas em um documento DTD (document type definition) Um documento vaacutelido entatildeo eacute nada mais que um documento bem formado vinculado a seu DTD (MYER 2005 Traduccedilatildeo nossa)

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 6: XML - Apostila Completa

5

Mapear o XML em um paradigma relacional ou orientado a objetos eacute uma tarefa custosa entretanto o inverso eacute faacutecil

Algumas pessoas insistem em dizer que o XML pode ser utilizado para armazenamento de dados somente se o arquivo eacute de baixo volume Todavia este informaccedilatildeo natildeo eacute verdadeira grandes estruturas XML podem ser acessadas muito rapidamente

13 XML x HTML

Tanto o XML quanto o HTML satildeo linguagens derivadas do SGML O que alguns pensam eacute que o XML foi criado com o propoacutesito de substituir o HTML Isto natildeo eacute verdade e antes de comentarmos o porquecirc falaremos um pouco sobre o HTML

O HTML eacute uma linguagem de marcaccedilatildeo cujo objetivo eacute produzir paacuteginas na internet Suas tags consistem em uma marca de iniacutecio e outra de teacutermino suas marca de iniacutecio eacute simbolizada por lt e sua marca de teacutermino por gt

O XML funciona como o HTML possui tags de iniacutecio e teacutermino utiliza os mesmos siacutembolos todavia natildeo possui a maior caracteriacutestica do HTML tags preacute-estabelecidas O XML eacute amplo as tags satildeo ilimitadas e qualquer tag pode ser criada desde que a estrutura seja mantida

Enquanto o HTML eacute mais flexiacutevel permitindo que natildeo se feche algumas das tags o XML eacute altamente estruturado Isto indica que no XML ao criar uma tag deve-se obrigatoriamente fechaacute-la caso contraacuterio sua estrutura natildeo seraacute validada e o arquivo estaraacute invaacutelido problema que natildeo ocorre com o HTML no quais algumas de suas tags geralmente natildeo satildeo fechadas ou possuem alguma flexibilidade de estruturaccedilatildeo

6

2 SINTAXE XML

21 Sintaxe HTML Certamente vocecircs devem estar familiarizados com as tags de marcaccedilatildeo de

elementos HTML

ltH1 ALIGN=rsquoCENTERrsquogt Conteuacutedo do Elemento ltH1gt

Tag Inicial Conteuacutedo Tag Final

Elemento

A estrutura de marcaccedilatildeo do XML eacute basicamente a mesma que no HTML com a delimitaccedilatildeo de tags com o uso de lsquomenor quersquo (lt) e lsquomaior quersquo (gt)

Ex lth1gtOlaacutelth1gt

vaacutelido tanto na sintaxe HTML com na XML ltbrgt

invaacutelido na sintaxe XML todavia vaacutelido em HTML

22 Partes do documento

Um documento XML bem-formado compreende trecircs partes

Proacutelogo Opcional

Corpo Conteacutem um ou mais elementos na forma de uma aacutervore hieraacuterquica

Epiacutelogo Opcional

221 Proacutelogo

Um documento XML comeccedila com um proacutelogo O proacutelogo eacute usado para sinalizar o comeccedilo dos dados XML descrever seu meacutetodo de codificaccedilatildeo de caracteree apresentar algumas outras dicas de configuraccedilatildeo ao parser XML

O mais importante componente do proacutelogo eacute a declaraccedilatildeo XML

Todos os documento XML podem (e devem) comeccedilar com uma uacutenica declaraccedilatildeo XML Apesar da declaraccedilatildeo usar uma sintaxe similar a uma instruccedilatildeo de processamento tecnicamento falando dentro dos termos da recomendaccedilatildeo XML natildeo se trata de uma instruccedilatildeo Veja a sintaxe completa da declaraccedilatildeo XML

ltxml version=10 encoding=ISO-8859-1 standalone=yesgt

Os atributos definidos pela especificaccedilatildeo XML 10

version

obrigatoacuteria valor tem que ser 10 este atributo permite o suporte de futuras versotildees do XML

encoding

opcional O valor tem que ser uma codificaccedilatildeo de caractere legal como UTF-8 UTF-16 ou ISO-8859-1 (a

7

codificaccedilatildeo de latin1) Todos os parses XML devem oferecer suporte a pelo menos UTF-8 e UTF-16

standalone

opcional O valor tem que ser ldquoyesrdquo ou ldquonordquo onde ldquoyesldquo

significa que todas as declaraccedilotildees de entidade necessaacuterias estatildeo contidas no elemento e ldquonordquo significa que um DTD externo eacute necessaacuterio

23 Elementos

Os elementos satildeo blocos de construccedilatildeo baacutesicos de uma marcaccedilatildeo XML Eles podem conter outros elementos dados de caractere referecircncia de caractere referecircncias de entidade instruccedilotildees de processamento comentaacuterios eou seccedilotildees de CDATA Todos estes termos seratildeo abordados

Os elementos satildeo delimitados usando tags que consistem em nome de tipo de elemento fechada por um par de parecircnteses angulares (ldquolt gtrdquo)

Todo elemento deve conter uma tag inicial e outra tag final (que natildeo pode ser esquecida como no HTML)

lth1gtOlaacutelth1gt

vaacutelido ltbrgt

invaacutelido Deve ser ltbrgtltbrgt

Exceccedilatildeo uacutenica quando eacute um elemento sem conteuacutedo onde o elemento eacute representado por um par de tags inicialfinal ou usando-se uma forma hiacutebrida abreviada a tag de elemento vazia Ex

ltbrgt

invaacutelido ltbr gt

vaacutelido

Uma vez que representam objetos discretos os elementos podem ser considerados como ldquosubstantivosrdquo

24 Elementos do documento

Documentos XML bem-formados satildeo definidos como tendo a forma de uma aacutervore hieraacuterquica simples cada documento tendo um e somente um noacute raiz chamado de entidade do documento ou a raiz do documento

ltxml version=10gt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt

ltxml version=10gt ltpublicacoesgt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt ltpublicacoesgt

Invaacutelido Possui mais de uma raiz do documento

Vaacutelido Possui apenas uma raiz do documento

8

A raiz do documento conteacutem uma aacutervore de elementos secundaacuterios

chamado de elemento do documento

25 Aninhamento de elementos

XML impotildee um restriccedilatildeo-chave aos documentos ndash eles precisam estar apropriadamente aninhados

Veja em HTML um exemplo

ltBgtJoatildeo foi a ltIgtEscolaltBgt mas acabou perdendo a provaltIgt

Em uma sintaxe XML isto estaria invaacutelido pois os elementos devem estar aninhados O exemplo acima em uma sintaxe XML poderia ser representado como abaixo

ltBgtJoatildeo foi a ltIgtEscolaltIgtltBgtltIgt mas acabou perdendo a provaltIgt

26 Atributos

Se os elementos satildeo ldquosubstantivosrdquo entatildeo os atributos satildeo seus ldquoadjetivosrdquo

Frequumlentemente existe alguma informaccedilatildeo sobre um elemento que queremos anexar a ele ao contraacuterio da informaccedilatildeo que eacute contida no elemento Isto pode e deve ser feito utilizando atributos cada um composto de um par nome=valor utilizando um dos seguintes formatos

nome-atributo=valor-atributo utilizando aspas duplas nome-atributo=valor-atributo utilizando aspas simples

Os atributos precisam sempre ser delimitados utilizando aspas simples ou duplas

Devem sempre ser inseridos na tag inicial ou na tag hiacutebrida de elemento vazio Exemplo

ltpessoa nome=Ricardo Terra profissao=Professor gt

ltpessoa nome=Ricardo Terra profissao=Professorgt ltpessoagt

Somente uma apariccedilatildeo de um nome de atributo eacute permitida na mesma tag Por exempo o seguinte natildeo seria legal em XML uma vez que titulo aparece duas vezes

ltlivro titulo=XML Professional titulo=Iniciando XMLgtltlivrogt

Em HTML permite atributos numeacutericos como ltimg width=300gt ou atributos natildeo delimitados como ltfont face=Arialgt - poreacutem nenhum destes eacute permitido em XML

9

27 Referecircncias de caractere e entidade

Assim como no SGML e HTML o XML oferece dois meacutetodos simples de representar os dados que natildeo existem no conjunto de caracteres ASCII

Referecircncias de caractere

Referecircncias de entidade

271 Referecircncias de caractere

Representam um caractere exibiacutevel e satildeo compostas por um nuacutemero decimal ou hexadecimal precedido por strings literais ldquoamprdquo ou ldquoampxrdquo (respectivamente) e seguidos por um ponto-e-viacutergula ()

Exemplo amp169 (notaccedilatildeo decimal) ampxA9 (notaccedilatildeo hexadecimal)

Iratildeo exibir em um browser de visualizaccedilatildeo o caractere copy

272 Referecircncias de entidade

Permitem a inserccedilatildeo de qualquer string literal no conteuacutedo de elementos ou valores de atributo assim como oferecem alternativas mnemocircnicas para referecircncia de caracteres

Satildeo um nome legal para XML precedidas por um amp e seguidas de um ponto-e-viacutergula ()

Cinco identificadores satildeo definifidos como uma parte integral do XML e satildeo usadas como sequecircncia de escape para os caracteres delimitadores de marcaccedilatildeo do XML

Entidade Valor Uso ampamp amp Sempre utilizado para o escape do caractere amp (exceto em

seccedilotildees de CDATA) amplt lt Sempre utilizado para o escape do caractere lt (exceto em

seccedilotildees de CDATA) ampgt gt Sempre utilizado para o escape do caractere lt (ateacute mesmo

em seccedilotildees de CDATA) ampapos Pode ser usado no escape do caractere em strings literais ampquot Pode ser usado no escape do caractere em strings literais

Exemplos

ATampampT seraacute exibido ATampT

lttaggtampltlttaggt o o conteuacutedo da tag eacute lt que natildeo funcionaria assim lttaggtltlttaggt

ltlivro nome=O uso das aspas (ampquot) gt o O conteuacutedo da tag eacute O uso das aspas () que natildeo funcionaria se

fosse ltlivro nome=O uso das aspas () gt

10

28 Instruccedilotildees de processamento

Existem ocasiotildees em que eacute desejaacutevel poder passar dicas a uma aplicaccedilatildeo junto com o documento As instruccedilotildees de processamento (PIs ndash processing instructions) satildeo um mecanismo que o XML oferece para este propoacutesito

Os PIs utilizam uma sintaxe como a do elemento XML

lttarget hellipinstructionshellip gt

Uma utilizaccedilatildeo de PIs eacute na associaccedilatildeo de uma folha de estilos

ltxml-stylesheet hellip gt

29 Comentaacuterio

Pode ser uacutetil inserir notas ou comentaacuterios em um documento Estes comentaacuterios podem servir para revisatildeo histoacuterico ou qualquer outro metadados importantes contudo natildeo satildeo realmente parte do conteuacutedo de um documento

A sintaxe baacutesica de um comentaacuterio XML eacute

lt-- Comentaacuterio Qualquer --gt

Exemplos

lt-- XML de importaccedilatildeo criado por Ricardo Terra em 01jan2007 --gt ltbibliotecagt ltlivrogtltlivrogt lt-- Eis um livro --gt ltlivrogtltlivrogt lt-- Eis mais um livro --gt ltbibliotecagt

210 Seccedilotildees CDATA

Seccedilotildees CDATA satildeo um meacutetodo de inclusatildeo de texto que conteacutem caracteres que de outro forma seriam reconhecidos como marcaccedilatildeo

As seccedilotildees CDATA natildeo podem ser aninhadas e soacute devem ser utilizadas quando realmente necessaacuterio

A sintaxe baacutesica eacute

lt[CDATA[hellip]]gt onde pode ser qualquer string de caractere que natildeo seja ]]gt

Exemplo ltbibliotecagt ltlivrogt lt[CDATA[ltxml version=10gtltfaculdadegtltcurso nome=SIgtltfaculdadegt]]gt ltlivrogt ltbibliotecagt

11

3 ESQUEMAS DE VALIDACcedilAtildeO

31 Modelagem de dados

As aplicaccedilotildees podem realizar a mesma funcionalidade embora conforme as ideacuteias de Braganholo e Heuser seja completamente provaacutevel que os dados armazenados estejam modelados de forma diferente Ao citar que a modelagem estaacute diferente natildeo se refere aos campos com nomes distintos mas sim a todos os seguintes casos

Nomenclatura distinta de campos

Tipos distintos

Gravaccedilatildeo em formatos distintos

Modos de relacionamento entre os dados feitos de diferentes formas Exemplificando os trecircs primeiros casos acima posso citar o armazenamento

de um CPF (cadastro de pessoa fiacutesica) de cliente Ele pode ser armazenado com o nome de NUM_CPF ser do tipo numeacuterico ou pode ser armazenado com o nome de CPF_CLIENTE ser do tipo texto e ser armazenado com maacutescara Neste caso a mesma informaccedilatildeo pode ser extraiacuteda de ambas as bases de dados com o entendimento de forma intuitiva mas internamente foram modeladas de forma distinta

Baseado no problema acima pode-se entender o real significado da palavra intuiccedilatildeo embora o computador natildeo possua este entendimento O sistema que trabalha com o CPF na forma numeacuterica natildeo conseguiria abstrair uma informaccedilatildeo de um XML bem formado e vaacutelido cujo campo de CPF seja alfanumeacuterico Eacute neste ponto que a utilizaccedilatildeo do XSLT eacute funcionalmente adequada e antes de entrarmos no toacutepico de como fazer esta conversatildeo utilizando XSLT falaremos um pouco sobre o que eacute um documento XML bem formado e vaacutelido destacando os tipos de validaccedilotildees existentes

32 XML bem formado e vaacutelido

Segundo Myer (2005) existem dois tipos de ldquolegalidaderdquo de documentos XML documento bem formado e documento vaacutelido

Um documento XML bem formado segue as seguintes regras []

Um documento XML deve conter um uacutenico elemento raiz que contenham outros elementos

Todos os elementos devem ser corretamente aninhados

Todos os elementos devem ser fechados com uma tag ou com um ldquoauto-fechamentordquo de elemento vazio (por exemplo lttag gt)

Todos os valores de atributos devem ser citados Um documento XML vaacutelido eacute tanto bem formado quanto segue todas as regras explicitadas em um documento DTD (document type definition) Um documento vaacutelido entatildeo eacute nada mais que um documento bem formado vinculado a seu DTD (MYER 2005 Traduccedilatildeo nossa)

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 7: XML - Apostila Completa

6

2 SINTAXE XML

21 Sintaxe HTML Certamente vocecircs devem estar familiarizados com as tags de marcaccedilatildeo de

elementos HTML

ltH1 ALIGN=rsquoCENTERrsquogt Conteuacutedo do Elemento ltH1gt

Tag Inicial Conteuacutedo Tag Final

Elemento

A estrutura de marcaccedilatildeo do XML eacute basicamente a mesma que no HTML com a delimitaccedilatildeo de tags com o uso de lsquomenor quersquo (lt) e lsquomaior quersquo (gt)

Ex lth1gtOlaacutelth1gt

vaacutelido tanto na sintaxe HTML com na XML ltbrgt

invaacutelido na sintaxe XML todavia vaacutelido em HTML

22 Partes do documento

Um documento XML bem-formado compreende trecircs partes

Proacutelogo Opcional

Corpo Conteacutem um ou mais elementos na forma de uma aacutervore hieraacuterquica

Epiacutelogo Opcional

221 Proacutelogo

Um documento XML comeccedila com um proacutelogo O proacutelogo eacute usado para sinalizar o comeccedilo dos dados XML descrever seu meacutetodo de codificaccedilatildeo de caracteree apresentar algumas outras dicas de configuraccedilatildeo ao parser XML

O mais importante componente do proacutelogo eacute a declaraccedilatildeo XML

Todos os documento XML podem (e devem) comeccedilar com uma uacutenica declaraccedilatildeo XML Apesar da declaraccedilatildeo usar uma sintaxe similar a uma instruccedilatildeo de processamento tecnicamento falando dentro dos termos da recomendaccedilatildeo XML natildeo se trata de uma instruccedilatildeo Veja a sintaxe completa da declaraccedilatildeo XML

ltxml version=10 encoding=ISO-8859-1 standalone=yesgt

Os atributos definidos pela especificaccedilatildeo XML 10

version

obrigatoacuteria valor tem que ser 10 este atributo permite o suporte de futuras versotildees do XML

encoding

opcional O valor tem que ser uma codificaccedilatildeo de caractere legal como UTF-8 UTF-16 ou ISO-8859-1 (a

7

codificaccedilatildeo de latin1) Todos os parses XML devem oferecer suporte a pelo menos UTF-8 e UTF-16

standalone

opcional O valor tem que ser ldquoyesrdquo ou ldquonordquo onde ldquoyesldquo

significa que todas as declaraccedilotildees de entidade necessaacuterias estatildeo contidas no elemento e ldquonordquo significa que um DTD externo eacute necessaacuterio

23 Elementos

Os elementos satildeo blocos de construccedilatildeo baacutesicos de uma marcaccedilatildeo XML Eles podem conter outros elementos dados de caractere referecircncia de caractere referecircncias de entidade instruccedilotildees de processamento comentaacuterios eou seccedilotildees de CDATA Todos estes termos seratildeo abordados

Os elementos satildeo delimitados usando tags que consistem em nome de tipo de elemento fechada por um par de parecircnteses angulares (ldquolt gtrdquo)

Todo elemento deve conter uma tag inicial e outra tag final (que natildeo pode ser esquecida como no HTML)

lth1gtOlaacutelth1gt

vaacutelido ltbrgt

invaacutelido Deve ser ltbrgtltbrgt

Exceccedilatildeo uacutenica quando eacute um elemento sem conteuacutedo onde o elemento eacute representado por um par de tags inicialfinal ou usando-se uma forma hiacutebrida abreviada a tag de elemento vazia Ex

ltbrgt

invaacutelido ltbr gt

vaacutelido

Uma vez que representam objetos discretos os elementos podem ser considerados como ldquosubstantivosrdquo

24 Elementos do documento

Documentos XML bem-formados satildeo definidos como tendo a forma de uma aacutervore hieraacuterquica simples cada documento tendo um e somente um noacute raiz chamado de entidade do documento ou a raiz do documento

ltxml version=10gt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt

ltxml version=10gt ltpublicacoesgt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt ltpublicacoesgt

Invaacutelido Possui mais de uma raiz do documento

Vaacutelido Possui apenas uma raiz do documento

8

A raiz do documento conteacutem uma aacutervore de elementos secundaacuterios

chamado de elemento do documento

25 Aninhamento de elementos

XML impotildee um restriccedilatildeo-chave aos documentos ndash eles precisam estar apropriadamente aninhados

Veja em HTML um exemplo

ltBgtJoatildeo foi a ltIgtEscolaltBgt mas acabou perdendo a provaltIgt

Em uma sintaxe XML isto estaria invaacutelido pois os elementos devem estar aninhados O exemplo acima em uma sintaxe XML poderia ser representado como abaixo

ltBgtJoatildeo foi a ltIgtEscolaltIgtltBgtltIgt mas acabou perdendo a provaltIgt

26 Atributos

Se os elementos satildeo ldquosubstantivosrdquo entatildeo os atributos satildeo seus ldquoadjetivosrdquo

Frequumlentemente existe alguma informaccedilatildeo sobre um elemento que queremos anexar a ele ao contraacuterio da informaccedilatildeo que eacute contida no elemento Isto pode e deve ser feito utilizando atributos cada um composto de um par nome=valor utilizando um dos seguintes formatos

nome-atributo=valor-atributo utilizando aspas duplas nome-atributo=valor-atributo utilizando aspas simples

Os atributos precisam sempre ser delimitados utilizando aspas simples ou duplas

Devem sempre ser inseridos na tag inicial ou na tag hiacutebrida de elemento vazio Exemplo

ltpessoa nome=Ricardo Terra profissao=Professor gt

ltpessoa nome=Ricardo Terra profissao=Professorgt ltpessoagt

Somente uma apariccedilatildeo de um nome de atributo eacute permitida na mesma tag Por exempo o seguinte natildeo seria legal em XML uma vez que titulo aparece duas vezes

ltlivro titulo=XML Professional titulo=Iniciando XMLgtltlivrogt

Em HTML permite atributos numeacutericos como ltimg width=300gt ou atributos natildeo delimitados como ltfont face=Arialgt - poreacutem nenhum destes eacute permitido em XML

9

27 Referecircncias de caractere e entidade

Assim como no SGML e HTML o XML oferece dois meacutetodos simples de representar os dados que natildeo existem no conjunto de caracteres ASCII

Referecircncias de caractere

Referecircncias de entidade

271 Referecircncias de caractere

Representam um caractere exibiacutevel e satildeo compostas por um nuacutemero decimal ou hexadecimal precedido por strings literais ldquoamprdquo ou ldquoampxrdquo (respectivamente) e seguidos por um ponto-e-viacutergula ()

Exemplo amp169 (notaccedilatildeo decimal) ampxA9 (notaccedilatildeo hexadecimal)

Iratildeo exibir em um browser de visualizaccedilatildeo o caractere copy

272 Referecircncias de entidade

Permitem a inserccedilatildeo de qualquer string literal no conteuacutedo de elementos ou valores de atributo assim como oferecem alternativas mnemocircnicas para referecircncia de caracteres

Satildeo um nome legal para XML precedidas por um amp e seguidas de um ponto-e-viacutergula ()

Cinco identificadores satildeo definifidos como uma parte integral do XML e satildeo usadas como sequecircncia de escape para os caracteres delimitadores de marcaccedilatildeo do XML

Entidade Valor Uso ampamp amp Sempre utilizado para o escape do caractere amp (exceto em

seccedilotildees de CDATA) amplt lt Sempre utilizado para o escape do caractere lt (exceto em

seccedilotildees de CDATA) ampgt gt Sempre utilizado para o escape do caractere lt (ateacute mesmo

em seccedilotildees de CDATA) ampapos Pode ser usado no escape do caractere em strings literais ampquot Pode ser usado no escape do caractere em strings literais

Exemplos

ATampampT seraacute exibido ATampT

lttaggtampltlttaggt o o conteuacutedo da tag eacute lt que natildeo funcionaria assim lttaggtltlttaggt

ltlivro nome=O uso das aspas (ampquot) gt o O conteuacutedo da tag eacute O uso das aspas () que natildeo funcionaria se

fosse ltlivro nome=O uso das aspas () gt

10

28 Instruccedilotildees de processamento

Existem ocasiotildees em que eacute desejaacutevel poder passar dicas a uma aplicaccedilatildeo junto com o documento As instruccedilotildees de processamento (PIs ndash processing instructions) satildeo um mecanismo que o XML oferece para este propoacutesito

Os PIs utilizam uma sintaxe como a do elemento XML

lttarget hellipinstructionshellip gt

Uma utilizaccedilatildeo de PIs eacute na associaccedilatildeo de uma folha de estilos

ltxml-stylesheet hellip gt

29 Comentaacuterio

Pode ser uacutetil inserir notas ou comentaacuterios em um documento Estes comentaacuterios podem servir para revisatildeo histoacuterico ou qualquer outro metadados importantes contudo natildeo satildeo realmente parte do conteuacutedo de um documento

A sintaxe baacutesica de um comentaacuterio XML eacute

lt-- Comentaacuterio Qualquer --gt

Exemplos

lt-- XML de importaccedilatildeo criado por Ricardo Terra em 01jan2007 --gt ltbibliotecagt ltlivrogtltlivrogt lt-- Eis um livro --gt ltlivrogtltlivrogt lt-- Eis mais um livro --gt ltbibliotecagt

210 Seccedilotildees CDATA

Seccedilotildees CDATA satildeo um meacutetodo de inclusatildeo de texto que conteacutem caracteres que de outro forma seriam reconhecidos como marcaccedilatildeo

As seccedilotildees CDATA natildeo podem ser aninhadas e soacute devem ser utilizadas quando realmente necessaacuterio

A sintaxe baacutesica eacute

lt[CDATA[hellip]]gt onde pode ser qualquer string de caractere que natildeo seja ]]gt

Exemplo ltbibliotecagt ltlivrogt lt[CDATA[ltxml version=10gtltfaculdadegtltcurso nome=SIgtltfaculdadegt]]gt ltlivrogt ltbibliotecagt

11

3 ESQUEMAS DE VALIDACcedilAtildeO

31 Modelagem de dados

As aplicaccedilotildees podem realizar a mesma funcionalidade embora conforme as ideacuteias de Braganholo e Heuser seja completamente provaacutevel que os dados armazenados estejam modelados de forma diferente Ao citar que a modelagem estaacute diferente natildeo se refere aos campos com nomes distintos mas sim a todos os seguintes casos

Nomenclatura distinta de campos

Tipos distintos

Gravaccedilatildeo em formatos distintos

Modos de relacionamento entre os dados feitos de diferentes formas Exemplificando os trecircs primeiros casos acima posso citar o armazenamento

de um CPF (cadastro de pessoa fiacutesica) de cliente Ele pode ser armazenado com o nome de NUM_CPF ser do tipo numeacuterico ou pode ser armazenado com o nome de CPF_CLIENTE ser do tipo texto e ser armazenado com maacutescara Neste caso a mesma informaccedilatildeo pode ser extraiacuteda de ambas as bases de dados com o entendimento de forma intuitiva mas internamente foram modeladas de forma distinta

Baseado no problema acima pode-se entender o real significado da palavra intuiccedilatildeo embora o computador natildeo possua este entendimento O sistema que trabalha com o CPF na forma numeacuterica natildeo conseguiria abstrair uma informaccedilatildeo de um XML bem formado e vaacutelido cujo campo de CPF seja alfanumeacuterico Eacute neste ponto que a utilizaccedilatildeo do XSLT eacute funcionalmente adequada e antes de entrarmos no toacutepico de como fazer esta conversatildeo utilizando XSLT falaremos um pouco sobre o que eacute um documento XML bem formado e vaacutelido destacando os tipos de validaccedilotildees existentes

32 XML bem formado e vaacutelido

Segundo Myer (2005) existem dois tipos de ldquolegalidaderdquo de documentos XML documento bem formado e documento vaacutelido

Um documento XML bem formado segue as seguintes regras []

Um documento XML deve conter um uacutenico elemento raiz que contenham outros elementos

Todos os elementos devem ser corretamente aninhados

Todos os elementos devem ser fechados com uma tag ou com um ldquoauto-fechamentordquo de elemento vazio (por exemplo lttag gt)

Todos os valores de atributos devem ser citados Um documento XML vaacutelido eacute tanto bem formado quanto segue todas as regras explicitadas em um documento DTD (document type definition) Um documento vaacutelido entatildeo eacute nada mais que um documento bem formado vinculado a seu DTD (MYER 2005 Traduccedilatildeo nossa)

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 8: XML - Apostila Completa

7

codificaccedilatildeo de latin1) Todos os parses XML devem oferecer suporte a pelo menos UTF-8 e UTF-16

standalone

opcional O valor tem que ser ldquoyesrdquo ou ldquonordquo onde ldquoyesldquo

significa que todas as declaraccedilotildees de entidade necessaacuterias estatildeo contidas no elemento e ldquonordquo significa que um DTD externo eacute necessaacuterio

23 Elementos

Os elementos satildeo blocos de construccedilatildeo baacutesicos de uma marcaccedilatildeo XML Eles podem conter outros elementos dados de caractere referecircncia de caractere referecircncias de entidade instruccedilotildees de processamento comentaacuterios eou seccedilotildees de CDATA Todos estes termos seratildeo abordados

Os elementos satildeo delimitados usando tags que consistem em nome de tipo de elemento fechada por um par de parecircnteses angulares (ldquolt gtrdquo)

Todo elemento deve conter uma tag inicial e outra tag final (que natildeo pode ser esquecida como no HTML)

lth1gtOlaacutelth1gt

vaacutelido ltbrgt

invaacutelido Deve ser ltbrgtltbrgt

Exceccedilatildeo uacutenica quando eacute um elemento sem conteuacutedo onde o elemento eacute representado por um par de tags inicialfinal ou usando-se uma forma hiacutebrida abreviada a tag de elemento vazia Ex

ltbrgt

invaacutelido ltbr gt

vaacutelido

Uma vez que representam objetos discretos os elementos podem ser considerados como ldquosubstantivosrdquo

24 Elementos do documento

Documentos XML bem-formados satildeo definidos como tendo a forma de uma aacutervore hieraacuterquica simples cada documento tendo um e somente um noacute raiz chamado de entidade do documento ou a raiz do documento

ltxml version=10gt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt

ltxml version=10gt ltpublicacoesgt ltlivrogt ltnomegtProfessional XMLltnomegt ltlivrogt ltrevistagt ltnomegt XML Magazineltnomegt ltrevistagt ltpublicacoesgt

Invaacutelido Possui mais de uma raiz do documento

Vaacutelido Possui apenas uma raiz do documento

8

A raiz do documento conteacutem uma aacutervore de elementos secundaacuterios

chamado de elemento do documento

25 Aninhamento de elementos

XML impotildee um restriccedilatildeo-chave aos documentos ndash eles precisam estar apropriadamente aninhados

Veja em HTML um exemplo

ltBgtJoatildeo foi a ltIgtEscolaltBgt mas acabou perdendo a provaltIgt

Em uma sintaxe XML isto estaria invaacutelido pois os elementos devem estar aninhados O exemplo acima em uma sintaxe XML poderia ser representado como abaixo

ltBgtJoatildeo foi a ltIgtEscolaltIgtltBgtltIgt mas acabou perdendo a provaltIgt

26 Atributos

Se os elementos satildeo ldquosubstantivosrdquo entatildeo os atributos satildeo seus ldquoadjetivosrdquo

Frequumlentemente existe alguma informaccedilatildeo sobre um elemento que queremos anexar a ele ao contraacuterio da informaccedilatildeo que eacute contida no elemento Isto pode e deve ser feito utilizando atributos cada um composto de um par nome=valor utilizando um dos seguintes formatos

nome-atributo=valor-atributo utilizando aspas duplas nome-atributo=valor-atributo utilizando aspas simples

Os atributos precisam sempre ser delimitados utilizando aspas simples ou duplas

Devem sempre ser inseridos na tag inicial ou na tag hiacutebrida de elemento vazio Exemplo

ltpessoa nome=Ricardo Terra profissao=Professor gt

ltpessoa nome=Ricardo Terra profissao=Professorgt ltpessoagt

Somente uma apariccedilatildeo de um nome de atributo eacute permitida na mesma tag Por exempo o seguinte natildeo seria legal em XML uma vez que titulo aparece duas vezes

ltlivro titulo=XML Professional titulo=Iniciando XMLgtltlivrogt

Em HTML permite atributos numeacutericos como ltimg width=300gt ou atributos natildeo delimitados como ltfont face=Arialgt - poreacutem nenhum destes eacute permitido em XML

9

27 Referecircncias de caractere e entidade

Assim como no SGML e HTML o XML oferece dois meacutetodos simples de representar os dados que natildeo existem no conjunto de caracteres ASCII

Referecircncias de caractere

Referecircncias de entidade

271 Referecircncias de caractere

Representam um caractere exibiacutevel e satildeo compostas por um nuacutemero decimal ou hexadecimal precedido por strings literais ldquoamprdquo ou ldquoampxrdquo (respectivamente) e seguidos por um ponto-e-viacutergula ()

Exemplo amp169 (notaccedilatildeo decimal) ampxA9 (notaccedilatildeo hexadecimal)

Iratildeo exibir em um browser de visualizaccedilatildeo o caractere copy

272 Referecircncias de entidade

Permitem a inserccedilatildeo de qualquer string literal no conteuacutedo de elementos ou valores de atributo assim como oferecem alternativas mnemocircnicas para referecircncia de caracteres

Satildeo um nome legal para XML precedidas por um amp e seguidas de um ponto-e-viacutergula ()

Cinco identificadores satildeo definifidos como uma parte integral do XML e satildeo usadas como sequecircncia de escape para os caracteres delimitadores de marcaccedilatildeo do XML

Entidade Valor Uso ampamp amp Sempre utilizado para o escape do caractere amp (exceto em

seccedilotildees de CDATA) amplt lt Sempre utilizado para o escape do caractere lt (exceto em

seccedilotildees de CDATA) ampgt gt Sempre utilizado para o escape do caractere lt (ateacute mesmo

em seccedilotildees de CDATA) ampapos Pode ser usado no escape do caractere em strings literais ampquot Pode ser usado no escape do caractere em strings literais

Exemplos

ATampampT seraacute exibido ATampT

lttaggtampltlttaggt o o conteuacutedo da tag eacute lt que natildeo funcionaria assim lttaggtltlttaggt

ltlivro nome=O uso das aspas (ampquot) gt o O conteuacutedo da tag eacute O uso das aspas () que natildeo funcionaria se

fosse ltlivro nome=O uso das aspas () gt

10

28 Instruccedilotildees de processamento

Existem ocasiotildees em que eacute desejaacutevel poder passar dicas a uma aplicaccedilatildeo junto com o documento As instruccedilotildees de processamento (PIs ndash processing instructions) satildeo um mecanismo que o XML oferece para este propoacutesito

Os PIs utilizam uma sintaxe como a do elemento XML

lttarget hellipinstructionshellip gt

Uma utilizaccedilatildeo de PIs eacute na associaccedilatildeo de uma folha de estilos

ltxml-stylesheet hellip gt

29 Comentaacuterio

Pode ser uacutetil inserir notas ou comentaacuterios em um documento Estes comentaacuterios podem servir para revisatildeo histoacuterico ou qualquer outro metadados importantes contudo natildeo satildeo realmente parte do conteuacutedo de um documento

A sintaxe baacutesica de um comentaacuterio XML eacute

lt-- Comentaacuterio Qualquer --gt

Exemplos

lt-- XML de importaccedilatildeo criado por Ricardo Terra em 01jan2007 --gt ltbibliotecagt ltlivrogtltlivrogt lt-- Eis um livro --gt ltlivrogtltlivrogt lt-- Eis mais um livro --gt ltbibliotecagt

210 Seccedilotildees CDATA

Seccedilotildees CDATA satildeo um meacutetodo de inclusatildeo de texto que conteacutem caracteres que de outro forma seriam reconhecidos como marcaccedilatildeo

As seccedilotildees CDATA natildeo podem ser aninhadas e soacute devem ser utilizadas quando realmente necessaacuterio

A sintaxe baacutesica eacute

lt[CDATA[hellip]]gt onde pode ser qualquer string de caractere que natildeo seja ]]gt

Exemplo ltbibliotecagt ltlivrogt lt[CDATA[ltxml version=10gtltfaculdadegtltcurso nome=SIgtltfaculdadegt]]gt ltlivrogt ltbibliotecagt

11

3 ESQUEMAS DE VALIDACcedilAtildeO

31 Modelagem de dados

As aplicaccedilotildees podem realizar a mesma funcionalidade embora conforme as ideacuteias de Braganholo e Heuser seja completamente provaacutevel que os dados armazenados estejam modelados de forma diferente Ao citar que a modelagem estaacute diferente natildeo se refere aos campos com nomes distintos mas sim a todos os seguintes casos

Nomenclatura distinta de campos

Tipos distintos

Gravaccedilatildeo em formatos distintos

Modos de relacionamento entre os dados feitos de diferentes formas Exemplificando os trecircs primeiros casos acima posso citar o armazenamento

de um CPF (cadastro de pessoa fiacutesica) de cliente Ele pode ser armazenado com o nome de NUM_CPF ser do tipo numeacuterico ou pode ser armazenado com o nome de CPF_CLIENTE ser do tipo texto e ser armazenado com maacutescara Neste caso a mesma informaccedilatildeo pode ser extraiacuteda de ambas as bases de dados com o entendimento de forma intuitiva mas internamente foram modeladas de forma distinta

Baseado no problema acima pode-se entender o real significado da palavra intuiccedilatildeo embora o computador natildeo possua este entendimento O sistema que trabalha com o CPF na forma numeacuterica natildeo conseguiria abstrair uma informaccedilatildeo de um XML bem formado e vaacutelido cujo campo de CPF seja alfanumeacuterico Eacute neste ponto que a utilizaccedilatildeo do XSLT eacute funcionalmente adequada e antes de entrarmos no toacutepico de como fazer esta conversatildeo utilizando XSLT falaremos um pouco sobre o que eacute um documento XML bem formado e vaacutelido destacando os tipos de validaccedilotildees existentes

32 XML bem formado e vaacutelido

Segundo Myer (2005) existem dois tipos de ldquolegalidaderdquo de documentos XML documento bem formado e documento vaacutelido

Um documento XML bem formado segue as seguintes regras []

Um documento XML deve conter um uacutenico elemento raiz que contenham outros elementos

Todos os elementos devem ser corretamente aninhados

Todos os elementos devem ser fechados com uma tag ou com um ldquoauto-fechamentordquo de elemento vazio (por exemplo lttag gt)

Todos os valores de atributos devem ser citados Um documento XML vaacutelido eacute tanto bem formado quanto segue todas as regras explicitadas em um documento DTD (document type definition) Um documento vaacutelido entatildeo eacute nada mais que um documento bem formado vinculado a seu DTD (MYER 2005 Traduccedilatildeo nossa)

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 9: XML - Apostila Completa

8

A raiz do documento conteacutem uma aacutervore de elementos secundaacuterios

chamado de elemento do documento

25 Aninhamento de elementos

XML impotildee um restriccedilatildeo-chave aos documentos ndash eles precisam estar apropriadamente aninhados

Veja em HTML um exemplo

ltBgtJoatildeo foi a ltIgtEscolaltBgt mas acabou perdendo a provaltIgt

Em uma sintaxe XML isto estaria invaacutelido pois os elementos devem estar aninhados O exemplo acima em uma sintaxe XML poderia ser representado como abaixo

ltBgtJoatildeo foi a ltIgtEscolaltIgtltBgtltIgt mas acabou perdendo a provaltIgt

26 Atributos

Se os elementos satildeo ldquosubstantivosrdquo entatildeo os atributos satildeo seus ldquoadjetivosrdquo

Frequumlentemente existe alguma informaccedilatildeo sobre um elemento que queremos anexar a ele ao contraacuterio da informaccedilatildeo que eacute contida no elemento Isto pode e deve ser feito utilizando atributos cada um composto de um par nome=valor utilizando um dos seguintes formatos

nome-atributo=valor-atributo utilizando aspas duplas nome-atributo=valor-atributo utilizando aspas simples

Os atributos precisam sempre ser delimitados utilizando aspas simples ou duplas

Devem sempre ser inseridos na tag inicial ou na tag hiacutebrida de elemento vazio Exemplo

ltpessoa nome=Ricardo Terra profissao=Professor gt

ltpessoa nome=Ricardo Terra profissao=Professorgt ltpessoagt

Somente uma apariccedilatildeo de um nome de atributo eacute permitida na mesma tag Por exempo o seguinte natildeo seria legal em XML uma vez que titulo aparece duas vezes

ltlivro titulo=XML Professional titulo=Iniciando XMLgtltlivrogt

Em HTML permite atributos numeacutericos como ltimg width=300gt ou atributos natildeo delimitados como ltfont face=Arialgt - poreacutem nenhum destes eacute permitido em XML

9

27 Referecircncias de caractere e entidade

Assim como no SGML e HTML o XML oferece dois meacutetodos simples de representar os dados que natildeo existem no conjunto de caracteres ASCII

Referecircncias de caractere

Referecircncias de entidade

271 Referecircncias de caractere

Representam um caractere exibiacutevel e satildeo compostas por um nuacutemero decimal ou hexadecimal precedido por strings literais ldquoamprdquo ou ldquoampxrdquo (respectivamente) e seguidos por um ponto-e-viacutergula ()

Exemplo amp169 (notaccedilatildeo decimal) ampxA9 (notaccedilatildeo hexadecimal)

Iratildeo exibir em um browser de visualizaccedilatildeo o caractere copy

272 Referecircncias de entidade

Permitem a inserccedilatildeo de qualquer string literal no conteuacutedo de elementos ou valores de atributo assim como oferecem alternativas mnemocircnicas para referecircncia de caracteres

Satildeo um nome legal para XML precedidas por um amp e seguidas de um ponto-e-viacutergula ()

Cinco identificadores satildeo definifidos como uma parte integral do XML e satildeo usadas como sequecircncia de escape para os caracteres delimitadores de marcaccedilatildeo do XML

Entidade Valor Uso ampamp amp Sempre utilizado para o escape do caractere amp (exceto em

seccedilotildees de CDATA) amplt lt Sempre utilizado para o escape do caractere lt (exceto em

seccedilotildees de CDATA) ampgt gt Sempre utilizado para o escape do caractere lt (ateacute mesmo

em seccedilotildees de CDATA) ampapos Pode ser usado no escape do caractere em strings literais ampquot Pode ser usado no escape do caractere em strings literais

Exemplos

ATampampT seraacute exibido ATampT

lttaggtampltlttaggt o o conteuacutedo da tag eacute lt que natildeo funcionaria assim lttaggtltlttaggt

ltlivro nome=O uso das aspas (ampquot) gt o O conteuacutedo da tag eacute O uso das aspas () que natildeo funcionaria se

fosse ltlivro nome=O uso das aspas () gt

10

28 Instruccedilotildees de processamento

Existem ocasiotildees em que eacute desejaacutevel poder passar dicas a uma aplicaccedilatildeo junto com o documento As instruccedilotildees de processamento (PIs ndash processing instructions) satildeo um mecanismo que o XML oferece para este propoacutesito

Os PIs utilizam uma sintaxe como a do elemento XML

lttarget hellipinstructionshellip gt

Uma utilizaccedilatildeo de PIs eacute na associaccedilatildeo de uma folha de estilos

ltxml-stylesheet hellip gt

29 Comentaacuterio

Pode ser uacutetil inserir notas ou comentaacuterios em um documento Estes comentaacuterios podem servir para revisatildeo histoacuterico ou qualquer outro metadados importantes contudo natildeo satildeo realmente parte do conteuacutedo de um documento

A sintaxe baacutesica de um comentaacuterio XML eacute

lt-- Comentaacuterio Qualquer --gt

Exemplos

lt-- XML de importaccedilatildeo criado por Ricardo Terra em 01jan2007 --gt ltbibliotecagt ltlivrogtltlivrogt lt-- Eis um livro --gt ltlivrogtltlivrogt lt-- Eis mais um livro --gt ltbibliotecagt

210 Seccedilotildees CDATA

Seccedilotildees CDATA satildeo um meacutetodo de inclusatildeo de texto que conteacutem caracteres que de outro forma seriam reconhecidos como marcaccedilatildeo

As seccedilotildees CDATA natildeo podem ser aninhadas e soacute devem ser utilizadas quando realmente necessaacuterio

A sintaxe baacutesica eacute

lt[CDATA[hellip]]gt onde pode ser qualquer string de caractere que natildeo seja ]]gt

Exemplo ltbibliotecagt ltlivrogt lt[CDATA[ltxml version=10gtltfaculdadegtltcurso nome=SIgtltfaculdadegt]]gt ltlivrogt ltbibliotecagt

11

3 ESQUEMAS DE VALIDACcedilAtildeO

31 Modelagem de dados

As aplicaccedilotildees podem realizar a mesma funcionalidade embora conforme as ideacuteias de Braganholo e Heuser seja completamente provaacutevel que os dados armazenados estejam modelados de forma diferente Ao citar que a modelagem estaacute diferente natildeo se refere aos campos com nomes distintos mas sim a todos os seguintes casos

Nomenclatura distinta de campos

Tipos distintos

Gravaccedilatildeo em formatos distintos

Modos de relacionamento entre os dados feitos de diferentes formas Exemplificando os trecircs primeiros casos acima posso citar o armazenamento

de um CPF (cadastro de pessoa fiacutesica) de cliente Ele pode ser armazenado com o nome de NUM_CPF ser do tipo numeacuterico ou pode ser armazenado com o nome de CPF_CLIENTE ser do tipo texto e ser armazenado com maacutescara Neste caso a mesma informaccedilatildeo pode ser extraiacuteda de ambas as bases de dados com o entendimento de forma intuitiva mas internamente foram modeladas de forma distinta

Baseado no problema acima pode-se entender o real significado da palavra intuiccedilatildeo embora o computador natildeo possua este entendimento O sistema que trabalha com o CPF na forma numeacuterica natildeo conseguiria abstrair uma informaccedilatildeo de um XML bem formado e vaacutelido cujo campo de CPF seja alfanumeacuterico Eacute neste ponto que a utilizaccedilatildeo do XSLT eacute funcionalmente adequada e antes de entrarmos no toacutepico de como fazer esta conversatildeo utilizando XSLT falaremos um pouco sobre o que eacute um documento XML bem formado e vaacutelido destacando os tipos de validaccedilotildees existentes

32 XML bem formado e vaacutelido

Segundo Myer (2005) existem dois tipos de ldquolegalidaderdquo de documentos XML documento bem formado e documento vaacutelido

Um documento XML bem formado segue as seguintes regras []

Um documento XML deve conter um uacutenico elemento raiz que contenham outros elementos

Todos os elementos devem ser corretamente aninhados

Todos os elementos devem ser fechados com uma tag ou com um ldquoauto-fechamentordquo de elemento vazio (por exemplo lttag gt)

Todos os valores de atributos devem ser citados Um documento XML vaacutelido eacute tanto bem formado quanto segue todas as regras explicitadas em um documento DTD (document type definition) Um documento vaacutelido entatildeo eacute nada mais que um documento bem formado vinculado a seu DTD (MYER 2005 Traduccedilatildeo nossa)

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 10: XML - Apostila Completa

9

27 Referecircncias de caractere e entidade

Assim como no SGML e HTML o XML oferece dois meacutetodos simples de representar os dados que natildeo existem no conjunto de caracteres ASCII

Referecircncias de caractere

Referecircncias de entidade

271 Referecircncias de caractere

Representam um caractere exibiacutevel e satildeo compostas por um nuacutemero decimal ou hexadecimal precedido por strings literais ldquoamprdquo ou ldquoampxrdquo (respectivamente) e seguidos por um ponto-e-viacutergula ()

Exemplo amp169 (notaccedilatildeo decimal) ampxA9 (notaccedilatildeo hexadecimal)

Iratildeo exibir em um browser de visualizaccedilatildeo o caractere copy

272 Referecircncias de entidade

Permitem a inserccedilatildeo de qualquer string literal no conteuacutedo de elementos ou valores de atributo assim como oferecem alternativas mnemocircnicas para referecircncia de caracteres

Satildeo um nome legal para XML precedidas por um amp e seguidas de um ponto-e-viacutergula ()

Cinco identificadores satildeo definifidos como uma parte integral do XML e satildeo usadas como sequecircncia de escape para os caracteres delimitadores de marcaccedilatildeo do XML

Entidade Valor Uso ampamp amp Sempre utilizado para o escape do caractere amp (exceto em

seccedilotildees de CDATA) amplt lt Sempre utilizado para o escape do caractere lt (exceto em

seccedilotildees de CDATA) ampgt gt Sempre utilizado para o escape do caractere lt (ateacute mesmo

em seccedilotildees de CDATA) ampapos Pode ser usado no escape do caractere em strings literais ampquot Pode ser usado no escape do caractere em strings literais

Exemplos

ATampampT seraacute exibido ATampT

lttaggtampltlttaggt o o conteuacutedo da tag eacute lt que natildeo funcionaria assim lttaggtltlttaggt

ltlivro nome=O uso das aspas (ampquot) gt o O conteuacutedo da tag eacute O uso das aspas () que natildeo funcionaria se

fosse ltlivro nome=O uso das aspas () gt

10

28 Instruccedilotildees de processamento

Existem ocasiotildees em que eacute desejaacutevel poder passar dicas a uma aplicaccedilatildeo junto com o documento As instruccedilotildees de processamento (PIs ndash processing instructions) satildeo um mecanismo que o XML oferece para este propoacutesito

Os PIs utilizam uma sintaxe como a do elemento XML

lttarget hellipinstructionshellip gt

Uma utilizaccedilatildeo de PIs eacute na associaccedilatildeo de uma folha de estilos

ltxml-stylesheet hellip gt

29 Comentaacuterio

Pode ser uacutetil inserir notas ou comentaacuterios em um documento Estes comentaacuterios podem servir para revisatildeo histoacuterico ou qualquer outro metadados importantes contudo natildeo satildeo realmente parte do conteuacutedo de um documento

A sintaxe baacutesica de um comentaacuterio XML eacute

lt-- Comentaacuterio Qualquer --gt

Exemplos

lt-- XML de importaccedilatildeo criado por Ricardo Terra em 01jan2007 --gt ltbibliotecagt ltlivrogtltlivrogt lt-- Eis um livro --gt ltlivrogtltlivrogt lt-- Eis mais um livro --gt ltbibliotecagt

210 Seccedilotildees CDATA

Seccedilotildees CDATA satildeo um meacutetodo de inclusatildeo de texto que conteacutem caracteres que de outro forma seriam reconhecidos como marcaccedilatildeo

As seccedilotildees CDATA natildeo podem ser aninhadas e soacute devem ser utilizadas quando realmente necessaacuterio

A sintaxe baacutesica eacute

lt[CDATA[hellip]]gt onde pode ser qualquer string de caractere que natildeo seja ]]gt

Exemplo ltbibliotecagt ltlivrogt lt[CDATA[ltxml version=10gtltfaculdadegtltcurso nome=SIgtltfaculdadegt]]gt ltlivrogt ltbibliotecagt

11

3 ESQUEMAS DE VALIDACcedilAtildeO

31 Modelagem de dados

As aplicaccedilotildees podem realizar a mesma funcionalidade embora conforme as ideacuteias de Braganholo e Heuser seja completamente provaacutevel que os dados armazenados estejam modelados de forma diferente Ao citar que a modelagem estaacute diferente natildeo se refere aos campos com nomes distintos mas sim a todos os seguintes casos

Nomenclatura distinta de campos

Tipos distintos

Gravaccedilatildeo em formatos distintos

Modos de relacionamento entre os dados feitos de diferentes formas Exemplificando os trecircs primeiros casos acima posso citar o armazenamento

de um CPF (cadastro de pessoa fiacutesica) de cliente Ele pode ser armazenado com o nome de NUM_CPF ser do tipo numeacuterico ou pode ser armazenado com o nome de CPF_CLIENTE ser do tipo texto e ser armazenado com maacutescara Neste caso a mesma informaccedilatildeo pode ser extraiacuteda de ambas as bases de dados com o entendimento de forma intuitiva mas internamente foram modeladas de forma distinta

Baseado no problema acima pode-se entender o real significado da palavra intuiccedilatildeo embora o computador natildeo possua este entendimento O sistema que trabalha com o CPF na forma numeacuterica natildeo conseguiria abstrair uma informaccedilatildeo de um XML bem formado e vaacutelido cujo campo de CPF seja alfanumeacuterico Eacute neste ponto que a utilizaccedilatildeo do XSLT eacute funcionalmente adequada e antes de entrarmos no toacutepico de como fazer esta conversatildeo utilizando XSLT falaremos um pouco sobre o que eacute um documento XML bem formado e vaacutelido destacando os tipos de validaccedilotildees existentes

32 XML bem formado e vaacutelido

Segundo Myer (2005) existem dois tipos de ldquolegalidaderdquo de documentos XML documento bem formado e documento vaacutelido

Um documento XML bem formado segue as seguintes regras []

Um documento XML deve conter um uacutenico elemento raiz que contenham outros elementos

Todos os elementos devem ser corretamente aninhados

Todos os elementos devem ser fechados com uma tag ou com um ldquoauto-fechamentordquo de elemento vazio (por exemplo lttag gt)

Todos os valores de atributos devem ser citados Um documento XML vaacutelido eacute tanto bem formado quanto segue todas as regras explicitadas em um documento DTD (document type definition) Um documento vaacutelido entatildeo eacute nada mais que um documento bem formado vinculado a seu DTD (MYER 2005 Traduccedilatildeo nossa)

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 11: XML - Apostila Completa

10

28 Instruccedilotildees de processamento

Existem ocasiotildees em que eacute desejaacutevel poder passar dicas a uma aplicaccedilatildeo junto com o documento As instruccedilotildees de processamento (PIs ndash processing instructions) satildeo um mecanismo que o XML oferece para este propoacutesito

Os PIs utilizam uma sintaxe como a do elemento XML

lttarget hellipinstructionshellip gt

Uma utilizaccedilatildeo de PIs eacute na associaccedilatildeo de uma folha de estilos

ltxml-stylesheet hellip gt

29 Comentaacuterio

Pode ser uacutetil inserir notas ou comentaacuterios em um documento Estes comentaacuterios podem servir para revisatildeo histoacuterico ou qualquer outro metadados importantes contudo natildeo satildeo realmente parte do conteuacutedo de um documento

A sintaxe baacutesica de um comentaacuterio XML eacute

lt-- Comentaacuterio Qualquer --gt

Exemplos

lt-- XML de importaccedilatildeo criado por Ricardo Terra em 01jan2007 --gt ltbibliotecagt ltlivrogtltlivrogt lt-- Eis um livro --gt ltlivrogtltlivrogt lt-- Eis mais um livro --gt ltbibliotecagt

210 Seccedilotildees CDATA

Seccedilotildees CDATA satildeo um meacutetodo de inclusatildeo de texto que conteacutem caracteres que de outro forma seriam reconhecidos como marcaccedilatildeo

As seccedilotildees CDATA natildeo podem ser aninhadas e soacute devem ser utilizadas quando realmente necessaacuterio

A sintaxe baacutesica eacute

lt[CDATA[hellip]]gt onde pode ser qualquer string de caractere que natildeo seja ]]gt

Exemplo ltbibliotecagt ltlivrogt lt[CDATA[ltxml version=10gtltfaculdadegtltcurso nome=SIgtltfaculdadegt]]gt ltlivrogt ltbibliotecagt

11

3 ESQUEMAS DE VALIDACcedilAtildeO

31 Modelagem de dados

As aplicaccedilotildees podem realizar a mesma funcionalidade embora conforme as ideacuteias de Braganholo e Heuser seja completamente provaacutevel que os dados armazenados estejam modelados de forma diferente Ao citar que a modelagem estaacute diferente natildeo se refere aos campos com nomes distintos mas sim a todos os seguintes casos

Nomenclatura distinta de campos

Tipos distintos

Gravaccedilatildeo em formatos distintos

Modos de relacionamento entre os dados feitos de diferentes formas Exemplificando os trecircs primeiros casos acima posso citar o armazenamento

de um CPF (cadastro de pessoa fiacutesica) de cliente Ele pode ser armazenado com o nome de NUM_CPF ser do tipo numeacuterico ou pode ser armazenado com o nome de CPF_CLIENTE ser do tipo texto e ser armazenado com maacutescara Neste caso a mesma informaccedilatildeo pode ser extraiacuteda de ambas as bases de dados com o entendimento de forma intuitiva mas internamente foram modeladas de forma distinta

Baseado no problema acima pode-se entender o real significado da palavra intuiccedilatildeo embora o computador natildeo possua este entendimento O sistema que trabalha com o CPF na forma numeacuterica natildeo conseguiria abstrair uma informaccedilatildeo de um XML bem formado e vaacutelido cujo campo de CPF seja alfanumeacuterico Eacute neste ponto que a utilizaccedilatildeo do XSLT eacute funcionalmente adequada e antes de entrarmos no toacutepico de como fazer esta conversatildeo utilizando XSLT falaremos um pouco sobre o que eacute um documento XML bem formado e vaacutelido destacando os tipos de validaccedilotildees existentes

32 XML bem formado e vaacutelido

Segundo Myer (2005) existem dois tipos de ldquolegalidaderdquo de documentos XML documento bem formado e documento vaacutelido

Um documento XML bem formado segue as seguintes regras []

Um documento XML deve conter um uacutenico elemento raiz que contenham outros elementos

Todos os elementos devem ser corretamente aninhados

Todos os elementos devem ser fechados com uma tag ou com um ldquoauto-fechamentordquo de elemento vazio (por exemplo lttag gt)

Todos os valores de atributos devem ser citados Um documento XML vaacutelido eacute tanto bem formado quanto segue todas as regras explicitadas em um documento DTD (document type definition) Um documento vaacutelido entatildeo eacute nada mais que um documento bem formado vinculado a seu DTD (MYER 2005 Traduccedilatildeo nossa)

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 12: XML - Apostila Completa

11

3 ESQUEMAS DE VALIDACcedilAtildeO

31 Modelagem de dados

As aplicaccedilotildees podem realizar a mesma funcionalidade embora conforme as ideacuteias de Braganholo e Heuser seja completamente provaacutevel que os dados armazenados estejam modelados de forma diferente Ao citar que a modelagem estaacute diferente natildeo se refere aos campos com nomes distintos mas sim a todos os seguintes casos

Nomenclatura distinta de campos

Tipos distintos

Gravaccedilatildeo em formatos distintos

Modos de relacionamento entre os dados feitos de diferentes formas Exemplificando os trecircs primeiros casos acima posso citar o armazenamento

de um CPF (cadastro de pessoa fiacutesica) de cliente Ele pode ser armazenado com o nome de NUM_CPF ser do tipo numeacuterico ou pode ser armazenado com o nome de CPF_CLIENTE ser do tipo texto e ser armazenado com maacutescara Neste caso a mesma informaccedilatildeo pode ser extraiacuteda de ambas as bases de dados com o entendimento de forma intuitiva mas internamente foram modeladas de forma distinta

Baseado no problema acima pode-se entender o real significado da palavra intuiccedilatildeo embora o computador natildeo possua este entendimento O sistema que trabalha com o CPF na forma numeacuterica natildeo conseguiria abstrair uma informaccedilatildeo de um XML bem formado e vaacutelido cujo campo de CPF seja alfanumeacuterico Eacute neste ponto que a utilizaccedilatildeo do XSLT eacute funcionalmente adequada e antes de entrarmos no toacutepico de como fazer esta conversatildeo utilizando XSLT falaremos um pouco sobre o que eacute um documento XML bem formado e vaacutelido destacando os tipos de validaccedilotildees existentes

32 XML bem formado e vaacutelido

Segundo Myer (2005) existem dois tipos de ldquolegalidaderdquo de documentos XML documento bem formado e documento vaacutelido

Um documento XML bem formado segue as seguintes regras []

Um documento XML deve conter um uacutenico elemento raiz que contenham outros elementos

Todos os elementos devem ser corretamente aninhados

Todos os elementos devem ser fechados com uma tag ou com um ldquoauto-fechamentordquo de elemento vazio (por exemplo lttag gt)

Todos os valores de atributos devem ser citados Um documento XML vaacutelido eacute tanto bem formado quanto segue todas as regras explicitadas em um documento DTD (document type definition) Um documento vaacutelido entatildeo eacute nada mais que um documento bem formado vinculado a seu DTD (MYER 2005 Traduccedilatildeo nossa)

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 13: XML - Apostila Completa

12

Em siacutentese podemos definir um documento XML bem formado como aquele

documento XML que segue todas as definiccedilotildees do W3C para seu desenvolvimento e documento XML vaacutelido aquele documento XML bem formado que estaacute vinculado a um documento DTD ou a uma XML Schema (Esquema XML) de validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Figura 2 Estrutura de um XML bem formado Fonte REFSNES 2006

Na figura 2 eacute demonstrada a estrutura de um XML bem formado e na seccedilatildeo seguinte veremos como vinculaacute-lo a uma validaccedilatildeo DTD e a um XML Schema

33 Esquemas de validaccedilatildeo

A validaccedilatildeo de um XML pode ser realizada tanto por um documento DTD como por um XML Schema

O DTD foi criado antes do XML Schema ldquoO propoacutesito de um documento DTD eacute definir os blocos de construccedilatildeo legais de um documento XML Ele define a estrutura do documento com uma lista de elementos legais Um DTD pode ser declarado dentro do seu documento XML ou como uma referecircncia externardquo (REFSNES 2006 Traduccedilatildeo nossa) Mas porquecirc utilizar o DTD

Com o DTD cada um de seus documentos XML podem carregar neles proacuteprios uma descriccedilatildeo com seu proacuteprio formato Com o DTD grupos independentes de pessoas podem aceitar utilizar um DTD comum para compartilhar dados Sua aplicaccedilatildeo pode utilizar um DTD padratildeo para verificar se o dado que estaacute recebendo do meio externo eacute vaacutelido Vocecirc tambeacutem pode utilizar o DTD para verificar seus proacuteprios dados (INTRODUCTION TO DTD W3C Traduccedilatildeo nossa)

Conforme W3C o XML Schema tem exatamente o mesmo propoacutesito que o DTD poreacutem com o intuito de ser a sucessora do DTD O XML Schema como toda nova tecnologia que possui a intenccedilatildeo de substituir uma tecnologia legada apresenta-se como mais poderosa e eficaz

Noacutes pensamos que tatildeo logo XML Schemas seratildeo utilizados na maioria das aplicaccedilotildees Web como uma substituiccedilatildeo aos DTDs Estas satildeo algumas razotildees

XML Schemas satildeo extensiacuteveis para adiccedilotildees futuras

XML Schemas satildeo mais ricos e mais uacuteteis que os DTDs

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 14: XML - Apostila Completa

13

XML Schemas satildeo escritos em XML

XML Schemas suportam tipos de dados

XML Schemas suportam namespaces

(INTRODUCTION TO XML SCHEMA W3C 2006 Traduccedilatildeo nossa)

O mais interessante do XML Schema eacute o suporte aos tipos de dados O DTD somente consegue validar se eacute um tipo binaacuterio (PCDATA) ou tipo alfanumeacuterico (CDATA) enquanto o XML Schema possui vaacuterios tipos de dados o que o torna mais ricos e com validaccedilotildees mais uacuteteis Por ser escrito em formato XML pode ser transformado em outro XML Schema utilizando o XSLT conferindo a ele a extensibilidade citada pelo W3C Observando a quantidade de novos recursos que o XML Schema oferece conclui-se que o XML Schema sucederaacute o DTD em pouco tempo Veremos na Figura 3 um exemplo demonstrando um XML vinculado a uma validaccedilatildeo DTD e uma validaccedilatildeo pelo XML Schema

Conclui-se que a validaccedilatildeo por DTD possui menos recursos enquanto que pelo XML Schema eacute bem mais rica mas pode-se tambeacutem observar que a validaccedilatildeo

ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget meltbodygt ltnotegt

ltxml version=10gt ltnote xmlns=httpwwww3schoolscom xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwww3schoolscom notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwww3schoolscom xmlns=httpwwww3schoolscom elementFormDefault=qualifiedgt ltxselement name=notegt ltxscomplexTypegt ltxssequencegt

ltxselement name=to type=xsstringgt

ltxselement name=from type=xsstringgt

ltxselement name=heading type=xsstringgt

ltxselement name=body type=xsstringgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

ltELEMENT note (to from heading body)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 15: XML - Apostila Completa

14

por DTD eacute bem mais simples e faacutecil ao contraacuterio do XML Schema que eacute um pouco mais difiacutecil ou melhor mais avanccedilada

34 DTD

Um DTD define blocos de construccedilatildeo legal de um documento XML Ele define a estrutura do documento com uma lista de elementos legais

Um DTD pode ser declarado dentro de um documento XML (o que pode permitir standalone=rdquoyesrdquo) ou como uma referecircncia externa

341 Declaraccedilatildeo Interna

Se um DTD eacute incluido no proacuteprio arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element [element-declarations]gt

Exemplo de um documento XML com um DTD declarado internamente ltxml version=10gt ltDOCTYPE note [ ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt ]gt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

342 Declaraccedilatildeo Externa

Se um DTD estaacute externo ao arquivo do documento XML ele deve ser encapsulado em um definiccedilatildeo DOCTYPE com a seguinte sintaxe

ltDOCTYPE root-element SYSTEM filenamegt

Exemplo de um documento XML com um DTD declarado externamente ltxml version=10gt ltDOCTYPE note SYSTEM notedtdgt ltnotegt lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

E do arquivo notedtd contendo o respectivo DTD

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 16: XML - Apostila Completa

15

ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

343 Blocos de Construccedilatildeo de Documento XML

No ponto de vista do DTD todos os documentos XML satildeo formados pela os seguintes simples blocos de construccedilatildeo

Elementos Elementos satildeo os principais blocos de construccedilatildeo de documentos Como jaacute foi visto elementos pode conter texto outros elementos ou simplesmente ser vazios

Exemplos ltbodygtbody text in betweenltbodygt

ltmessagegtsome message in betweenltmessagegt

Atributos Atributos provecircm informaccedilotildees extras sobre os elementos Atributos satildeo sempre inseridos dentro na tag inicial do elemento Atributos sempre vem na forma de pares de nomevalor

O elemento ldquoimgrdquo tem informaccedilatildeo adicional observe ltimg src=computergif gt

O nome do elemento eacute ldquoimgrdquo O nome do atributo eacute ldquosrcrdquo O valor do atributo eacute computergif Partindo do pressuposto que o elemento eacute vazio ele eacute fechado utilizando uma marcaccedilatildeo hiacutebrida de aberturafechamento

Entidades Como jaacute visto entidades satildeo variaacuteveis usadas para definir texto comum

PCDATA PCDATA significa dados de caracteres a ser feito o parser O texto sera examinado pelo parser para entidades e marcaccedilotildees As marcaccedilotildees e entidades seratildeo reconhecidas pelo parser

CDATA CDATA significa tambeacutem dados de caractere CDATA eacute um texto que NAtildeO seraacute tratado pelo parser Elementos e

entidades natildeo seratildeo tratados como elementos e entidades respectivamente

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 17: XML - Apostila Completa

16

344 Elementos

Em DTD a declaraccedilatildeo de elementos possui uma sintaxe proacutepria ltELEMENT element-name categorygt

ou ltELEMENT element-name (element-content)gt

Elementos Vazios satildeo declarados utilizando a palavra-chave de categoria EMPTY

ltELEMENT element-name EMPTYgt

example

ltELEMENT br EMPTYgt

XML example ltbr gt

Obs Vale observar que a sintaxe ltbrgtltbrgt tambeacutem eacute vaacutelida mas a sintaxe de marcaccedilatildeo hiacutebrida eacute muito mais elegante

Elementos Com Somente Dados de Caracteres a serem feitos parser satildeo declarados com PCDATA dentro de parecircnteses

ltELEMENT element-name (PCDATA)gt

example

ltELEMENT from (PCDATA)gt

Elementos Com Qualquer Conteuacutedo Elementos declarados utilizando a palavra-chave de categoria ANY podem conter qualquer combinaccedilatildeo de dados a serem feitos o parser

ltELEMENT element-name ANYgt

example

ltELEMENT note ANYgt

Elementos Com Filhos (sequumlecircncia) Elementos com um ou mais filhos satildeo definidos com o nome do(s) elemento(s) filho(s) dentro de parecircnteses

ltELEMENT element-name (child-element-name)gt

ou ltELEMENT element-name (child-element-namechild-element-name)gt

example

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 18: XML - Apostila Completa

17

ltELEMENT note (tofromheadingbody)gt

Quando filhos satildeo declarados em uma sequecircncia separada por viacutergulas os filhos devem obrigatoriamente aparecer na mesma sequumlecircncia no documento Em uma declaraccedilatildeo completa os filhos tambeacutem devem ser declarados e podem tambeacutem pode conter filhos A declaraccedilatildeo completa do elemento ldquonoterdquo ficaria assim ltELEMENT note (tofromheadingbody)gt ltELEMENT to (PCDATA)gt ltELEMENT from (PCDATA)gt ltELEMENT heading (PCDATA)gt ltELEMENT body (PCDATA)gt

Declarando somente uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

A declaraccedilatildeo acima declara que o elemento filho (ldquomessagerdquo) deve ocorrer uma e somente uma vez dentro do elemento ldquonoterdquo

Declarando pelo menos uma ocorrecircncia de um elemento ltELEMENT element-name (child-name+)gt

example

ltELEMENT note (message+)gt

O sinal + neste exemplo declara que o elemento filho (ldquomessagerdquo) deve ocorrer pelo menos uma vez dentro do elemento ldquonoterdquo

Declarando zero ou mais ocorrecircncias de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer nenhuma ou mais vezes dentro do elemento ldquonoterdquo

Declarando zero ou uma ocorrecircncia de um elemento ltELEMENT element-name (child-name)gt

example

ltELEMENT note (message)gt

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 19: XML - Apostila Completa

18

O sinal neste exemplo declara que o elemento filho (ldquomessagerdquo) pode ocorrer ou natildeo uma uacutenica vez dentro do elemento ldquonoterdquo

Declarando conteuacutedo com opccedilotildees

example

ltELEMENT note (tofromheader(message|body))gt

O exemplo acima declara que o elemento ldquonoterdquo deve conter um elemento to um elemento from um elemento header e um elemento ldquomessage ou um elemento body Mas nunca ambos

Declarando conteuacutedo misto example

ltELEMENT note (PCDATA|to|from|header|message)gt

O exemplo acima declara que o elemento note pode conter zero ou mais ocorrecircncias de caracteres elementos ldquotordquo from header ou message

Observe as variaccedilotildees que podem ser feitas

ltELEMENT foo (A (B | C) )gt

O elemento foo tem sempre 2 filhos o primeiro que eacute sempre o elemento lsquoArsquo E o segundo eacute uma opccedilatildeo entre lsquoBrsquo e lsquoCrsquo

ltELEMENT foo (A B C )gt

Agora o elemento foo tem 2 ou 3 filhos em sequumlecircncia estrita lsquoBrsquo eacute opcional

ltELEMENT foo (A ( (B C) | D ) E)gt

O primeiro elemento pode ser lsquoArsquo lsquoBrsquo ou lsquoCrsquo Pode ter de 1 a 4 elementos dependendo da opccedilatildeo feita

o lsquoArsquo eacute opcional o Iraacute aparecer lsquoBrsquo e lsquoCrsquo ou lsquoDrsquo o lsquoErsquo tambeacutem eacute opcional

ltELEMENT foo ( (A B) | (C | D) )gt

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 20: XML - Apostila Completa

19

O elemento foo tem agora 1 ou 2 filhos lsquoArsquo ou lsquoBrsquo apareceratildeo nesta ordem ou lsquoCrsquo ou lsquoDrsquo aparece

ltELEMENT foo ( (A B)+ | (C | D) )gt

Agora podemos ter uma lista repetidora do par lsquoArsquo e lsquoBrsquo ou uma uacutenica ocorrecircncia de lsquoCrsquo ou lsquoDrsquo

ltELEMENT foo ( A (B C) D+ )gt

Temos um lsquoArsquo seguido de zero ou mais pares

de lsquoBrsquo e lsquoCrsquo e pelo menos um

lsquoDrsquo

345 Atributos

Em DTD a atributos satildeo declarados utilizando uma declaraccedilatildeo ATTLIST observe sua sintaxe

ltATTLIST element-name attribute-name attribute-type default-valuegt

example

DTD example ltATTLIST payment type CDATA checkgt

XML example ltpayment type=check gt

Principais tipos de atributos (attribute-type) satildeo Valor Explicaccedilatildeo

CDATA O valor eacute dado de caractere

(en1en2en3)

O valor deve ser um dos citados na lista enumerada

ID O valor eacute um ID uacutenico para o elemento atual

IDREF O valor eacute um ID de um outro elemento

Os valores padrotildees (default-value) satildeo Valor Explicaccedilatildeo

value O valor padratildeo do atributo isto eacute se natildeo tiver um valor este seraacute o valor adotado

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 21: XML - Apostila Completa

20

REQUIRED O atributo eacute obrigatoacuterio

IMPLIED O atributo eacute opcional

FIXED value O valor do atributo eacute fixo isto eacute deve ser igual ao explicitado

Especificando um atributo com valor padratildeo DTD ltELEMENT square EMPTYgt ltATTLIST square width CDATA 0gt

Valid XML ltsquare width=100 gt

O exemplo acima o elemento square eacute definido como sendo um elemento vazio (sem conteuacutedo) com um uacutenico atributo width do tipo CDATA Se o atributo natildeo for especificado o valor padratildeo eacute 0 (zero)

Especificando um atributo com valor uacutenico DTD ltELEMENT contato EMPTYgt ltATTLIST contato matricula ID REQUIREDgt

XML vaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR5678rdquogt

XML invaacutelido ltcontato matricula=rdquoR1234rdquogt ltcontato matricula=rdquoR1234rdquogt

O exemplo acima o elemento contato eacute definido como tendo um uacutenico atributo matriacutecula do tipo ldquoIDrdquo isto indica que este atributo deve ser uacutenico (natildeo pode se repetir) para todo o documento XML

Especificando um atributo com opccedilotildees de valores Sintaxe ltATTLIST element-name attribute-name (en1|en2|) default-valuegt

DTD example ltATTLIST payment type (check|cash) cashgt

XML example ltpayment type=check gt

ou ltpayment type=cash gt

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 22: XML - Apostila Completa

21

O exemplo acima o elemento payment eacute definido como tendo um uacutenico atributo type do tipo enumerado possibilitando os valores lsquocheckrsquo ou lsquocashrsquo Se o valor do atributo natildeo for um dos acima o documento natildeo estaraacute vaacutelido

Atributo Opcional (IMPLIED)

Deve-se utilizar IMPLIED quando natildeo deseja que o atributo seja obrigatoacuterio (torna-se opcional) e natildeo tem uma opccedilatildeo para o valor default

Sintaxe ltATTLIST element-name attribute-name attribute-type IMPLIEDgt

Exemplo DTD ltATTLIST contact fax CDATA IMPLIEDgt

XML Vaacutelido ltcontact fax=555-667788 gt

XML Vaacutelido ltcontact gt

O exemplo acima indica que o elemento lsquocontactrsquo pode ou natildeo ter o atributo lsquofaxrsquo

Atributo Obrigatoacuterio (REQUIRED) Deve-se utilizar REQUIRED quando natildeo tem um valor padratildeo (default-value) mas deseja forccedilar que o atributo esteja presente isto eacute seja obrigatoacuterio

Sintaxe ltATTLIST element-name attribute_name attribute-type REQUIREDgt

Exemplo DTD ltATTLIST person number CDATA REQUIREDgt

XML Vaacutelido ltperson number=5677 gt

XML Invaacutelido ltperson gt

O exemplo acima indica que o elemento lsquopersonrsquo deve obrigatoriamente possuir um atributo lsquonumberrsquo

Atributo Fixo (FIXED)

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 23: XML - Apostila Completa

22

Deve-se utilizar FIXED quando deseja que um atributo tenha um valor fixo natildeo permitindo que o autor do documento o altere Se o autor informar outro valor o parser XML retornaraacute um erro

Sintaxe ltATTLIST element-name attribute-name attribute-type FIXED valuegt

Exemplo DTD ltATTLIST sender company CDATA FIXED Microsoftgt

XML Vaacutelido ltsender company=Microsoft gt

XML Invaacutelido ltsender company=W3Schools gt

O exemplo acima indica que o elemento lsquosenderrsquo tem um atributo lsquocompanyrsquo cujo valor eacute lsquoMicrosoftlsquo Se o autor explicitar o atributo e inserir um outro valor o documento XML deixaraacute de ser vaacutelido

346 Entidades

Entidades satildeo variaacuteveis utilizadas para definir atalhos para texto comum Podem ser declaradas no proacuteprio documento XML (declaraccedilatildeo interna) ou em um DTD externo

Jaacute existem vaacuterias entidades preacute-fixadas na linguagem XML satildeo elas

Entidade Valor ampamp amp

amplt lt ampgt gt

ampapos ampquot

Para criaccedilatildeo de novas entidades deve ser utilizada a sintaxe ltENTITY entity-name entity-valuegt

Para a utilizaccedilatildeo deveraacute ter o nome precedido de lsquoamplsquo e terminaccedilatildeo com lsquolsquo (ponto-viacutergula) como utilizado pelas referecircncias de entidades padrotildees

Observe exemplo de um XML vinculado ao DTD utilizando declaraccedilatildeo interna

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 24: XML - Apostila Completa

23

ltxml version=10gt ltDOCTYPE a [ ltENTITY terra Ricardo Terragt ]gt ltagt ampterra ltagt

A saiacuteda produzida por um visualizador seria algo como

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 25: XML - Apostila Completa

24

35 XML Schema

Existem algumas caracteriacutesticas do XML Schema que devem ser lembradas e nunca esquecidas

XML Schema tambeacutem eacute um padratildeo W3C

XML Schema eacute um alternativa baseada em XML para o DTD

Um XML Schema como o DTD descreve a estrutura de um documento XML

XML Schema tambeacutem eacute conhecido como XML Schema Definition o que eacute faz com que sua extensatildeo seja (XSD)

XML Schema vem como sucessor do DTD principalmente por o ser extensiacutevel o ser mais rico e mais poderoso o ser escrito em XML o suportar tipos de dados o suportar espaccedilo de nomes (namespaces)

O nosso interesse natildeo eacute dominar todo o XML Schema pois o mesmo eacute muito amplo Nosso intuito eacute aprender a utilizaacute-lo visando os mais utilizados recursos da linguagem

351 Declaraccedilatildeo

Observe abaixo o XML com a referecircncia para um XML Schema

ltxml version=10gt ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt

lttogtTovelttogt ltfromgtJaniltfromgt ltheadinggtReminderltheadinggt ltbodygtDont forget me this weekendltbodygt ltnotegt

Como pode ser visto o XML Schema sempre utiliza a declaraccedilatildeo externa Veremos no toacutepico a seguir uma explicaccedilatildeo sobre os valores dos novos atributos de note

352 O elemento Schema

O elemento ldquoschemardquo eacute a raiz de todo XML Schema

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 26: XML - Apostila Completa

25

ltxml version=10gt ltxsschemagt ltxsschemagt

O elemento ldquoschemardquo pode conter alguns atributos Uma declaraccedilatildeo de um esquema geralmente parece com isto

ltxml version=10gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema targetNamespace=httpwwwricardoterracombr xmlns=httpwwwricardoterracombr elementFormDefault=qualifiedgt ltxsschemagt

O seguinte atributo xmlnsxs=httpwwww3org2001XMLSchema

indica que os elementos e tipos de dados usados no esquema (schema element complexType sequence string boolean etc) vecircm do namespace httpwwww3org2001XMLSchema Ele tambeacutem especifica que os elementos e tipos de dados que vecircm de httpwwww3org2001XMLSchema devem ser prefixados com xs

O seguinte atributo targetNamespace=httpwwwricardoterracombr

indica que os elementos definidos por este esquema(no exemplo note to from heading body) vecircm do namespace httpwwwricardoterracombr

O seguinte atributo xmlns=httpwwwricardoterracombr

indica que o namespace padratildeo eacute httpwwwricardoterracombr

O seguinte atributo elementFormDefault=qualified

indica que todo elemento usado por uma instacircncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace

353 Referenciando um Schema em um documento XML

Este documento XML tem uma referecircncia para um XML Schema

ltxml version=10gt

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 27: XML - Apostila Completa

26

ltnote xmlns=httpwwwricardoterracombr xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpwwwricardoterracombr notexsdgt lttogtTovelttogt

ltfromgtJaniltfromgt

ltheadinggtReminderltheadinggt

ltbodygtDont forget me this weekendltbodygt ltnotegt

O seguinte atributo

xmlns=httpwwwricardoterracombr

especifica a declaraccedilatildeo de namespace padratildeo Esta declaraccedilatildeo diz ao validador de esquema que os elementos usados neste documento XML satildeo declarados no namespace httpwwwricardoterracombr

Uma vez que vocecirc tem uma instacircncia XML Schema do namespace disponiacutevel xmlnsxsi=httpwwww3org2001XMLSchema-instance

vocecirc pode usar o atributo ldquoschemaLocationrdquo Este atributo tem dois valores O primeiro eacute o namespace usado O segundo eacute a localizaccedilatildeo do esquema XML para se usado pelo namespace

xsischemaLocation=httpwwwricardoterracombr notexsdgt

354 Elementos XSD Simples

XML Schemas define os elementos de um arquivo XML Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

O que eacute um elemento simples

Um elemento simples eacute um elemento XML que conteacutem apenas texto Ele natildeo pode conter outros elementos ou atributos

Entretanto a restriccedilatildeo apenas texto eacute pouco clara O texto pode ser de diferentes tipos Pode ser um dos tipos inclusos na definiccedilatildeo de XML Schema (boolean string date etc) ou um tipo personalizado que vocecirc mesmo pode definir

Como definir um elemento simples

A sintaxe para definir um elemento simples eacute

ltxselement name=xxx type=yyy gt

onde xxx eacute o nome do elemento e yyy eacute o tipo de dado do elemento

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 28: XML - Apostila Completa

27

Aqui estaacute alguns elementos XML

ltsobrenomegtRefsnesltsobrenomegt ltidadegt34ltidadegt ltdataNascimentogt1968-03-27ltdataNascimentogt

E aqui as suas respectivas definiccedilotildees ltxselement name=sobrenome typexsstring gt ltxselement name=idade type=xsinteger gt ltxselement name=dataNascimento type=xsdate gt

Tipos de dados XML Schema comuns

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixos para elementos simples

Elementos simples podem ter um conjunto de valores e dentro deste conjunto um valor padratildeo ou um valor fixo Um valor padratildeo eacute automaticamente atribuiacutedo ao elemento quando nenhum outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute red

ltxselement name=color type=xsstring default=red gt

Um valor fixo tambeacutem eacute atribuiacutedo automaticamente ao elemento Vocecirc natildeo pode especificar outro valor No exemplo a seguir o valor fixo eacute red

ltxselement name=color type=xsstring fixed=red gt

Atributos XSD

Todos atributos satildeo declarados como tipos simples Apenas elementos complexos tem atributos

O que eacute um atributo

Elementos simples natildeo podem ter atributos Se um elemento tem atributos ele eacute considerado do tipo complexo Mas atributos satildeo declarados como tipos simples Isso significa que um elemento com atributos sempre tem uma definiccedilatildeo do tipo complexo

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 29: XML - Apostila Completa

28

Como definir um atributo

A sintaxe para definir um atributo eacute

ltxsattribute name=xxx type=yyy gt

onde xxx eacute o nome do atributo e yyy eacute o tipo de dado do atributo

Aqui estaacute um elemento XML com um atributo

ltlastname lang=ENgtSmithltlastnamegt

E aqui a definiccedilatildeo correspondente do atributo

ltxsattribute name=lang type=xsstring gt

Tipos de dados comuns do XML Schema

XML Schema tem vaacuterios tipos de dados proacuteprios Aqui estaacute uma lista dos mais comuns

xsstring

xsdecimal

xsinteger

xsboolean

xsdate

xstime

Declare valores padratildeo e fixo para atributos

Atributos podem ter valores padratildeo ou fixo especificados Um valor padratildeo eacute atribuiacutedo automaticamente ao atributo quando nenhum

outro valor eacute especificado No exemplo seguinte o valor padratildeo eacute EN

ltxsattribute name=lang type=xsstring default=ENgt

Um valor fixo eacute atribuiacutedo automaticamente ao atributo Vocecirc natildeo pode especificar outro valor No exemplo seguinte o valor fixo eacute EN

ltxsattribute name=lang type=xsstring fixed=EN gt

Criando atributos opcionais e obrigatoacuterios

Todos atributos satildeo opcionais por padratildeo Para explicitar que um atributo eacute opcional utilize o atributo use com o valor ldquooptionalrdquo (em DTD era IMPLIED)

ltxsattribute name=lang type=xsstring use=optional gt

Para fazer um atributo obrigatoacuterio ltxsatrribute name=lang type=xsstring use=required gt

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 30: XML - Apostila Completa

29

Restriccedilotildees de conteuacutedo Quando um elemento ou um atributo XML tem um tipo definido isto cria uma

restriccedilatildeo ao conteuacutedo dele Se um elemento XML eacute do tipo xsdate e conteacutem um string como Olaacute Mundo o elemento natildeo vai ser validado

Mas como o XML Schema eacute extensiacutevel isto natildeo para por aiacute vocecirc mesmo pode adicionar suas proacuteprias restriccedilotildees aos seus elementos e atributos XML Estas restriccedilotildees satildeo chamadas facets Vocecirc pode ler mais sobre facets no proacuteximo capiacutetulo

Restriccedilotildeesfacets XSD Restriccedilotildees satildeo usadas para controlar os valores aceitos para elementos e

atributos XML Restriccedilotildees em elementos XML satildeo chamados facets

Restriccedilotildees em valores Este exemplo define um elemento chamado idade com uma restriccedilatildeo O

valor do atributo ldquoidaderdquo deve estar entre 0 e 100

ltxselement name=idadegt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxsminInclusive value=0 gt ltxsmaxInclusive value=100 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Restriccedilotildees em conjuntos de valores Para limitar o conteuacutedo de um elemento XML em um conjunto de valores

aceitaacuteveis noacutes podemos usar restriccedilotildees enumeradas Este exemplo define um elemento chamado estado

ltxselement name=estadogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsenumeration value-MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento estado eacute um tipo simples com restriccedilatildeo Os valores aceitaacuteveis satildeo MG RJ e SP O exemplo acima tambeacutem poderia ser escrito assim

ltxselement name=estado type=listaEstado gt

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 31: XML - Apostila Completa

30

ltxssimpleType name= listaEstadogt ltxsrestriction base=xsstringgt ltxsenumeration value=MG gt ltxsenumeration value=RJ gt ltxsenumeration value=SP gt ltxsrestrictiongt ltxssimpleTypegt

Nota Neste caso o tipo listaEstado pode ser compartilhado por outros elementos porque ele natildeo eacute parte do elemento estado

Restriccedilotildees em seacuteries de valores Para limitar o conteuacutedo de um elemento XML em uma seacuterie de nuacutemeros ou

letras podemos utilizar a restriccedilatildeo de padratildeo conhecidas como expressatildeo regular (regular expression)

O exemplo abaixo define o elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute do tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das letras MINUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxs restriction base=xsstringgt ltxspattern value=[A-Z][A-Z][A-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento initials eacute simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel satildeo TREcircS letras MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado initials

ltxselement name=initialsgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspatter value=[a-zA-Z][a-zA-Z][a-zA-Z] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 32: XML - Apostila Completa

31

O elemento initials eacute do tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel

satildeo TREcircS letras MINUacuteSCULAS ou MAIUacuteSCULAS de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado choice

ltxselement name=choicegt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[xyz] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento choice eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute UMA das seguintes letras x y ou z

O exemplo abaixo define um elemento chamado prodid

ltxselement name=prodidgt ltxssimpleTypegt ltxsrestriction base=xsintegergt ltxspatter value=[0-9][0-9][0-9][0-9][0-9] gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento prodid eacute um tipo simples com restriccedilatildeo O uacutenico valor aceitaacutevel satildeo CINCO diacutegitos em sequumlecircncia e cada diacutegito deve estar entre 0 e 9

Outras restriccedilotildees em seacuteries de valores Algumas outras restriccedilotildees que podem ser definidas por restriccedilatildeo de padratildeo O exemplo abaixo define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=([a-z]) gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute zero ou mais ocorrecircncias de letras minuacutesculas de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo tambeacutem define um elemento chamado letter

ltxselement name=lettergt ltxssimpleTypegt ltxsrestriction base=xsstringgt

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 33: XML - Apostila Completa

32

ltxspattern value=([a-z][A-Z])+ gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento letter eacute um tipo simples com uma restriccedilatildeo O valor aceitaacutevel eacute uma ou mais ocorrecircncias de um letra minuacutescula seguida de uma letra maiuacutescula de lsquoarsquo ateacute lsquozrsquo

O exemplo abaixo define um elemento chamado sexo

ltxselement name=sexogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=masculino|feminino gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento gender eacute um tipo simples com uma restriccedilatildeo O uacutenico valor aceitaacutevel eacute lsquomasculinorsquo ou feminino

O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxspattern value=[a-zA-Z0-9]8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo Deve haver exatamente oito caracteres e estes caracteres devem ser letras minuacutesculas ou maiuacutesculas de lsquoarsquo ateacute lsquoxrsquo ou um nuacutemero de 0 a 9

Restriccedilotildees em caracteres vazios Para especificar como um caractere vazio deve ser tratado devemos usar a

restriccedilatildeo whiteSpace

O exemplo abaixo define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=preserve gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 34: XML - Apostila Completa

33

O elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo

whiteSpace

eacute definida como preserve que significa que o processador XML iraacute

preservar os caracteres vazios

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=replace gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com um restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como replace que significa que o processador XML vai substuir todos caracteres vazios (quebras de linha tabs espaccedilos) com espaccedilos

O exemplo abaixo tambeacutem define um elemento chamado endereco

ltxselement name=enderecogt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxswhiteSpace value=collapse gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento endereco eacute um tipo simples com uma restriccedilatildeo A restriccedilatildeo whiteSpace

eacute definida como collapse que significa que o processador XML vai remover todos caracteres vazios

Restriccedilotildees de comprimento Para limitar o comprimento de um elemento noacutes usamos as restriccedilotildees de

comprimento maxLength e minLength O exemplo abaixo define um elemento chamado password

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxslength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

O elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter exatamente oito caracteres

O exemplo abaixo define outro elemento chamado password

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 35: XML - Apostila Completa

34

ltxselement name=passwordgt ltxssimpleTypegt ltxsrestriction base=xsstringgt ltxsminLength value=5 gt ltxsmaxLength value=8 gt ltxsrestrictiongt ltxssimpleTypegt ltxselementgt

Este elemento password eacute um tipo simples com uma restriccedilatildeo O valor deve ter no miacutenimo cinco e no maacuteximo oito caracteres

Restriccedilotildees para tipos de dados

Restriccedilatildeo Descriccedilatildeo enumeration Define uma lista de valores vaacutelidos fractionDigits Especifica o nuacutemero maacuteximo casas decimais permitidas Deve ser

igual ou maior que zero length Especifica o nuacutemero exato de caracteres ou itens permitidos Deve

ser igual ou maior que zero maxExclusive

Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor que este valor)

maxInclusive Especifica o valor maacuteximo para valores numeacutericos (o valor deve ser menor ou igual a este valor)

maxLength Especifica o nuacutemero maacuteximo de caracteres ou itens permitidos Deve ser igual ou maior que zero

minExclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior que este valor)

minInclusive Especifica o valor miacutenimo para valores numeacutericos (o valor deve ser maior ou igual a este valor)

minLength Especifica o nuacutemero miacutenimo de caracteres ou itens permitidos Deve ser igual ou maior que zero

pattern Define a seqUumlecircncia exata de caracteres permitidos totalDigits Especifica o nuacutemero exato de digitos permitidos Deve ser maior que

zero whiteSpace Especifica como caracteres vazios (tabs espaccedilos e retornos de

carro) satildeo tratados

355 Elementos XSD Complexos

Um elemento complexo conteacutem outros elementos eou atributos

O que eacute um elemento complexo

Um elemento complexo eacute um elemento XML que conteacutem outros elementos eou atributos

Haacute quatro tipos de elementos complexos

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 36: XML - Apostila Completa

35

elementos vazios

elementos que conteacutem apenas outros elementos

elementos que conteacutem apenas texto

elementos que conteacutem tanto outros elementos quanto texto

Nota Cada um desses elementos certamente podem conter os seus respectivos atributos

Exemplos de elementos XML complexos

Um elemento XML complexo product que eacute vazio

ltproduct pid=1245 gt

Um elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Um elemento XML complexo food que conteacutem apenas texto

ltfood type=dessertgtIce creamltfoodgt

Um elemento XML complexo description que conteacutem outros elementos e texto

ltdescriptiongt It happened on ltdate lang=norwegiangt030399ltdategt ltdescriptiongt

Como definir um elemento complexo

Observe este elemento XML complexo employee que conteacutem apenas outros elementos

ltemployeegt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltemployeegt

Noacutes podemos definir um elemento complexo em um XML Schema de diferente maneiras

1 O elemento employee pode ser declarado diretamente nomeando o elemento

ltxselement name=employeegt

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 37: XML - Apostila Completa

36

ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Se vocecirc usar o meacutetodo descrito acima apenas o elemento employee pode usar o tipo complexo definido Note que os elementos filhos firstname e lastname satildeo envolvidos pelo indicador ltsequencegt Isto significa que os elementos filhos devem aparecer na mesma ordem da declaraccedilatildeo firstname primeiro e lastname depois

2 O elemento employee pode ter um atributo tipo que faz referecircncia ao nome do tipo complexo que deve ser usado

ltxselement name=employee type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Se vocecirc usar o meacutetodo descrito acima vaacuterios elementos podem fazer referecircncia ao mesmo tipo complexo assim

ltxselement name=employee type=personinfo gt ltxselement name=student type=personinfo gt ltxselement name=member type=personinfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt

Vocecirc tambeacutem pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos assim

ltxselement name=employee type=fullpersoninfo gt ltxscomplexType name=personinfogt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=personinfo type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxscomplexType name=fullpersoninfogt

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 38: XML - Apostila Completa

37

ltxscomplexContentgt ltxsextension base=personinfogt ltxssequencegt ltxselement name=address type=xsstring gt ltxselement name=city type=xsstring gt ltxselement name=country type=xsstring gt ltxssequencegt ltxsextensiongt ltxscomplexContentgt ltxscomplexTypegt

Elementos complexos vazios

Um elemento complexo vazio pode conter atributos mas natildeo pode ter nenhum conteuacutedo entre as tags de abertura e fechamento

Defina tipos complexos para elementos vazios

Um elemento XML vazio ltproduct prodid=1345 gt

O elemento product acima natildeo tem conteuacutedo Para definir um tipo sem conteuacutedo noacutes devemos definir um tipo que permita apenas elementos em seu conteuacutedo mas noacutes natildeo declaramos nenhum elemento realmente assim

ltxselement name=productgt ltxscomplexTypegt ltxscomplexContentgt ltxsrestriction base=xsintegergt ltxsattribute name=prodid type=xspositiveInteger gt ltxsrestrictiongt ltxscomplexContentgt ltxscomplexTypegt ltxselementgt

No exemplo acima noacutes definimos um complexType tendo um complexContent isto eacute apenas elementos O elemento complexContent diz que queremos restringir ou extender o modelo de conteuacutedo de um tipo complexo e a restriccedilatildeo de inteiros declara um atributo mas natildeo cria nenhum elemento

Entretanto eacute possiacutevel declarar o elemento product de forma mais compacta assim

ltxselement name=productgt ltxscomplexTypegt ltxsattribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt ltxselementgt

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 39: XML - Apostila Completa

38

Ou vocecirc pode dar um nome ao complexType e fazer o elemento product

ter um tipo que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=product type=prodtypegt ltxscomplexType name=prodtypegt ltxsatrribute name=prodid type=xspositiveInteger gt ltxscomplexTypegt

Tipos complexos apenas elementos

Um tipo complexo apenas elementos conteacutem um elemento que conteacutem apenas outros elementos

Defina tipos complexos apenas com elementos

Um elemento XML person que conteacutem apenas outros elementos

ltpersongt ltfirstnamegtJohnltfirstnamegt ltlastnamegtSmithltlastnamegt ltpersongt

Vocecirc pode definir o elemento person em um esquema assim

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Note a tag ltxssequencegt Isto significa que os elementos definidos (firstname e lastname) devem aparecer nesta ordem dentro do elemento person veremos mais detalhes a frente

Ou vocecirc pode dar um nome ao complexType e um atributo type ao elemento person que faz referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=person type=persontypegt ltxscomplexType name=persontypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 40: XML - Apostila Completa

39

ltxssequencegt ltxscomplexTypegt

Elementos complexos apenas texto

Um elemento complexo texto pode conter tanto atributos quanto texto

Defina um elemento complexo apenas texto

Este tipo conteacutem apenas conteuacutedo simples (texto e atributos) assim noacutes adicionamos um elemento simpleContent em torno do conteuacutedo Quando usar conteuacutedo simples vocecirc precisa definir uma extensatildeo ou uma restriccedilatildeo com o elemento simpleContent assim

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=basetypegt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

ou

ltxselement name=somenamegt ltxscomplexTypegt ltxssimpleContentgt ltxsrestriction base=basetypegt ltxsrestrictiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Dica Use o elemento extension para expandir o tipo simples base de um elemento e o elemento restriction para limitaacute-lo

Aqui estaacute um exemplo de um elemento XML shoesize que conteacutem apenas texto

ltshoesize country=francegt35ltshoesizegt

O exemplo a seguir declara um complexType shoesize O conteuacutedo eacute definido como tipo de dado integer e o elemento shoesize tambeacutem conteacutem um atributo chamado country

ltxselement name=shoesizegt

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 41: XML - Apostila Completa

40

ltxscomplexTypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt ltxselementgt

Noacutes tambeacutem poderiacuteamos definir um nome para o complexType e especificar um atributo type ao elemento shoesize que faz referecircncia ao nome do complexType (se vocecirc usar este meacutetodo vaacuterios elementos podem referenciar o mesmo tipo complexo)

ltxselement name=shoesize type=shoetype gt ltxscomplexType name=shoetypegt ltxssimpleContentgt ltxsextension base=xsintegergt ltxsattribute name=country type=xsstring gt ltxsextensiongt ltxssimpleContentgt ltxscomplexTypegt

Tipos complexos com conteuacutedo misto

Um elemento do tipo complexo misto pode conter atributos elementos e texto

Defina tipos complexos com conteuacutedo misto

Um elemento XML letter que conteacutem tanto outros elementos quanto texto

ltlettergt Dear MrltnamegtJohn Smithltnamgt Your order ltorderidgt1032ltorderidgt will be shipped on ltshipdategt2001-07-13ltshipdategt ltlettergt

Note o texto que aparece entre os elementos name orderid e shipdate satildeo todos filhos de letter O seguinte esquema declara o elemento letter

ltxselement name=lettergt ltxscomplexType mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 42: XML - Apostila Completa

41

ltxscomplexTypegt ltxselementgt

Nota Para permitir que caracteres apareccedilam entre os elementos filhos de letter o atributo mixed deve ser definido como true A tag ltxssequencegt significa que os elementos definidos (name orderid e shipdate) devem parecer nesta ordem no elemento letter frisando que veremos mais detalhes sobre isto a frente

Noacutes tambeacutem poderiacuteamos dar um nome ao elemento complexType e definir o atributo type de letter como uma referecircncia a ele (se vocecirc usar este meacutetodo vaacuterios elementos podem fazer referecircncia ao mesmo complexType)

ltxselement name=letter type=lettertype gt ltxscomplexType name=lettertype mixed=truegt ltxssequencegt ltxselement name=name type=xsstring gt ltxselement name=orderid type=xspositiveInteger gt ltxselement name=shipdate type=xsdate gt ltxssequencegt ltxscomplexTypegt

Indicadores de tipos complexos

Noacutes podemos controlar como os elementos seratildeo usados em documentos atraveacutes de indicadores Existem 7 (sete) tipos de indicadores

o Indicadores de ordem

All

Choice

Sequence

o Indicadores de ocorrecircncia

maxOccurs

minOccurs

o Indicadores de grupo

Group name

attributeGroup name

o Indicadores de ordem Indicadores de ordem satildeo usados para definir a ordem em que os elementos ocorrem

Indicador All

O indicador ltallgt especifica por padratildeo que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer e apenas uma vez

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 43: XML - Apostila Completa

42

ltxselement name=persongt ltxscomplexTypegt ltxsallgt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxsallgt ltxscomplexTypegt ltxselementgt

Nota Usando o indicador ltallgt vocecirc pode especificar o indicador ltminOccursgt em 0 ou 1 e ltmaxOccursgt soacute pode ser 1 (ltminOccursgt e ltmaxOccursgt satildeo descritos adiante)

Indicador choice

O indicador ltchoicegt especifica que um elemento filho ou outro pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxschoicegt ltxselement name=employee type=employee gt ltxselement name=member type=member gt ltxschoicegt ltxscomplexTypegt ltxselementgt

Indicador sequence

O indicador ltsequencegt especifica que os elementos filhos devem aparecer em uma ordem especiacutefica

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=firstname type=xsstring gt ltxselement name=lastname type=xsstring gt ltxssequencegt ltxscomplexTypegt ltxselementgt

Indicadores de ocorrecircncia

Indicadores de ocorrecircncia satildeo usados para indicar com que frequumlecircncia um elemento pode ocorrer

Nota Para todos indicadores Order e Group (any all choice sequence group name e group reference) o valor padratildeo de maxOccurs e minOccurs eacute 1

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 44: XML - Apostila Completa

43

Indicador maxOccurs

O indicador ltmaxOccursgt especifica o nuacutemero maacuteximo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorre no miacutenimo uma vez (o valor padratildeo para minOccurs eacute 1) e no maacuteximo dez vezes em um elemento person

Indicador minOccurs

O indicador ltminOccursgt especifica o nuacutemero miacutenimo de vezes que um elemento pode ocorrer

ltxselement name=persongt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring maxOccurs=10 minOccurs=0 gt ltxssequencegt ltxscomplexTypegt ltxselementgt

O exemplo acima indica que o elemento child_name pode ocorrer um miacutenimo de zero vezes e um maacuteximo de dez em um elemento person

Importante Para permitir que um elemento pareccedila um nuacutemero ilimitado de vezes use a instruccedilatildeo maxOccurs=unbounded

Um exemplo que aborda vaacuterios conceitos

Um arquivo chamado ldquomyFamilyxmlrdquo

ltxml version=10 encoding=ISO-8859-1gt ltpersons xmlnsxs=httpwwww3org2001XMLSchema-instance xsinoNamespaceSchemaLocation=familyxsdgt

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 45: XML - Apostila Completa

44

ltpersongt ltfull_namegtHege Refsnesltfull_namegt ltchild_namegtCecilieltchild_namegt ltpersongt ltpersongt ltfull_namegtTove Refsnesltfull_namegt ltchild_namegtHegeltchild_namegt ltchild_namegtStaleltchild_namegt ltchild_namegtJimltchild_namegt ltchild_namegtBorgeltchild_namegt ltpersongt ltpersongt ltfull_namegtStale Refsnesltfull_namegt ltpersongt ltpersonsgt

O arquivo XML acima conteacutem um elemento raiz chamado persons Dentro deste elemento estaacute definido vaacuterios elementos person Cada elemento person deve conter um elemento filho full_name e pode conter ateacute cinco elementos filho child_name

Aqui estaacute o esquema familyxsd

ltxml version=10 encoding=ISO-8859-1gt ltxsschema xmlnsxs=httpwwww3org2001XMLSchema

elementFormDefault=qualifiedgt ltxselement name=personsgt ltxscomplexTypegt ltxssequencegt ltxselement name=person maxOccurs=unboundedgt ltxscomplexTypegt ltxssequencegt ltxselement name=full_name type=xsstring gt ltxselement name=child_name type=xsstring minOccurs=0 maxOccurs=5 gt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxssequencegt ltxscomplexTypegt ltxselementgt ltxsschemagt

Mais sobre XML Schema O XML Schema possui centenas de outras funccedilotildees as quais natildeo seratildeo

mencionadas nesta disciplina Eis algumas de suas funccedilotildees o Indicadores de Grupos (de atributos e de elementos) o Elemento ldquoanyrdquo permitindo que o elemento possua qualquer coisa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 46: XML - Apostila Completa

45

o Elemento ldquoanyAtributterdquo permitindo que o elemento possua quaisquer

atributos o Substituiccedilatildeo de elemento o Bloqueando substituiccedilatildeo de elementos o Grupo de Substituiccedilatildeo o Criaccedilatildeo avanccedilada de seus proacuteprios tipos o Tipos de String o Tipos de Date o Timezones o Tipos de Dados binaacuterios URI entre outros

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 47: XML - Apostila Completa

46

4 XSLT

Extensible Stylesheet Language Transformations (XSLT) eacute um dos padrotildees criados pelo W3C cuja finalidade seria a de transformar documentos XML em outros documentos como pode ser visto na figura 1

Figura 1 Funcionalidade do XSLT Fonte KAY 2004 p 18

A partir desta ideacuteia podemos pensar no XSLT como uma linguagem de transformaccedilatildeo que a partir de um documento XML gera como saiacuteda qualquer outro documento

XSLT (que se entende como Extensible Stylesheet Language Transformations) eacute uma linguagem que de acordo com o primeiro paraacutegrafo da especificaccedilatildeo [] eacute primariamente desenvolvida para transformar um documento XML em outro Entretanto XSLT eacute tambeacutem capaz de transformar XML em HTML e qualquer outro formato baseado em texto Entatildeo a melhor definiccedilatildeo geral deveria ser a seguinte XSLT eacute uma linguagem para transformar a estrutura e o conteuacutedo de um documento XML (KAY 2004 p 01 Traduccedilatildeo nossa)

Segundo DuCharme (2001) o XSLT eacute um padratildeo todavia este fato natildeo significa que seja uma boa linguagem de transformaccedilatildeo mas sim que muitos fabricantes trabalharam juntos e cada um contribuiu para seu projeto e comprometeu a usaacute-lo em seus produtos Existem outras maneiras de se transformar documentos XML e ainda na visatildeo de DuCharme satildeo divididas em duas categorias

XML relacionadas a bibliotecas adicionadas a linguagens de programaccedilatildeo de finalidade geral como Java Perl Visual Basic Python e C++

linguagens como OMNImark e Balise projetadas especificamente para manipular documentos XML (e tipicamente SGML)

O XSLT era originalmente parte da Extensible Stylesheet Language (XSL) De fato o XSLT continua tecnicamente parte da XSL A especificaccedilatildeo descreve XSL como uma linguagem com duas partes uma linguagem para transformar documentos XML e um vocabulaacuterio XML para descrever como formatar conteuacutedo de documentos Esse vocaacutebulo eacute uma coleccedilatildeo de elementos especializados chamados

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 48: XML - Apostila Completa

47

ldquoobjetos de formataccedilatildeordquo que especificam o layout de paacuteginas e outros detalhes relativos agrave apresentaccedilatildeo de textos marcados com essas tags de elementos famiacutelia de cores tamanho de fonte margens espaccedilo entre linhas e outras configuraccedilotildees (DUCHARME 2001 p 04-05)

Existe a confusatildeo entre o Cascading Style Sheets (CSS) com o XSLT Natildeo existe nenhum conflito entre eles pois foram criados para propoacutesitos distintos Seratildeo vistos no toacutepico seguinte mais detalhes sobre o que eacute cada um deles e no que se diferenciam

41 XSLT e CSS

Enquanto o Cascading Style Sheets (CSS) eacute ldquoum mecanismo utilizado para definir vaacuterias propriedades de elementos de marcaccedilatildeordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa) o XSLT eacute um mecanismo ldquopara definir regras para transformaccedilatildeo de um documento XMLrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

O CSS pode ser utilizado com XML mas o que eacute observado na praacutetica e o uso do estilo CSS com documentos HTML Vocecirc pode utilizar o CSS para dizer que um elemento deve ser apresentado (renderizado) em cor azul em negrito entre outras formataccedilotildees visuais Segundo TIDWELL (2001) existem muitas coisas que o CSS natildeo faz e natildeo foi desenvolvido para fazer

CSS natildeo altera a ordem que os elementos aparecem no documento Se desejar ordenar elementos segundo alguma propriedade ou filtrar alguns elementos o CSS natildeo realiza esta tarefa

CSS natildeo realiza caacutelculos Se vocecirc desejar calcular uma saiacuteda por exemplo um somatoacuterio dos salaacuterios de um departamento especiacutefico e depois exibiacute-lo o CSS natildeo realiza esta tarefa

CSS natildeo combina muacuteltiplos documentos Se vocecirc quiser combinar nove documentos de nota fiscal e imprimir o sumaacuterio de todos os itens destas notas fiscais o CSS natildeo realiza esta tarefa Estas observaccedilotildees acima natildeo podem ser vistas como uma criacutetica ao CSS

Como jaacute foi dito o XSLT e o CSS foram desenvolvidos para propoacutesitos distintos ldquoUm uso razoavelmente comum de XSLT eacute para gerar um documento HTML que conteacutem um elemento CSSrdquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

42 Caracteriacutesticas objetivos e cenaacuterios aplicaacuteveis

Segundo Tidwell (2001) o XSLT foi criado para ser a mais poderosa e flexiacutevel linguagem para transformar documentos Ainda na visatildeo deste mesmo autor citaremos alguns objetivos e caracteriacutesticas especiacuteficas do XSLT

O estilo XSLT deve ser um documento XML Isto significa que vocecirc pode escrever um estilo que transforma um segundo estilo em outro estilo Este tipo de pensamento recursivo eacute comum no XSLT

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 49: XML - Apostila Completa

48

A linguagem XSLT deve ser baseada em combinaccedilotildees de padrotildees A maioria de seus estilos consiste em regras (tambeacutem conhecidas como templates) usadas para transformar um documento ldquoCada regra diz ldquoQuando vocecirc observar uma parte do teste que pareccedila com isto aqui vocecirc deve converter isto naquilordquo Isto eacute provavelmente diferente de qualquer programaccedilatildeo que vocecirc jaacute tenha feitordquo (TIDWELL 2001 p 02 Traduccedilatildeo nossa)

XSLT deve ser desenvolvida para ser livre de efeitos colaterais Em outras palavras XSLT eacute desenvolvida para que vaacuterias diferentes regras de estilo possam ser aplicadas simultaneamente O maior impacto disto eacute que as variaacuteveis natildeo podem ser modificadas (static binding) Uma vez iniciada a variaacutevel vocecirc natildeo poderaacute alterar seu valor se as variaacuteveis pudessem ser alteradas entatildeo o processamento de uma regra de estilo poderia gerar efeitos laterais que impactaria outras regras de estilo

XSLT eacute altamente influenciada pelo projeto de linguagens de programaccedilatildeo funcional tal como Lisp Scheme e Haskell Estas linguagens tambeacutem possuem variaacuteveis imutaacuteveis como caracteriacutestica Ao inveacutes de definir regras como o XSLT linguagens de programaccedilatildeo funcional definem programas como uma seacuterie de funccedilotildees cada uma delas gera uma saiacuteda bem definida (livre de efeitos colaterais com certeza) em resposta a uma entrada bem definida O objetivo eacute executar as instruccedilotildees de uma dada regra XSLT sem afetar a execuccedilatildeo de qualquer outra regra (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Ao inveacutes de looping (eacute uma estrutura que realiza laccedilos de repeticcedilatildeo de um coacutedigo) XSLT utiliza interaccedilotildees e recursotildees Como as variaacuteveis natildeo podem ser modificadas natildeo teria como realizar um for ou um do-while que satildeo estruturas de repeticcedilatildeo XSLT utiliza duas teacutecnicas equivalentes iteraccedilatildeo e recursatildeo

Iteraccedilatildeo significa que vocecirc pode escrever uma regra XSLT que diga ldquopegue todas as coisas que pareccedila com isto e eacute aqui que eu quero fazer com cada uma delasrdquo Embora isto seja diferente de um laccedilo do-while geralmente o que vocecirc faz em uma linguagem procedural eacute algo como ldquofaccedila isto enquanto existir itens para processarrdquo Neste caso iteraccedilatildeo funciona exatamente como vocecirc deseja Recursatildeo exige muito praacutetica para utilizaacute-la Se vocecirc implementa algo como uma estrutura for (for i=5 to 10 do por exemplo) recursatildeo eacute o caminho a seguir (TIDWELL 2001 p 03 Traduccedilatildeo nossa)

Acima observamos vaacuterias caracteriacutesticas e objetivos do XSLT Estas informaccedilotildees satildeo altamente relevantes pois nos faz pensar na seguinte questatildeo Onde poderemos utilizar esta tecnologia E ainda a partir das ideacuteias do Tidwell cito

Seu website necessita entregar informaccedilotildees para uma variedade de dispositivos isto eacute computadores celulares notebooks palmtops entre outros dispositivos Seria excelente disponibilizar estas informaccedilotildees em

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 50: XML - Apostila Completa

49

documentos estruturados e entatildeo transformaacute-los em qualquer formato que necessite

Vocecirc necessita trocar informaccedilotildees de uma de suas empresas com outras mas vocecirc utiliza diferentes sistemas de banco de dados Seria excelente se pudesse definir um XML comum de formato de dado e entatildeo transformaacute-lo no arquivo de importaccedilatildeo que necessita (SQLs comma-separated values entre outros formatos de importaccedilatildeo de dados existentes)

Informaccedilatildeo XML de um outro sistema deve ter sua estrutura modificada para que seja armazenada no sistema local

Sistemas como J2EE NET Natural Web pode responder a uma requisiccedilatildeo de um usuaacuterio com uma paacutegina XML e este XML ser convertido em HTML na maacutequina-cliente

Como pocircde ser visto existem vaacuterios cenaacuterios no qual a aplicaccedilatildeo do XSLT eacute altamente apropriada Estes vaacuterios cenaacuterios na visatildeo de Kay (2004) podem ser descritos simplesmente em dois cenaacuterios principais

Conversatildeo de dados

Apresentaccedilatildeo (publicaccedilatildeo) de dados

Em uma visatildeo altamente superficial cujo propoacutesito eacute expor o que seraacute visto a frente podemos definir como conversatildeo de dados toda situaccedilatildeo em que vocecirc necessita de converter um XML em um outro XML com as mesmas ou a grande maioria das informaccedilotildees em uma estrutura igual ou diferente para uma outra aplicaccedilatildeo Em contrapartida podemos definir como apresentaccedilatildeo de dados toda situaccedilatildeo em que vocecirc a partir de um documento XML necessite publicar seu conteuacutedo de uma forma mais apresentaacutevel seja HTML PDF ou ateacute graacuteficos muacutesicas (MIDI) etc

43 Praacutetica do XSLT

Declaraccedilatildeo correta de estilos

O elemento raiz que declara que um documento como um estilo XSL eacute ltxslstylesheetgt ou ltxsltransformgt

Note que ltxslstylesheetgt ou ltxsltransformgt satildeo completamente sinocircnimos e qualquer um poderaacute ser utilizado

Entatildeo observe a declaraccedilatildeo vaacutelida de acordo com o padratildeo W3C

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ou

ltxsltransform version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 51: XML - Apostila Completa

50

Exemplo 1 (Introdutoacuterio ndash valores de elementos)

Observe o documento XML abaixo

1 ltxml version=10 encoding=ISO-8859-1gt 2 ltxml-stylesheet type=textxsl href=cepxslgt 3 ltcepgt 4 ltlogradourogtRUA ALIltlogradourogt 5 ltnumerogt10ltnumerogt 6 ltcomplementogtAPTO 102ltcomplementogt 7 ltcidadegtBELO HORIZONTEltcidadegt 8 ltestadogtMINAS GERAISltestadogt 9 ltcepgt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtCoacutedigo Endereccedilamento Postallth1gt O endereccedilo repassado foi ltigt

ltxslvalue-of select=ceplogradouro gtampxa0

ltxslvalue-of select=cepnumero gtampxa0 ltxslvalue-of select=cepcomplemento gtltigt na cidade de ltugtltxslvalue-of select=cepcidade gtltugt situada no estado de ltbgt

ltxslvalue-of select=cepestado gtltbgt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda sera

Observe a 2ordf linha do documento XML esta linha eacute um PI (instruccedilatildeo de processamento) que tem a funccedilatildeo de dizer que no momento de ler o arquivo XML deveraacute antes ser realizada a aplicaccedilatildeo da folha de estilo

Exemplo 2 (Introdutoacuterio ndash valores de atributos)

Observe o documento XML abaixo

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 52: XML - Apostila Completa

51

ltxml version=10 encoding=ISO-8859-1gt ltxml-stylesheet type=textxsl href=faculdadexslgt ltfaculdade nome=UFRTgt

ltcurso nome=SIgt

ltaluno nome=Carlos idade=25gtOPAltalunogt

ltcursogt ltfaculdadegt

Observe a folha de estilos criada para transformaacute-lo

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth1gtFaculdade ltbgtltxslvalue-of select=faculdadenome gtbgtlth1gt No curso de ltxslvalue-of select=faculdadecursonome gt existe um aluno chamado ltxslvalue-of select=faculdadecursoalunonome gt que possui exatamente ltxslvalue-of select=faculdadecursoalunoidade gt anos ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda seraacute

431 Regras (Templates)

Um folha de estilos XSLT consiste em 1 ou mais grupo de regras chamados templates

Cada template conteacutem regras para serem aplicadas quando um nodo especiacutefico eacute encontrado

O elemento ltxsltemplategt

O elemento ltxsltemplategt eacute utilizado para construir templates

O atributo match eacute utilizado para associar um template com um elemento XML Este atributo tambeacutem pode ser utilizado para definir um template para o documento XML inteiro O valor deste atributo eacute uma expressatildeo

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 53: XML - Apostila Completa

52

XPath (que natildeo seraacute abordada a fundo na disciplina) isto eacute quando vocecirc disser match=rdquordquo indica o elemento raiz do documento

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10

xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtMinha coleccedilatildeo de CDlth2gt lttable border=1gt lttr bgcolor=9acd32gt ltthgtTiacutetuloltthgt ltthgtArtistaltthgt lttrgt lttrgt lttdgtlttdgt lttdgtlttdgt lttrgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O elemento ltxsltemplategt define um template O atributo match= associado a regra com a raiz do documento XML

O conteuacutedo dentro do ltxsltemplategt define um HTML para ser escrito na saiacuteda da transformaccedilatildeo

O resultado deste exemplo eacute um pouco desapontador devido ao fato de nenhuma informaccedilatildeo do documento XML foi copiada para a saiacuteda o que natildeo justifica o uso do XSLT

Devido ao fato acima iremos no proacutexima seccedilatildeo aprendermos a utilizar o elemento ltxslvalue-ofgt para selecionar os valores dos elementos XML

432 O elemento ltxslvalue-ofgt

O elemento ltxslvalue-ofgt eacute utilizado para extrair o valor de um nodo selecionado isto eacute ele extrai a informaccedilatildeo do documento XML de origem para ser copiada na saiacuteda da transformaccedilatildeo

Dado o simples XML

ltxml version=10 encoding=ISO-8859-1gt ltcpu clock=32gtCENTRINOltcpugt

Observe a folha de estilos de transformaccedilatildeo

ltxml version=10 encoding=ISO-8859-1gt

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 54: XML - Apostila Completa

53

ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gtCPUlth2gt Nome ltbgtltxslvalue-of select=cpu gtltbgt

ltbr gt Clock ltbgtltxslvalue-of select=cpuclock gtltbgtampxa0GHz ltbodygt lthtmlgt ltxsltemplategt

ltxslstylesheetgt

O valor do atributo select eacute uma expressatildeo XPath Uma expressatildeo XPath trabalha como se navega em um sistema de arquivos tradicional no qual uma barra () seleciona diretoacuterios

A saiacuteda da aplicaccedilatildeo deste estilo seraacute

CPU

Nome CENTRINO Clock 32 GHz

Observe que para buscar valores de elementos foi inserido o caminho do elemento no atributo select Para a busca do atributo foi inserido o caminho do elemento + + o nome do atributo

433 O elemento ltxslfor-eachgt

O elemento ltxslfor-eachgt eacute utilizado para selecionar todo elemento XML de um especiacutefico grupo de elementos

Observe o XML

ltxml version=10 encoding=ISO-8859-1gt ltempresa nome=Oraacuteculo Consultoria Ltdagt

ltfuncionario nome=Zezinho salario=100000 departamento=RH gt

ltfuncionario nome=Carlinhos salario=200000 departamento=TI gt

ltfuncionario nome=Ceacutesar salario=40000 departamento=GERAL gt

ltfuncionario nome=Demilson salario=150000 departamento=RH gt ltempresagt

Observe a folha de estilos

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 55: XML - Apostila Completa

54

ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo seraacute

Pode-se tambeacutem filtrar a saiacuteda adicionando um criteacuterio no atributo select do elemento ltxslfor-eachgt

ltxslfor-each select=empresafuncionario[departamento=RH]gt

Os operadores legais de filtros satildeo

= (igual)

= (diferente)

amplt (menor que)

ampgt (maior que)

A saiacuteda da folha de estilos utilizando o filtro acima seria

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 56: XML - Apostila Completa

55

434 O elemento ltxslsortgt

O elemento ltxslsortgt eacute utilizado para ordenar uma saiacuteda Ele deve ser inserido dentro do elemento ltxslfor-eachgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo do for-each sem filtro mas agora ordenando pelo nome

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgtltxslvalue-of select=salario gtlttdgt

lttdgtltxslvalue-of select=departamento gtlttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

A saiacuteda da aplicaccedilatildeo desta folha de estilo resulta em uma impressatildeo ordenada observe

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 57: XML - Apostila Completa

56

Existem outros atributos do ltxslsortgt como

order especifica se a ordenaccedilatildeo eacute ascendente (ascendent) ou descendente (descendent) O padratildeo eacute ascendente

data-type especifica o tipo do dado O padratildeo eacute string Quando for nuacutemero deveraacute utilizar data-type=number

435 O elemento ltxslifgt

O elemento ltxslifgt eacute utilizado para colocar um teste condicional de acordo com o conteuacutedo do documento XML

Sintaxe

ltxslif test=expressiongt saiacuteda a ser inserida quando o teste for verdadeiro ltxslifgt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com alguns testes condicionais

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 58: XML - Apostila Completa

57

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslif test=salario ampgt 1000gt

ltfont color=redgt ltxslvalue-of select=salario gt ltfontgt ltxslifgt ltxslif test=salario amplt= 1000gt ltfont color=bluegt ltxslvalue-of select=salario gt ltfontgt

ltxslifgt

lttdgt

lttdgt

ltxslvalue-of select=departamento gt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

Observa a saiacuteda da aplicaccedilatildeo desta folha de estilo

436 O elemento ltxslchoosegt

O elemento ltxslchoosegt eacute em conjunto com ltxslwhengt e ltxslotherwisegt para expressar muacuteltiplos testes condicionais

Sintaxe

ltxslchoosegt ltxslwhen test=expressiongt alguma saiacuteda ltxslwhengt ltxslotherwisegt alguma saiacuteda ltxslotherwisegt ltxslchoosegt

Ainda no mesmo XML de empresa e funcionaacuterio observe a mesma folha de estilo utilizada no xsl-sort mas agora com muacuteltiplos testes condicionais

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 59: XML - Apostila Completa

58

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt lth2gt Empresa ltigtltxslvalue-of select=empresanome gtltigt lth2gt

lttable border=1gt lttrgt ltthgtNomeltthgt ltthgtSalaacuterioltthgt ltthgtDepartamentoltthgt lttrgt ltxslfor-each select=empresafuncionariogt ltxslsort select=nome gt lttrgt

lttdgtltxslvalue-of select=nome gtlttdgt

lttdgt

ltxslvalue-of select=salario gt

lttdgt

lttdgt

ltxslchoosegt

ltxslwhen test=departamento=TIgt

Informaacutetica

ltxslwhengt

ltxslwhen test=departamento=RHgt

Recursos Humanos

ltxslwhengt

ltxslotherwisegt ltxslvalue-of select=departamento gt

ltxslotherwisegt

ltxslchoosegt

lttdgt

lttrgt ltxslfor-eachgt lttablegt ltbodygt lthtmlgt ltxsltemplategt ltxslstylesheetgt

O saiacuteda do campo departamento seraacute de acordo com o seu valor caso nenhum bata seraacute o valor do proacuteprio documento XML observe a saiacuteda

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 60: XML - Apostila Completa

59

437 O elemento ltxslapply-templatesgt

O elemento ltxslapply-templatesgt aplica um template para o elemento corrente ou para os nodos de elementos filhos

Se noacutes adicionarmos o atributo select para o elemento ltxslapply-templatesgt ele processaraacute somente o elemento filho que combine com o valor do atributo Pode-se usar o atributo select para especificar a ordem em que os nodos filhos seratildeo processados

Observe o XML utilizado ltcataloggt

ltcdgt

lttitlegtEmpire Burlesquelttitlegt

ltartistgtBob Dylanltartistgt

ltcountrygtUSAltcountrygt

ltcdgt

ltcdgt

lttitlegtHide your heartlttitlegt

ltartistgtBonnie Tylerltartistgt

ltcountrygtUKltcountrygt

ltcdgt

ltcdgt

lttitlegtGreatest Hitslttitlegt

ltartistgtDolly Partonltartistgt

ltcountrygtUSAltcountrygt

ltcdgt ltcataloggt

Observe a folha de estilos aplicada

ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt ltxsltemplate match=gt lthtmlgt ltbodygt ltxslapply-templates gt ltbodygt lthtmlgt ltxsltemplategt ltxsltemplate match=cdgt ltxslapply-templates select=artist gt ltxslapply-templates select=title gt ltbr gt ltxsltemplategt ltxsltemplate match=artistgt ltbgtltxslvalue-of select= gtltbgtamp160 ltxsltemplategt

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 61: XML - Apostila Completa

60

ltxsltemplate match=titlegt ltigtltxslvalue-of select= gtltigt ltxsltemplategt ltxslstylesheetgt

A aplicaccedilatildeo da folha de estilos acima tem como saiacuteda

Bob Dylan Empire Burlesque

Bonnie Tyler Hide your heart

Dolly Parton Greatest Hits

Concluindo a aplicaccedilatildeo do elemento ltxslapply-templatesgt eacute usual quando existem templates para cada elemento e estes deveratildeo ser chamados a partir dos elementos superiores (pais)

438 O elemento ltxsloutputgt

O elemento ltxsloutputgt deve ser sempre inserido na raiz do documento XSLT (xslstylesheet ou xsltransform) e tem como finalidade explicitar qual o formato da saiacuteda O processador XSLT jaacute impotildee valores padrotildees agrave transformaccedilatildeo todavia estes podem ser alterados

Por exemplo O processador MSXML converte documento XML utilizando UTF-16 mas vocecirc pode alterar utilizando o elemento ltxsloutputgt

Sua sintaxe eacute

ltxsloutput method=xml version=10 encoding=UTF-8 indent=yes gt

439 O elemento ltxslvariablegt

O elemento ltxslvariablegt eacute utilizado sempre que seja necessaacuterio inserir o valor que estaacute no documento XML dentro de um atributo de um elemento Muito utilizado quando utiliza-se o XSLT para transformar um documento XML em outro documento XML

Observe o XML abaixo

ltempresagt

ltnomegtUFRTltnomegt ltempresagt

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento

Page 62: XML - Apostila Completa

61

Observe a folha de estilos aplicada ltxml version=10 encoding=ISO-8859-1gt ltxslstylesheet version=10 xmlnsxsl=httpwwww3org1999XSLTransformgt

ltxsloutput method=xml version=10 encoding=ISO-8859-1 indent=yes gt

ltxsltemplate match=empresagt

ltxslvariable name=nomeEmpresa select=nome gt

ltempresa nome=$nomeEmpresa gt

ltxsltemplategt ltxslstylesheetgt

Observe o XML de saiacuteda

ltempresa nome=UFRT gt

Um erro muito comum eacute tentar colocar o elemento ltxslvalue-ofgt dentro do atributo mas isto impede o processamento da folha de estilos Observe

ERRO ltempresa nome=ltxslvalue-of select=nome gt gt

Existem diversas outras funccedilotildees do XSLT todavia o foco da disciplina eacute explicar a base de seu funcionamento