Upload
luciano-santos
View
103
Download
6
Embed Size (px)
Citation preview
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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