Professional Documents
Culture Documents
2
Agenda
!! Dia 1
!! 1. Introduo a XML e tecnologias relacionadas
!! 2. Fundamentos de estrutura e sintaxe
!! 3. Especificao de aplicaes com DTD
!! Dia 2
!! 4. Programao com DOM e SAX (fundamentos*)
!! 5. Visualizao de documentos XML usando CSS
!! 6. Referncias e navegao com XLink e XPointer
!! 7. Especificao de aplicaes com XML Schema (fundamentos*)
!! Dia 3
!! 8. Localizao e extrao de dados com XPath
!! 9. Transformao de XML com XSLT (fundamentos*)
!! 10. Layout de pgina e grficos com XSL-FO e SVG (fundamentos*)
3
Formato
!! Apresentao em slides
!! Demonstraes
!! Exerccios
!! Realizados em sala de aula
!! Propostos para realizao fora do horrio de aula
4
Material
5
Sobre material avulso e alteraes
!! O material didtico distribudo refere-se ao roteiro usado como
referncia para a maior parte dos cursos
!! Em cursos personalizados, alguns tpicos podero no ser
abordados, e material avulso de outros cursos poder ser usado
!! Mesmo em cursos normais, material avulso poder ser
introduzido como atualizao
!! A maior parte dos cursos de tecnologia envolvem assuntos que mudam
com freqncia
!! Melhoramentos na apresentao e didtica s vezes so introduzidos
antes e uma reforma geral do material
!! Durante o curso o instrutor tambm poder trocar a ordem de
apresentao de assuntos, aprofundar um assunto ou mesmo
tratar superficialmente outro assunto, caso isto traga benefcios
ao curso de uma forma geral
6
Sobre ferramentas usadas no curso
!! As ferramentas e aplicaes usadas em sala tem acima de tudo
um objetivo didtico
!! Podem no ser as melhores ferramentas em termos de produtividade e
uso profissional
!! Algumas ferramentas usadas em aula foram adaptadas para
explorar os exemplos e exerccios apresentados
!! As ferramentas podem no estar mais disponveis na Web ou estarem
em verses mais novas e possivelmente incompatveis
!! Geralmente uma pasta com todo o cdigo usado nessas ferramentas
ser distribuda com o material didtico (depende do curso) use a
verso fornecida (a menos que o instrutor indique outra alternativa)
!! possvel que algumas ferramentas s funcionem em determinadas
plataformas (Windows, Mac, Java)
7
Ferramentas teis para este curso
!! Para programao
!! Parsers-validadores: Xerces, Crimson, MSXML 4.0
!! Validadores: MSV (Sun)
!! Transformadores XSL: TrAX, Xalan, Xt, Saxon
!! APIs: JDOM, JAX
!! Veja mais em xml.apache.org e
www.alphaworks.ibm.com
!! Para edio (de XML genrico)
!! XML Spy, Liquid e oXygen (software comercial)
!! Eclipse e Netbeans (gratuitos)
!! Veja mais em www.w3.org/XML/
8
Fontes
[1] World Wide Web Consortium (W3C). eXtensible Markup Language.
http://www.w3.org/XML/. Ponto de partida e principal fonte sobre XML e suas
tecnologias "satlite". Contm ltimas especificaes de XML, XPath, XSchema, XSLT,
XSL-FO, XQuery, XLink, XPointer, SVG, XHTML, CSS.
[2] Eric Armstrong et al. Working with XML. Aborda DOM, SAX e XML com Java.
http://java.sun.com/xml/jaxp/dist/1.1/docs/tutorial/index.html.
[3] Adobe. SVG Tutorial. http://www.adobe.com/svg/. Contm tutorial sobre SVG e
links para o plug-in SVG da Adobe (Win/Mac).
[4] IBM Developerworks. http://www-106.ibm.com/developerworks/. Diversos tutoriais
e artigos sobre XML, XSLT, DOM e SAX usando geralmente Java.
[5] Doug Tidwell. XSLT. OReilly & Associates, 2001. Explora XSLT com aplicaes
prticas em Java.
[6] Elliotte Rusty Harold. XML Bible, Second Edition, 2001. Aborda todas as
principais tecnologias W3C. 5 captulos em http://cafeconleche.org/books/bible2/
[7] Erik T. Ray. Learning XML. OReilly & Associates, 2001. Introduo ao XML e
DTD, XSLT, XLink e XPointer (os dois ltimos baseados em especificaes draft).
9
Importante
helder.darocha@gmail.com
www.argonavis.com.br
10
Introduo a XML X100
Helder da Rocha
(helder@argonavis.com.br)
<contato codigo="33">
<nome>Severino Severovitch</nome>
elemento
<email>bill@norte.com.br</email>
<telefone tipo="celular">
<area>11</area>
atributo
<numero>9999 4321</numero>
</telefone>
"n" de texto
</contato>
2
XML versus HTML
3
Anatomia de um documento XML
!! Documentos XML so documentos de texto Unicode
!! uma hierarquia de elementos a partir de uma raiz
!! Menor documento tem um elemento (vazio ou no):
<nome> !"#"$%&' !"#"$'#%( </nome>
<nome></nome> = <nome/>
8
Esquema
Documentos que aderem
especificao (vlidos)
!! O esquema representa uma classe
!! Os documentos so instncias
Esquema (universo de
documentos vlidos)
Documento
fora da !! Como definir esquemas:
especificao !! DTD - Document Type Definition
!! W3C XML Schema
9
DTD vs. XML Schema
!! Um esquema essencial para que haja
comunicao usando XML
!! Pode ser estabelecido "informalmente" (via software)
!! Uso formal permite validao usando ferramentas
genricas de manipulao de XML
!! Solues padro do W3C
DTD XML Schema
!"#$#%#&'()*+,-,*(( !CD:ED)F0/-((
((((((((((.+*/01(0/-231(,0304*+056( (((((C/3+DECD:GHIIIJK%$9)F0/-H6(
!"7''$89'()*+,-,*( (!CD:E030/0+,(+-/0GH)*+,-,*H6(
(((((((((()*:2;*(&%'<=#&(>?#@A8?#B6( ((!CD:E)*/L30C'ML06(
(((!CD:E-,,N2OP,0(+-/0GH)*:2;*H((((((((
(
((((((((((((((((((PD0GHN0QP2N0:H6(
10
Por que usar XML para compartilhar dados?
11
Como produzir XML
12
Visualizao em um browser
14
Processamento XML
Grficos SVG
SGBD Imagens PDF e
JPG e PNG PostScript
2000 2001
15
XPath
16
XLink, XPointer e XQuery
!! XLink: especificao W3C que define vnculos (de diversos
tipos) entre documentos XML
!! Funcionalidade mnima igual ao <a href> do HTML
!! uma coleo de atributos, com namespace prprio, que podem ser
usados em elementos de qualquer linguagem XML.
!! XPointer: aponta para partes de documentos XML
!! Identificador no destino, acessvel por XLink: !"#$%&'()*+,-#.)$/,0
!! Caminho resultante de expresso XPath: !12#$/)(34"#5(24#.60
!! XQuery: linguagem para pesquisar documentos XML atravs de
queries com sintaxe inspirada em SQL
!! Exemplo:
7890:;0<=0.2>?@)$/3,?A?B(#2CDDE!@",64>2$/B/200
0000000FGH9H0$2@)+,I)5)(#$20I)5)(25#/>',0
00000009HJK9=0:;0
17
XSL
!! eXtensible Stylesheet Language
!! Aplicao de XML para transformao e apresentao de dados
disponveis em XML
!! No existe mais como uma especificao. Foi dividida em duas
!! XSLT foca em transformao de dados. XSLT uma linguagem
funcional para processamento de templates
!! XSL-FO linguagem de descrio de pgina (como PDF, HTML+CSS)
!! Cada especificao define um namespace prprio
!! XSLT usa o identificador !""#$%%&&&'&(')*+%,---%./0%1*2345)*67
!! XSL-FO usa !""#$%%&&&'&(')*+%,---%./0%8)*62"7
!! Importante: as URLs acima so usadas como identificadores
de namespace, e no representam nenhum endereo Web
!! muito comum usar URLs como identificadores de namespace
!! Todas as aplicaes XML do W3C usam URLs da forma:
77!""#$%%&&&'&(')*+%!"#$%&'%()*"("$+%!,'(#$-$.*"+/
18
<xsl:stylesheet version="1.0"
XSLT
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="livro/titulo">
<td><xsl:value-of select="." /></td>
1"%$ :;<=>$
4#*"7&86$ !"#$%&$'()&"*#$
12(*3"%($ +,-./$
4%&93")#6$ ?@#$:(AB#$
20
XSLT: folha de estilos (2)
!! O seguinte template (parte de uma folha de estilos XSLT) pode
extrair os dados do documento-fonte
documento-fonte
(em azul - XPath)
!"#$%&'()$*&'+(*&,-./*'012*3'/4+
++++!)45+*'012*3'+6'+)0'78"1++
documento ++++!"#$%3*$9':17+#'$',&./;86/+<4+6',1$19+
resultado ++++6'+!"#$%3*$9':17+#'$',&./108='(/+<4+>#++
(em preto) ++++!"#$%3*$9':17+#'$',&./108='(<;)*0&86*/+<4+
++++&'261+,1(1+6'#&821+1+*'01)10&1+6'+++++
++++!"#$%3*$9':17+#'$',&./6'#&821/+<4?!<)4+++++
!<"#$%&'()$*&'4+ elementos XSLT
(em vermelho, com prefixo xsl)
!"#$%!&'()*&+'!,'!#('-./)!!
01234!,'5)6)7!
,'!8.)!,'!9&*'.()!:;!!
<=>?!
@'*,)!5)A)!,';@.*)!)!&'()#)(@)!,'!
BC)!0&76)D"E#$!
22
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="p1"> XSL-FO
<fo:region-body/>
23
XSL-FO: menor documento
!"#$%##&'!"#$%&'()*+,,-&..///0/10(23.4555.678.9(2":,*('
Este o "<head>"
'''!"#$)*+#,&-.*/&0%-/0&(' do XSL-FO
'''''''!"#$/1.2)0-2*30-.*/&0%'.*/&0%-4*.056276('
'''''''''''!"#$%031#4-8#9+:('
'''''''!:"#$/1.2)0-2*30-.*/&0%(' Ligao entre as
regras de layout e
!!!":"#$)*+#,&-.*/&0%-/0&('
o contedo afetado
''''''!"#$2*30-/0;,04<0'.*/&0%-4*.056276('
''''!"#$")#='")#=-4*.056>/)-%031#4-8#9+6('
!!!!!!!!"#$8)#<?'<#)#%568),06'"#4&-/1@056AB2&6('
''''''''''C0))#'DEFG'
'''''''!:"#$8)#<?('
Este o "<body>"
''''!:"#$")#=(' do XSL-FO
'''!:"#$2*30-/0;,04<0('
!:"#$%##&('
24
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Pgina XHTML</title></head>
<body> XHTML
<h1>Pgina XHTML</h1>
!! eXtensible HTML
!! Linguagem XML de descrio de pgina Web
!! Mesmos elementos do HTML 4.0 Strict
!! Elementos descrevem somente a estrutura dos
componentes da pgina. A forma precisa ser especificada
usando CSS: no h elementos/atributos para mudar
cor, alinhamento, etc.
!! Pode ser misturada (estendida) com outras linguagens XML
(MathML, SVG, linguagens proprietrias)
!! Normalmente gerada via XSLT
XML
XSLT XML
Documento
Processador XSLT
XML XHTML
Documento
Fonte 25
<svg xmlns="http://www.w3.org/2000/svg">
<circle style="fill: red" cx="3cm" cy="3cm" r="2.5cm" />
<rect style="fill: blue" x="6cm" y="6cm" SVG
height="2.5cm" width="1.5cm" />
Zoom +
Zoom +
26
Exemplo de SVG
JavaScript
!"#$%&'()*+,-./0,%*1'$*)+,-./0,2%%
%%!$%34/5'/6+,7518)9:;5'/3<%43%$8<=3%->:?,2%%
%%%%!/'8/51%")@51+,A'55B%81(,%% CSS
%%%%%%%%%%%%/C+,D/0,%/@+,D/0,%8+,EFG/0,%H2%%
%%%%!81/)%")@51+,A'55B%I5<1,%C+,J/0,%@+,J/0,%%
%%%%%%%%%%*1'$*)+,EFG/0,%&'()*+,-FG/0,%H2!H$2%%
%%!$%34/5'/6+,7518)9:;5'/3<%43%$8<=3%E>:?,2%%
%%%%!/'8/51%")@51+,A'55B%$8114K%3=7/')@B%.FG,%% XLink
%%%%%%%%%%%%/C+,G/0,%/@+,G/0,%8+,E/0,%H2!H$2%%
%%!7%C054"B!"#$%+,*))=BHH&&&F&DF38$H-LLLHC5'46,%%
%%%%%!"#$%B*81A+,*))=BHH&&&F&DF38$HM87=*'/"HNOM,2%%
%%%%!)1C)%")@51+,/3538B%I57/6K%A34)PA70'5@B%)7*307K%%
%%%%%%%%%%%%%%%%%A34)P"'Q1B%-E=),%C+,D/0,%@+,R/0,2%
%%%%NOM%S%TUV!H)1C)2!H72%%
!H"#$2%%
27
Outras aplicaes populares do XML
Classe Classe2
oper(): void oper(): void
oper2(): int 1 * oper2(): int
TEI
MathML
XMI
Classe3
oper(): void
oper2(): int
DocBook WML
VoiceXML
Web Services
SOAP
WSDL XML-RPC
UDDI CML
ebXML
28
Demonstrao
!! Exemplo de transformao XML
PDF
<xslt> FOP
FO
(1.a)
(1) <xsl:fo>
<xml> (1.b)
<xslt> JFOR
Saxon (3) SVG
<xslt>
Texto
(4)
(2)
2000 2001
<xslt> HTML
Texto texto SVG
texto texto
texto texto
HTML
texto texto
texto
29
Concluses
Helder da Rocha
(helder@argonavis.com.br)
3
Estrutura XML
!! Um documento XML pode ser representado como uma rvore.
A estrutura formada por vrios ns (galhos e folhas)
<?xml version="1.0" encoding="iso-8859-1" ?>
<!-- Isto um comentrio --> informaes usadas
pelo processador XML
<cartao-simples>
<logotipo href="/imagens/logo14bis.gif" />
<nome>Alberto Santos Dumont</nome>
<endereco>Rua do Encanto, 22 - 2o. andar -
Centro - 25600-000 - Petrpolis - RJ</endereco>
<email>dumont@14bis.com.br</email>
<telefone tipo="residencial" > um "n" pode ser ...
! um elemento,
<ddd>21</ddd> ! um atributo,
<numero>2313011</numero> ! um bloco de texto,
! um comentrio,
</telefone> ! uma instruo,
</cartao-simples> ! uma declarao,
! uma entidade, ...
4
n raiz
/ rvore XML
elemento raiz do
documento
cartao-simples email
dumont@14bis.com.br
nome
endereco
Alberto
Santos logotipo
Dumont Rua do Encanto, 22 -
2o. andar - Centro
telefone - 25600-000 - href
Petrpolis - RJ
tipo
LEGENDA
21 n de elemento
2313011
n de atributo
residencial n de texto
5 www.argonavis.com.br 5
Componentes de um documento
6
Declarao XML Prlogo
Comentrio (pode aparecer em qualquer lugar)
Instruo de processamento
Declarao de tipo de documento
7
N raiz e elementos
elemento raiz do n raiz
documento (/)
<?xml version="1.0" encoding="iso-8859-1" ?>
<cartao-simples>
<logotipo href="/imagens/logo14bis.gif" />
<nome>Alberto Santos Dumont</nome>
<endereco>Rua do Encanto, 22 - 2o. andar -
Centro - 25600-000 - Petrpolis - RJ</endereco>
<email>dumont@14bis.com.br</email>
<telefone tipo="residencial" >
<ddd>21</ddd> elementos
elementos
<numero>2313011</numero>
</telefone>
</cartao-simples>
8
Atributos
<cartao-simples>
<logotipo href="/imagens/logo14bis.gif" />
<nome>Alberto Santos Dumont</nome>
<endereco>Rua do Encanto, 22 - 2o. andar -
Centro - 25600-000 - Petrpolis - RJ</endereco>
<email>dumont@14bis.com.br</email>
<telefone tipo="residencial" >
<ddd>21</ddd>
<numero>2313011</numero>
</telefone> atributos
</cartao-simples>
9
Ns de texto
<cartao-simples>
<logotipo href="/imagens/logo14bis.gif" />
<nome>Alberto Santos Dumont</nome>
<endereco>Rua do Encanto, 22 - 2o. andar -
Centro - 25600-000 - Petrpolis - RJ</endereco>
<email>dumont@14bis.com.br</email>
<telefone tipo="residencial" >
<ddd>21</ddd>
<numero>2313011</numero>
</telefone> ns de
</cartao-simples> texto
10
Entidades gerais
!! So constantes associadas a um valor de texto
!! Podem aparecer em qualquer lugar do documento
!! So substitudas durante o processamento do documento
!! Podem ser definidas pelo usurio (via DTD)
!! Sintaxe: !"#$%&'&"()
!! Exemplo:
!! !"#$#%"&%'()&*+
!! Entidades pr-definidas:
) )que corresponde a
!! !*$() +)
) )que corresponde a
!! !,$() -)
!! !'./() )que corresponde a !)
!! !012$())que corresponde a 3)
!! !'/24())que corresponde a 5))
11
Entidades de caracteres
14
Elementos e atributos
!"#$#-".#/0&'0-123/0)&0-#45/0*++,0-(%-
!"#$#%-
-!".#%&'!(".#%-
-!123%)&!(123%-
-!#45%*++,!(#45%-
!("#$#%--
16
Quando usar elementos ou atributos?
17
Identificadores de elementos e atributos
19
Contedo misto
20
Bloco CDATA
21
Instrues de processamento
!"+,$-.%/+(**
''*%,%-.'/)0%1'%0&2,''
'''''3$)0'&4%/(&''
'''''56%$%'2(789''
"+''
22
Comentrios
23
Declarao XML
!"#$%&!'()*+,-./012/!!
!!!!!!(-3,4+-5./+*,6778960/!!
!!!!!!*:;-4;&,-(./<(*/!#=!!
24
XML Namespaces
!! Permite que elementos de mesmo nome de diferentes
aplicaes sejam misturados sem que haja conflitos
!! Um namespace (universo de nomes) declarado usando
atributos reservados
!! !"#$%&'()*$+(,(-.)/0'1(namespace default): associa o
identificador com todos os elementos contidos no elemento que declara
o atributo que no esto qualificados com prefixo. Ex: 2$/"*31
!! !"#$%450*,(!/&'()*$+(,(-.)/0': associa o identificador com
os elementos e atributos contidos no elemento que declara o atributo
cujo nome local precedido do prefixo. Ex 250*,(!/4$/"*31
!! O prefixo arbitrrio e s existe dentro do documento
!! O identificador (geralmente uma URI) deve ser reconhecido
pela aplicao para validar o documento
!! XML Namespaces uma especificao a parte
!! !""#$%%&&&'&(')*+%,-%./0123/45%6
25
Exemplo
Vale para todo o Esta URI
elemento <cartao> est associada a
este prefixo
<ct:cartao
xmlns:ct="urn:B1-01.234.567/cartoes">
<ct:nome>Alberto Santos Dumont</ct:nome>
<ct:endereco>Rua do Encanto, 22 - Centro
25600-000 - Petrpolis - RJ</ct:endereco>
<ct:email>dumont@14bis.com.br</ct:email>
<ct:telefone tipo="residencial">
<ct:ddd>21</ct:ddd>
<ct:numero>2313011</ct:numero>
</ct:telefone>
</ct:cartao>
26
Exemplo com 3 namespaces
<departamento
Namespace
xmlns:ct="urn:B1-01.234.567/cartoes" default
xmlns="emp:E2-3349.9.0001-89/empresa"
xmlns:html="http://www.w3.org/WD/REC-HTML/Strict">
27
Observaes importantes sobre namespaces
!! O escopo da declarao xmlns (sem prefixo) inclui
!! O elemento onde ela acontece
!! Os elementos-filho
!! O escopo da declarao xmlns:prefixo inclui
!! O prprio elemento se qualificado com mesmo prefixo
!! Os elementos-filho qualificados com o prefixo
!! Os atributos do elemento onde ocorre a declarao e
elementos filho qualificados com o prefixo
!! O identificador no representa endereo na internet
!! Geralmente escrito como URL, porque URLs so unvocas
!! O identificador string e no endereo: omitir ou incluir
uma ! final faz diferena
!! Declarar e usar um namespace pode ser opcional
!! Depende da aplicao que ir processar o documento
28
XML: uma introduo prtica X100
Helder da Rocha
(helder@argonavis.com.br)
3
Por que validar?
5
Esquema
Documentos que aderem
especificao (vlidos) !! O esquema representa uma classe
!! Os documentos so instncias
Esquema (universo de
documentos vlidos)
Documento
fora da !! Como definir esquemas:
especificao !! DTD - Document Type Definition
!! W3C XML Schema
6
Documentos vlidos
7
O que define um esquema
!! Um vocabulrio
!! Elementos, atributos
!! Uma gramtica
!! Relacionamentos (que elementos so permitidos onde, e
de que forma, e com que contedo)
!! Uma coleo de entidades
!! Variveis que so substitudas por valores constantes
durante o processamento (nem todo esquema tem
suporte a declarao de entidades)
8
O que um DTD?
!! Um DTD (Document Type Definition) declara todos os
elementos e atributos de um documento XML
!! Define quais elementos e atributos so vlidos e em que contexto
!! A sintaxe baseada em SGML. Para definir um elemento:
<!ELEMENT nome-do-elemento (modelo de conteudo)>
!! O DTD do web.xml define principalmente elementos
!! Exemplo: DTD para um documento simples
<!ELEMENT pessoa (nome, web?, telefone+)>
<!ELEMENT nome (prenome, inicial*, sobrenome)>
<!ELEMENT prenome (#PCDATA)> pessoa tem nome, seguido de zero
<!ELEMENT inicial (#PCDATA)> ou um web e um ou mais telefone
<!ELEMENT sobrenome (#PCDATA)> nome tem um prenome, seguido
<!ELEMENT web (email|website)> de zero ou mais inicial e um
sobrenome
<!ELEMENT email (#PCDATA)>
<!ELEMENT website (#PCDATA)> web pode conter ou um
email ou um website
<!ELEMENT telefone (#PCDATA)>
Elementos que s podem conter texto
9
Documentos vlidos segundo o DTD
!! Os documentos abaixo so vlidos segundo o DTD mostrado na
pgina anterior
<pessoa>
<nome><prenome>Giordano</prenome>
<sobrenome>Bruno</sobrenome></nome>
<telefone>1199343232</telefone>
</pessoa>
<pessoa>
<nome><prenome>Giordano</prenome>
<sobrenome>Bruno</sobrenome></nome>
<web><website>www.site.com</website></web>
<telefone>1199343232</telefone>
<pessoa> </pessoa>
<nome><prenome>Giordano</prenome>
<inicial>F</inicial><inicial>R</inicial>
<sobrenome>Bruno</sobrenome></nome>
<web><email>giordano@web.net</email></web>
<telefone>1199343232</telefone>
<telefone>1134999992</telefone>
</pessoa>
10
Documentos invlidos segundo o DTD
!! Os documentos abaixo no so vlidos de acordo com o DTD.
!! Por que?
<pessoa>
<nome><prenome>Giordano</prenome>
<sobrenome>Bruno</sobrenome></nome>
</pessoa>
<pessoa>
<nome><prenome>Giordano</prenome>
<sobrenome>Bruno</sobrenome></nome>
<web><website>www.site.com</website>
<email>giordano@web.net</email></web>
<telefone>1199343232</telefone>
</pessoa>
<pessoa>
<nome><prenome>Giordano</prenome>
<sobrenome>Bruno</sobrenome></nome>
<telefone>1199343232</telefone>
<telefone>1134999992</telefone>
<web><email>giordano@web.net</email></web>
</pessoa>
11
DTD para validar uma instncia
<bilhete codigo="ZMIKT8">
<voo transportador="JH"
numero="2349"
de="REC" para="CGH" />
<passageiro>
<sobrenome>Newton</sobrenome>
<prenome>Isaac</prenome>
</passageiro>
</bilhete>
12
Possveis regras de validao
!! Os elementos permitidos so
!! bilhete, voo, passageiro, sobrenome, prenome
!! O elemento bilhete contm pelo menos um voo e
exatamente um passageiro
!! o elemento passageiro deve ter um elemento
sobrenome e um elemento nome
!! os atributos de e para de voo contm valores
!! que podem ser escolhidos de uma lista em um DTD
!! que podem ser qualquer coisa, em outro DTD
13
UM possvel DTD
!"#$#%#&'(345546-*71(/(51)7-F1G-2(37-F1G-(8(9(
!"#$#%#&'(37-F1G-(/(AHIE:':(8(9(
!"#$#%#&'(51)7-F1G-(/(AHIE:':(8(9(
!"#$#%#&'(011(#%H'J(9(
!":''$;<'(011(>-(&%'?@#&(AB#CD;B#E(9(
!":''$;<'(011(FKG-71(&%'?@#&(AB#CD;B#E(9(
!":''$;<'(011(3474(&%'?@#&(AB#CD;B#E(9(
!":''$;<'(011(.74F5317.4>17(&%'?@#&(AB#CD;B#E(9((
14
Um DTD melhor
!"#$#%#&'(456657-*81(/(61)8-G1H-3(48-G1H-(9(:(
!"#$#%#&'(48-G1H-(/(BIJF;';(9(:(
!"#$#%#&'(61)8-G1H-(/(BIJF;';(9(:(
!"#$#%#&'(011(#%I'K(:(
!";''$<='(011(?-(/C#J(L(JMN(L(MCE(L(=FE9(BC#DE<C#F(:(
!";''$<='(011(GOH-81(&%'@A#&(BC#DE<C#F(:(
!";''$<='(011(4585(/C#J(L(JMN(L(MCE(L(=FE9(BC#DE<C#F(:(
!";''$<='(011(.85G6418.5?18(/PN(L(CM9(BC#DE<C#F(:((
15
Elementos de um DTD XML 1.0
!! !"#$%&'()*++
!! Vincula o DTD a um documento
!! Usad0 no incio do documento XML
!! !"),)-).&*++
!! Define um elemento
!! !"/&&,01&*++
!! Define os atributos de um elemento
!! !").&0&'*++
!! Define uma entidade ( ex: !"#$%&')
!! !".$&/&0$.*++
!! Define notao interna para uma URI
16
Elemento <!DOCTYPE>
!! O elemento <!DOCTYPE> um elemento do DTD que deve
ser usado dentro da pgina XML
!! Identifica o elemento raiz
!! Associa o arquivo a um DTD atravs de URL ou identificador pblico
!! Como vincular um documento XML a um DTD
!"#$%&'()*+,-./012/&(-3,4+-5./6789::;<90/&"=&
!>!"#$%&'(3?)@?,9*+$A%(*&)%)$'*(/3?)@?,14@4/=&
!3?)@?,9*+$A%(*=&
&&&!-,$(=&B111C&
nome do elemento onde buscar validao: URI ou
raiz do documento SYSTEM ou PUBLIC identificador
17
DTD Interno
!"#$%&!'()*+,-./012/!(-3,4+-5./+*,6778960/!#:!
";<=>?@AB!!"##$%&C!
!!";BDBEBF?!G(**,H!I-,%(J!G),K+**H,LM:!
!!";BDBEBF?!-,%(!IG)(-,%(J!*,N)(-,%(M:!
!!";BDBEBF?!G)(-,%(!IOA><P?PM:!
!!";BDBEBF?!*,N)(-,%(!IOA><P?PM:!
!!";BDBEBF?!G),K+**H,!IOA><P?PM:!
Q:!
!"G(**,H:!
!!"-,%(:!
!!!!"G)(-,%(:R+3SH)4"TG)(-,%(:!
!!!!"T*,N)(-,%(:U(V-%H-"T*,N)(-,%(:!
!!"T-,%(:!
"TG(**,H:!
18
DTD incompleto
!! Sintaxe
!!"#"$"%&'"#$%&'#&%(%$%")#*+#")%,'#*-*
!! O contedo pode ser
!! (1) ()*+,-&-.,
!! (2) (uma seqncia.,
!! (3) (uma lista de opes.,
!! (4) (contedo misto.,
!! (5) a palavra "$*&/ ou
!! (6) a palavra -%/.
21
Contedo #PCDATA
22
Contedo Seqncia
24
Contedo misto
!! !"#$%&'&()(*+*,-()(...()(*+*,/01(
!! Permite contedo de elementos, contedo de texto ou
elementos misturados com texto
!! Contedo misto no admite outra sintaxe
!! "#$%&'&(tem que ser o primeiro elemento
!! O * no final obrigatrio
!! No possvel controlar o nmero ou ordem dos filhos
!! Exemplo: a seguinte declarao em DTD
!"#$%$&$'(!2345*()*+,-.(.!/!*/245*012!
permite o seguinte contedo
(62345*7.!34567!897!6*/245*77:768*/245*7(:79!;<=!3=>!5!
897!6*/245*77:568*/245*7(=9?>9@682345*7(
25
Contedo Vazio e Any
26
Elemento <!ATTLIST>
!! Sintaxe
!"#$$%&'$(()*)+),-.((
(( ( ( (( (/-0123-.4(-15.(6/*.078)9/3*-:((
!"#$$%&'$(()*)+),-.((
(( ( ( ( (/-0123-.;(-15.(6/*.078)9/3*-:((
<<<((
ou((
!"#$$%&'$(()*)+),-.((
(( ( ( ( (/-0123-.4(-15.(6/*.078)9/3*-((
(( ( ( ( (/-0123-.;(-15.(6/*.078)9/3*-((
(( ( ( ( (/-0123-.=(-15.(6/*.078)9/3*-((
(( ( ( ( (/-0123-.>(-15.(6/*.078)9/3*-((
<<<(:(
27
Exemplos
!"#$%%&'(%!)**!+,!-.%/01-!!!2'.3&'14!5!
"#$%%&'(%!)**!678,9*!:4$%$!2;'<14!=>?@A?B>=5!
"#$%%&'(%!)**!CD9D!EF1:!G!:HI!G!HFJ!G!(4JK!2F1LJ'F14!5!
"#$%%&'(%!)**!M9D6NC*9MD+*9!EFH!G!OIK!=FH=!5!
ou
!"#$%%&'(%!)**!+,!-.%/01-!!!!!2'.3&'14!!
! ! ! !!!!!!678,9*!:4$%$!!!2;'<14!=>?@A?B>=!
! ! ! !!!!!!CD9D!EF1:!G!:HI!G!HFJ!G!(4JK!2F1LJ'F14!!!
! ! ! !!!!!!M9D6NC*9MD+*9!EFH!G!OIK!=FH=!5!
28
Tipos de dados
!"#$#% ,"-*.%
&'$()*&% ,"-*.+%
&'$()*&+% *&$,$/%
Lista de opes *&$,$,*+%
,"% &($#$,(&%
29
Tipo CDATA e NMTOKEN
30
Tipo lista de opes
31
Tipo ID
!! Atributos do tipo ID tem que conter um nome (e no
NMTOKEN) que seja unvoco no documento.
!! Nome tem mesmas regras que identificador XML
(caracteres alfanumricos, no comea com nmero, etc.)
!! No se pode usar um nmero como contedo de um
atributo declarado como ID.
!! A soluo colocar um prefixo antes do nmero que seja ou
uma letra ou um sublinhado.
!! Elementos s podem ter um tipo ID
!! No pode haver outro elemento na mesma pgina com o
mesmo ID
!! Exemplos
!"#$%%&'(%!)**!!"#$%"&'(&+,-./',-01!
"#$%%&'(%!234*5*!)*+,-"&'(&+,-./',-01!
32
Tipo IDREF
33
Tipo IDREFS
34
Valores default
36
Elemento <!ENTITY>
!! H vrios tipos de !"#$%&%'()
!! Definem entidades: variveis usadas nos DTDs e documentos XML
!! Entidades de parmetro (*+,-./): usadas apenas no DTD
!! internas contm texto declarado localmente no DTD
!! externas contm contedo de arquivos externos (sub DTDs)
!! Entidades gerais (0+,-./): usadas apenas no XML
!! internas (so sempre processadas)
!! caractere cdigo Unicode: ō 㪴
!! globais cinco entidades: < > & " e '
!! definidas pelo usurio contm texto declarado no DTD
!! externas (carregam dados de arquivos externos)
!! processadas incluem texto de arquivos externos no XML; o processador
resolve as entidades e blocos CDATA se houver
!! no-processadas incluem formatos binrios (ex: imagens); o processador
ignora o contedo e no processa (usado em atributos apenas)
37
Entidades gerais internas
!"#$%&%'()*+,(-./0*1-2(
!! Exemplos:
!"#$%&'&(!,+31,4/()*+,$!'-./01234!54678!!!!
!!!!!!!!!!!!!!!!!!!+96:2;39!.<!+93040!=>*>)?!
"#$%&'&(!5*361789:()"14@A<?!
"12?!
!!!"1.?+97B23CD1!5EFGG*H!IGGG"J1.?!
"J12?!
"J14@A<?)?!
!! Uso
!"1<F19?!K3031<!4!;,+31,4/<!43-.4!D9L<#>!!
"J1<F19?!
!!".3M?!;5*361789:<("J.3M?!!
38
Entidades gerais externas
!"#$%&%'()(*+,-(./01+2.3(
!! Variveis declaradas e usadas apenas dentro do DTD
!! Em vez de repetir
!"#$%$&$'(!)**!+,!!!-.$/!0!/12!0!1.3!0!141!0!56378!
"#$%$&$'(!)**!9:;:!-.$/!0!/12!0!1.3!0!141!0!56378!
!! Declare as entidades
!"#$'(4(<!)(0-2+45((=/12!0!1.3=8!
"#$'(4(<!)(0-2+26+(=141!0!563=8!
!! E use no DTD
"#$'(4(<!)(0-2+5+27+4(=.$/!0!)0-2+26+8(0!)0-2+458=8!
"#>((%45(!)**!+,!-)0-2+5+27+487!?.$@34.$6!8
"#>((%45(!)**!9:;:!-)0-2+5+27+487!?.$@34.$6!8!
41
Entidades de parmetro externas
!! Carregam fragmentos de DTDs externos
!"#$%&%'()(*+,-(.'.%#/(0123+405(
!! Exemplo
!"#$%&'&(!)(627-32()()&$*!+1++89:6:+,!
!! preciso chamar a entidade dentro do DTD.
!! Uso ! Resultado
!"#$%&'&(!---,!! "#$%&'&(!---,!!
)627-32;(! "#$%&'&(!/!01!!+2345367+,!!
"#$.$*$%&!---,! "#$%&'&(!/!89:!+3'35);7+,!
!---!! "#$.$*$%&!---,!
!! Contedo de voos.dtd:
!"#$%&'&(!/!01!!+2345367+,!!
!"#$%&'&(!/!89:!+3'35);7+,
42
Condicionais
!! DTD
!! vantagem: simples
!! desvantagens: (1) no usa sintaxe XML; (2) limitado.
!! XML Schema
!! vantagem: (1) XML; (2) permite especificao muito
mais precisa e detalhada.
!! desvantagem: muito mais complicado que DTD
!! Schema ainda no resolve todos os problemas
!! Outras alternativas: Trax, RELAX, Schematron
!! XML Schema extensvel e permite usar essas linguagens
para completar a validao
!! Em certos casos ainda pode ser preciso realizar validao
adicional usando alguma linguagem (Python, Java)
45
XML Schema
!"#$%&'()*+,-./012/"3&
!#*4*56($7&#$%-*4#*./68894::;;;1;<1,)=:>220:?@AB56($7/3&
&!#*4(%($(-8&-7$(./C+%6(8(/3&
&&!#*45,$9%(#DE9(3&
&&&!#*4*(FG(-5(3& !! XML Schema uma
&H111I&
&&!#*4(%($(-8&-7$(./',,/3&
alternativa ao DTD
&&&!#*45,$9%(#DE9(3& !! Oferece mais
&&&&!#*4788)+CG8(&-7$(./J(/&G*(./)(FG+)(J/3& recursos
&&&&&!#*4*+$9%(DE9(3& !! Usa sintaxe XML
&!#*4)(*8)+58+,-&C7*(./#*4*8)+-=/3&
&&!#*4(-G$()78+,-&'7%G(./KLM/&:3& !! Exemplo (trecho do
&&!#*4(-G$()78+,-&'7%G(./MNO/&:3& XML Schema para
&&!#*4(-G$()78+,-&'7%G(./NKP/&:3&
&&!#*4(-G$()78+,-&'7%G(./BQP/&:3& o bilhete de vo)
&!:#*4)(*8)+58+,-3&
&&&&&!:#*4*+$9%(DE9(3&
&&&&!:#*4788)+CG8(3&H111I&
&!:#*4(%($(-83&
!:#*4*56($73&
46
XML: uma introduo prtica X100
Helder da Rocha
(helder@argonavis.com.br)
6
Como escolher entre SAX e DOM
! No so concorrentes so complementares
! DOM ideal para manipular a rvore XML recursivamente
e fundamental para scripting
! SAX ideal para ler o documento seqencialmente
! DOM requer carga de todo o documento antes de iniciar o
processamento: consome mais memria
! SAX no "lembra" de tarefas realizadas: no serve para
validar referncias cruzadas
! Em aplicaes tpicas, havendo suporte a DOM, use-o!
! muito mais produtivo, moderno e fcil de entender
! Use SAX quando precisar de eficincia
! Use SAX quando no puder ter o XML inteiro na memria
(ex: extrao seletiva, busca, processos paralelos, etc.)
7
SAX: exemplo do funcionamento
! Se um processador SAX receber o documento ...
!"#$%&$'!
!!"()*+$,)(!-./010'23(!.-$4"5()*+$,)('!
"5#$%&$'!
! ... ele ir disparar os seguintes eventos:
! !"#$"%&'()*+",-.
!!"#$"/0*)*+",1'#$"#12.34-.
!!"#$"/0*)*+",1)*+!#5*)12.36""$78("*,179121:1-4-.
!';#$#'"*$!,1<&).97#=1-.
!*+9/0*)*+",1)*+!#5*)1-.
!*+9/0*)*+",1'#$"#1-.
! *+9%&'()*+",-.
! Programador deve implementar um objeto "ouvinte" para
capturar os eventos e extrair as informaes desejadas
8
Como usar SAX em Java
! Crie classe ouvinte estendendo !"#$%&'$()*$+,-)./01)23/,"4
!"#$%&'&$())'567)*1)23/,"4*+,*-.)'/*0("$,1(-.$*2'34445'
! Implemente os mtodos de evento desejados nessa classe
! Crie outra classe para inicializar o parser e processar o
documento XML
! Importe as classes 789:)"(,";)'0!"6, 789:)"(," e 95<=,)3,"
de !"#$%&'$()*4
6789(2)*2:(&,;2<')!0'='6789(2)*2:(&,;2<4-*>?-),(-&*@AB'
6789(2)*2')!'=')!04-*>6789(2)*2@AB'
8CDE*(.*2'2*(.*2'=')!4F*,8CDE*(.*2@AB'
2*(.*24)*,G;-,*-,1(-.$*2@2,%4567)*1)23/,">?AB'HH'
2*F%),2;'.*'%-,*20(&*'
2*(.*24!(2)*@I3!'.@,20!$*@/JAB'
9
Exemplo em Java: handlers de eventos
!"#$%&'()%*'!"#$#!%&$'+&,-./0'&,1'%23'43-.31'%23'$5263,7'8'
''9).'+%23'%':'43-.3;'%'<'$5263,;'%==7'8'
''''>?435@A)"3A!.%23$2+&,/%07;'
''B'
B'
!"#$%&'()%*''%#$%()&*&+%+>3.%26'".%1'>3.%26'$)&-$C-@51'
'''''''''''''''''''''''''>3.%26'DC-@51'E33.%#"354'-337'8'
''>?435@A)"3A!.%23+F<F'='DC-@57;'
''9).'+%23'%':'G;'%'<'-33A653H5263,+7;'%==7'8'
''''>?435@A)"3A!.%23+F'F'='-33A653IC-@5+%7'='F:JF'
'''''''''''''''''''''''''='-33A653K-$"5+%7'='FJF7;'
''B'
''>?435@A)"3A!.%23$2+FLF7;'
B'
!"#$%&'()%*'&+,()&*&+%+>3.%26'".%1'>3.%26'$)&-$C-@51'
'''''''''''''''''''''''''''''''''''>3.%26'DC-@57'8'
''>?435@A)"3A!.%23$2+F<MF'='DC-@5'='FLF7;'
B'
10
Processamento XML com DOM
DocumentFragment
Document
Text CDATASection
CharacterData
Comment
Attr
Element
Node
DocumentType NodeList
Notation NamedNodeMap
Entity
EntityReference
ProcessingInstruction
13
W3C DOM: tipos de n
! DOM usa constantes para identificar tipos de n (nodeType)
Constante* (opcional) Tipo valor
! !"!#!$%&$'(! ) ) ) ) ) )!*+,+-. ) ) ) ) )/)
! 0%%1234%!&$'(! ) ) ) ) )0..5 ) ) ) ) ) )6)
! %!7%&$'(!) ) ) ) ) ) )%+8. ) ) ) ) ) )9)
! :(0%0&;!:%2'$&$'(! ) ) ) ):(0%0;+<.=>-) ) ) )?)
! !$%2%@&1!A!1!$:!&$'(! ) ) )!-.=.B1+C+5+-<+ ) ) )D)
! !$%2%@&$'(! ) ) ) ) ) )!-.=.B) ) ) ) ) )E)
! F1':!;;2$G&2$;%14:%2'$&$'(! )F5><+HH=-I2-H.5J<.=>- )K)
! :'##!$%&$'(! ) ) ) ) ) ):>,,+-. ) ) ) ) )L)
! (':4#!$%&$'(!) ) ) ) ) )(><J,+-. ) ) ) ) )M)
! (':4#!$%&%@F!&$'(! ) ) ) )(><J,+-.%BN+) ) ) )/O)
! (':4#!$%&A10G#!$%&$'(!) ) )(><J,+-.A5PI,+-.) ) )//)
! $'%0%2'$&$'(!) ) ) ) ) )$>.P.=>- ) ) ) ) )/6)
! NamedNodeMap
! Node item(int)
! Node getNamedItem(String)
! Node nextNode()
! void reset()
! int getLength() length
! NodeList
! Node item(int)
! Node nextNode()
! void reset()
! int getLength() length
16
Interface Element
! String getAttribute(String)
! String getAttributeNS(String, String)
! Attr getAttributeNode(String)
! Attr getAttributeNodeNS(String, String)
! NodeList getElementsByTagName(String)
! NodeList getElementsByTagNameNS(String, String)
! String getTagName() tagName
! boolean hasAttribute(String)
! boolean hasAttributeNS(String, String)
! void removeAttribute(String)
! void removeAttributeNS(String, String)
! void setAttribute(String, String)
! void setAttributeNS(String, String, String)
17
Interfaces Attr e Text
! Attr
! String getName() name
! Element getOwnerElement() ownerElement
! String getValue() value
! void setValue(String)
! Text e CharacterData
! void appendData(String)
! String getData() data
! int getLength() length
! void insertData(int, String)
! void replaceData(int, int, String)
! void setData(String)
18
W3C DOM 2.0 com namespaces
*4=>'?$#?9>'+'=4?2?#>@">A9>B>%"*!C()&*!D,?$#?9>,E7'
?$#?9>2(>"F""#$GH">*!C%H99D,?8,DI66E7'
?$#?9>2(>"F""#$GH">*!C%H99D,?J,DI66E7'
?$#?9>2(>"F""#$GH">*!C89$%:*!D',-#>K,D',-""./001112@0?4B,E7'
19
Interface Document
! Attr createAttribute(String)
! Attr createAttributeNS(String, String)
! Element createElement(String)
! Element createElementNS(String, String)
! Text createTextNode(String)
! DocumentType getDocType() docType
! Element getDocumentElement() documentElement
! Element getDocumentById(String)
! NodeList getElementsByTagName(String)
! NodeList getElementsByTagNameNS(String, String)
20
20
Exemplo criao de rvore
+%,-*,." /0('()*"
carta := document.createElement("carta")
+'()1,2('." /0('()*"
mens := document.createElement("mensagem")
3$'"45,6" 7*-5)2"
21
DOM: montagem da rvore
+,$"-.(/"
#0(12(".-3454*"
! 2. Sub-rvore <carta>
#$%&'()%$*"
#0(12(".-3454*"
carta.appendChild(mens)
+,$"-.(/"
#$%&'()%$*"
document.appendChild(carta)
+,$"-.(/"
22
Como obter o document
! Para usar DOM preciso obter uma referncia a um
elemento do tipo Document
! Em C#, use classes do System.XML
! Em Java, inicialize um processador (pacote javax.xml e objeto
DocumentBuilder) e use a API DOM em org.w3c.dom
! Em PHP 5, crie um DomDocument
! Em aplicaes XML que rodam no browser (XHTML,
SVG) h um objeto pre-definido document
! Em browsers HTML, o objeto document pode ser usado em
scripts (ex: document.getElementById('nome'))
! Nas implementaes de visualizadores SVG o objeto default
tambm se chama document
23
Obteno do Document em Java
! Use os pacotes javax.xml.parsers.* e org.w3c.dom.*
! Para obter um Document
! Crie um javax.xml.parsers.DocumentBuilder
!"#$%&'()*%+,-'./0$)#.1!20$)#.1!3!!!!!!
!!!!!!!!!!!!!!!!"#$%&'()*%+,-'./0$)#.14('56(7)0($'89:!!
!"#$%&'()*%+,-'.!!"#$%&'(3!20$)#.14('5"#$%&'()*%+,-'.89:!
! Chame builder.newDocument() para obter um elemento
raiz de um documento vazio (org.w3c.dom.Document)
!"#$%&'()!%)*"+&,-!3!;%+,-'.4('5"#$%&'()89:!
! Ou chame builder.parse("documento.xml") para obter o
elemento raiz de um documento XML existente
!"#$%&'()!%)*"+&,-(3!;%+,-'.4<0.7'8=-#$%&'()#4>&,=9:!!
25
Exemplo de DOM com .NET (C#)
26
Exemplo de DOM em PHP 5
27
Exemplo em Objective-C (Mac OS)
! Para criar um Document novo
!"#$%&'()(*+,-./01,2,,
3!"#$%&'()(*+,-45!"#$%!67(,('()(*+80+9!/)(:;<=(>>6/<?@,
!"#$%A6BC)(*+,!"#$%&'()2,,
55!"#$%A6BC)(*+,/''6B?,0*0+80+9D66+&'()(*+:./01?@,
! Para obter o Document de um documento existente
!"ED%,-FC.',2,5!"ED%,F0'(ED%80+9G/+9:;</.HC0I6JK)'<?@,
!"#$%A6BC)(*+,!"#$%&'()*2,55!"#$%A6BC)(*+,/''6B?,,,
,,,,,0*0+80+9L6*+(*+>MFED%:FC.',,
,,,,,,,,,,,,,,,,,,,6=+06*>:!"#$%!67(G.(>(.I(890+(>=/B(,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,(..6.:N(..?@,
! Exemplo de uso (no usa interfaces DOM padro)
!"#$%&'()(*+,-('()(*+6,2,3!"#$%&'()(*+,-4,55"#$%&'(),
*67(>O6.#G/+9:;<-5;072P>(B/6P?<,(..6.:,N(..4,6QR(B+S+T*7(K:U?@,
5('()(*+6,/77L90'7:5!"#$%&'()(*+,('()(*+80+9!/)(:;<=<??@
! Gravao de XML
!"A/+/,-K)'A/+/,2,5"#$%&'()*
#$%A/+/80+9M=+06*>:!"#$%!67(G.(++VG.0*+?@,,,,,
5K)'A/+/,W.0+(X6O0'(:;<.(>C'+/76JK)'<,/+6)0B/''V:Y&"?4@,,
28
DOM padro: usar o no usar
29
XML: uma introduo prtica X100
Helder da Rocha
(helder@argonavis.com.br)
2
O que uma folha de estilos?
3
CSS e XSL
!! Principais linguagens de folhas de estilo disponveis para XML
!! CSS
!! utiliza a estrutura existente do documento
!! regras informam ao browser como ele deve formatar cada
elemento da rvore
!! interpretada em tempo de execuo (no pode guardar o
resultado da transformao)
!! XSL (XSLT + XSL-FO)
!! altera a estrutura do documento (transforma)
!! regras informam ao processador elementos e atributos que devem
ser substitudos
!! formatao estilo-CSS via especificao XSL-FO
!! interpretada em tempo de execuo ou previamente (pode
guardar o resultado da transformao)
4
Por que usar CSS?
!! Em HTML
!! Alterar a forma original determinada pelo estilo do browser
!! Separar contedo da forma de apresentao
!! Simplificar a manuteno de um grande site
!! Ter grande controle sobre cores, fontes, layout
!! Tornar as pginas mais leves e o site mais rpido
!! Em XML
!! Dar forma a elementos que no tm forma predefinida
!! Soluo para a Web (browsers que suportam XML e CSS)
!! Suporte: depende do visualizador (nem tudo que funciona
para HTML em um browser funciona para XML)
!! Aplicaes como SVG e XHTML definem em especificao
suporte formal a recursos do CSS (suporte parcial em SVG)
5
Como usar CSS
6
CSS essencial: regras
!! Uma folha de estilo CSS um conjunto de regras. Cada regra
tem a forma
!"#$#%&'()!***)!"#$#%&'+!,!-'&-'.#/0/#1!20$&'3!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!***3!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!-'&-'.#/0/#1!20$&'!!
!!!!!!!!!!!!!!!!!!!!!!!!4!
!! Alem das regras, uma folha de estilos CSS pode ter
!! Comentrios:
!56!"#$#%&'!.7+&'0/&!,8&+%1!(9-%4!!65!
!! Instrues:
!:.;-&'%!
!:;#/.0!
!:-07#!
!:8&+%<80=#!
!:=>0'"#%!
!:+&;#!
7
Seletores
8
Seletores elementares
9
Resoluo de conflitos
10
Predicados
11
IDs
12
Seleo por contexto hierrquico
13
Seleo por contexto de posio
14
Pseudo-classes
15
Classes
!! Classes permitem agrupar vrios elementos
!! Depende de suporte formal por parte da aplicao XML: requer a
definio de um atributo class (logo no funcionam com qualquer XML)
!! So suportadas por XHTML (e HTML) e SVG
!! Exemplo usando classes em XHTML:
!"#!"#$$%&'#()*&$%&#'()*'+#+#,&(#-*..(/#0+1+!2"$##
!"#!"#$$%&+),"-&$3()*'45-+#+3+#'()*'45-+/#+#64)+#7#
,&(#+#8489+''+#(5)(''+&:.(#(;#<4)*;!2"$##
!"#!"#$$%&.,$'-&$=;#8489+''+>#%5)(''4-+#(;#<4)*;>#!2"$##
!"#!"#$$%&'#()*&$%5)(''4-+#<4)*5-+/#?(59+'#@*."+/#A&/#
4&/#4&/#51+#.4B(>#!2"$##
!! Para dar a cada pargrafo de um mesmo personagem (mesma classe)
os mesmos atributos de estilo, usa-se:
#/+),"-0C#8+<+'D#;4'++5#E##
#/'#()*0C#8+<+'D#B<48F#E##
#/.,$'-0C#8+<+'D#54GH#E#
16
@import
17
@font-face
18
@page e @media
19
Propriedades de estilo
!! Atributos que alteram a aparncia dos dados, e que so
aplicados aos seletores
!! Sempre dependem de suporte da aplicao XML e do processador
!! Aplicar propriedades CSS em um XML genrico qualquer poder
funcionar em um browser que saiba como aplic-las
!! Aplicar propriedades em um XML que especifica formalmente suporte a
CSS deve funcionar em um visualizador compatvel
!! Sintaxe de declaraes
!! Quando usadas dentro de folhas de estilos
!"#$%&'()*#+,'
!! Quando usadas em atributos -./*% de aplicaes XML que o suportam
(XHTML, SVG, etc.)
0%*%$%".#'-./*%12"#$%&'()*#+23'
!! Valores vlidos dependem de suporte da aplicao
!! Para browsers, aplicaes XHTML e SVG, valores vlidos incluem
nomes, unidades, porcentagens, cores, URIs, etc.
20
Propriedades de classificao
!! display
!! muda o papel do elemento
!! bloco, tabela, lista, inline, invisvel
!! essencial para formatar XML genrico em um browser,
pois elementos no tm estrutura default
!! white-space
!! definem a forma de tratamento de espaos
!! list-style-*
!! marcadores, nmeros, etc.
!! estilos para listas de tpicos
!! content
!! substitui seletor por outro contedo
21
Fontes
!! font-*
!! Alteram propriedades relativas a fontes
!! font-family
!! famlia (tipo)
!! font-size
!! tamanho, em vrias unidades: !"#$%&#$'(#$!)#$*&#$*)#$!%$
!! font-weight
!! peso: +,-.#$-'/0"#$122#$322#$444$#$522$
!! font-style
!! estilo de grifo: '"6-'%#$,+-'78*$
!! font-variant
!! variao9$:&6--;%6!:$
!! font-stretch
!! expande ou condensa a fonta
!! font
!! atalho para especificar vrias propriedades de uma vez
22
Atributos de texto
!! text-transform
!! !"#$%"&$'()*+##(,!"-()*&./(,!"-(*
!! text-decoration
!! +01(,&$0()*.2(,&$0()*3&$04)*&$0(5%6,.+76*
!! text-align
!! &(8%)*,$76%)*9+-%$8:)*!(0%(,*
!! vertical-align
!! 3"-(&$0()*%.#)*%(;%5%.#)*<$11&()*3.%%.<)*%(;%53.%%.<*
!! -+3)*-+#(,*
!! #.,!(0%"7(<*
!! text-indent
!! valor ou porcentagem para endentar primeira linha*
!! line-height
!! leading (valor ou porcentagem)
!! letter-spacing e word-spacing
!! valor
23
Cores
!! Unidades
!! !"#$%&&'%&&'%&&()
!! !"#$*++,'*++,'*++,()
!! -!!""##)
!! ./0123124/!)
!! color
!! cor do texto
!! background-color
!! cor do fundo (para qualquer elemento)
!! default:)5!6.786!1.5)
!! CSS 2 suporta tambm RGBA (transparncia)
!! SVG usa fill e stroke para preenchimento de objetos e
traos, em vez de color
24
Background
!! background-image
!! !"#$%&'()&*+
!! !"#$,--./001112%&'()3425"(0%&'()&2(%6*+
!! background-repeat
!! Como tratar a imagem de fundo
!! ").)'-7+").)'-897+").)'-8:7+358").)'-+
!! packground-position
!! Posicionamento da imagem de fundo
!! ;'<=("5!3>8.54%-%53/+.54?,+.54?@+
!! .54?,/+@'#5"7+A+5!+#)6-7+<)3-)"7+"%(,-+
!! .54?@/+@'#5"7+A+5!+-5.7+<)3-)"7+;5--5&+
!! background-attachment
!! 6%9)> - preso janela
!! 4<"5## - preso pgina
!! background (atalho)
25
Blocos
!! Caixa do elemento
!! Posies
26
Blocos: propriedades (1)
!! padding (margem interna)
!! !"##$%&'()!*+!"##$%&',)(()-*+!"##$%&'./0(*+!"##$%&'1$&2(+
!! margin (margem externa)
!! -"1&$%'()!*+-"1&$%',)(()-*+-"1&$%'./0(*+-"1&$%'1$&2(+
!! border-color
!! ,)1#/1'()!'3).)1*+,)1#/1',)(()-'3).)1*+,)1#/1'./0('
3).)1*+,)1#/1'1$&2('3).)1+
!! border-style
!! ,)1#/1'()!'4(5./*+,)1#/1',)(()-'4(5./*+,)1#/1'./0('
4(5./*+,)1#/1'1$&2('4(5./+
!! border-width
!! ,)1#/1'()!'6$#(2*+,)1#/1',)(()-'6$#(2*+,)1#/1'./0('
6$#(2*+,)1#/1'1$&2('6$#(2+
!! border (atalho)
27
Blocos: propriedades (2)
!! width
!! largura do elemento
!! height
!! altura do elemento
!! float
!! flutua para esquerda ou direita (resto do contedo flui)
!! !"!#$%&'()*$%+#,*%
!! clear
!! quando quebrar linha quando vizinho de bloco ,+"-*%
!! !"!#$%+#,*$%&'()*%ou ."*)%
!! visibility
!! )'//#!%ou 0'1'.+#%
28
Posicionamento
!! position
!! !"#$%&'(: relativo ao contexto (absoluto se contexto for a
pgina)
!! )(%!'*+(: relativo posio anterior
!! #'!'*,: relativo ao texto da pgina
!! top
!! coordenada y (0 canto superior)
!! left
!! coordenada x (0 canto esquerdo)
!! z-index
!! coordenada z (layers)
29
XML: uma introduo prtica X100
Helder da Rocha
(helder@argonavis.com.br)
3
XLink coleo de atributos
!! Namespace:
!! http://www.w3.org/1999/xlink
!! Atributos:
!! !"#$%=!"#$%&'!(!')*'+,',!(!&-./*-0!(!!
!!!!!!!!!!/0.!(!*#*&'!(!0'"-10.'!
!! &'$(%=!a URI destino do vnculo
!! )&*+%=!+'2!(!0'%&/.'!(!'$3',!(!-*4'0!(!+-+'!
!! ,-!.,!$%=!-+5-/,!(!-+6'71'"*!(!-*4'0!(!+-+'!
!! !/!0$ = descrio detalhada
!! '*0$ = papel / contexto do vnculo
!! 0,1$0 = descrio sucinta (para exibio)
!! Exemplo de uso tpico
! !8'&'$'+*-!20/345&'$(9:4**%;<<&1=/0>.-$:!<?!
4
Exemplos de link "tipo <a href>" e "<img>"
!"#$%&'()$&*'+,-.//")001112132456078880$&*'+-##
#$&*'+)/9":,-(*%"&:-## Contedo ser substitudo...
#$&*'+).5:;,-<:'=-## ...quando o usurio
solicitar.
#$&*'+)(.41,-5:"&>?:-##
#$&*'+)>?/@>/:,-4'A:B@:(/-C&*'+!0"C##
!*%6#$%&'()$&*'+,-.//")001112132456078880$&*'+-##
#$&*'+)/9":,-(*%"&:-## Contedo ser
embutido no
#$&*'+).5:;,-7D3EF2G"6-## documento...
#$&*'+)(.41,-:%H:=-##
#$&*'+)>?/@>/:,-!"#!$%-0C##
... quando o
documento for
carregado.
5
XPointer
6
XML: uma introduo prtica X100
Helder da Rocha
(helder@argonavis.com.br)
Esquema (universo de
documentos vlidos)
Documento
fora da "! Como definir esquemas:
especificao "! DTD - Document Type Definition
"! W3C XML Schema
2
DTD vs. XML Schema
!! Um esquema essencial para que haja comunicao
usando XML
!! Pode ser estabelecido "informalmente" (via
software)
!! Uso formal permite validao usando ferramentas
genricas de manipulao de XML
!! Solues padro do W3C
DTD XML Schema
<!ELEMENT contato <xsd:schema
(nome, email, telefone)> xmlns:xsd=".../XMLSchema">
<!ATTLIST contato <xsd:element name="contato">
codigo NMTOKEN #REQUIRED> <xsd:complexType>
<xsd:attribute name="codigo"
use="required">
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="astro" type="astroType" /> Elementos
<xs:element name="imagem" type="imagemType"/>
<xs:attribute name="href" type="xs:anyURI"/> Atributos
<xs:attribute name="id" type="xs:ID"/>
<xs:attribute name="nome" type="xs:string"/>
<xs:attribute name="diametrokm" type="xs:decimal"/>
Definio de
<xs:complexType name="imagemType"> tipos de dados
<xs:attribute ref="href" use="required"/>
</xs:complexType>
<xs:complexType name="astroType">
<xs:sequence>
<xs:element ref="imagem" minOccurs="0"/>
</xs:sequence>
<xs:attribute ref="id" use="required"/>
<xs:attribute ref="nome" use="required"/>
<xs:attribute ref="diametrokm"/>
</xs:complexType>
</xs:schema>
5
Compare com um DTD
Exemplo de documento vlido <astro id="p5" nome="Jupiter">
em relao a este DTD <imagem href="jup31.jpg" />
<imagem href="jup32.jpg" />
</astro>
Modelo de contedo
(tipo de dados complexo)
<!ELEMENT astro (imagem*) > Elementos
<!ELEMENT imagem EMPTY > Atributos
8
Fundamentos: Modelos de contedo
9
Raiz e namespace
10
Namespaces
!! Instncia
<se:sistemaEstelar xmlns:se="http://cosmos.org.br"
xmlns:sat="http://cosmos.org.br/sat"
xmlns:cmt="http://cosmos.org.br/com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://cosmos.org.br sistema.xsd
http://cosmos.org.br/sat satelites.xsd
http://cosmos.org.br/com cometas.xsd">
11
Principais elementos
!! Define um elemento
!! Deve estar associado a um tipo de dados
<xs:complexType name="cometaType">
<xs:attribute name="id" type="xs:ID" use="required"/>
<xs:attribute name="nome" type="xs:string" use="required"/>
<xs:attribute name="planetas" type="xs:IDREFS"/>
</xs:complexType>
!! Define um atributo
!! Pode estar embutido na definio de um tipo ou
globalmente acessvel (para reutilizao)
<xs:attribute name="raio" type="xs:decimal"/>
<xs:complexType name="sateliteType">
<xs:complexContent>
<xs:extension base="astroType">
<xs:attribute ref="raio" use="required"/>
<xs:attribute name="anoDesc" type="xs:int"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
14
<simpleType>
<xs:simpleType name="astroID">
<xs:restriction base="xs:ID">
<xs:pattern value="\c\d.*"/>
</xs:restriction>
</xs:simpleType>
Expresso regular
15
Tipos simples do XML Schema
anySimpleType
float
int unsignedLong
language Name NMTOKEN
short
NCName NMTOKENS unsignedInt
byte
ID IDREF ENTITY unsignedShort
<xs:complexType name="astroType">
<xs:sequence>
<xs:element ref="imagem" minOccurs="0"/>
<xs:element name="satelite" type="sateliteType"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="astroID" use="required"/>
<xs:attribute name="nome" type="xs:token" />
<xs:attribute name="diametrokm" type="xs:decimal"/>
</xs:complexType>
17
<simpleContent>
<xs:complexType name="imagemType">
<xs:simpleContent>
<xs:restriction base="xs:string">
<xs:attribute name="href"
type="xs:anyURI"/>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
18
<complexContent>
20
<sequence>
<xs:element name="sistemaEstelar">
<xs:complexType>
<xs:sequence>
<xs:element name="centro" type="centroType"/>
<xs:element name="orbita" type="orbitaType"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="cometa" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
23
XML: uma introduo prtica X100
Helder da Rocha
(helder@argonavis.com.br)
2
Exemplo de XPath
4
Tipos e valores
6
Caminhos (location paths)
!! Um caminho uma seqncia de passos de navegao na
rvore-fonte (documento-fonte)
!! Todo caminho resulta em um n (node) ou conjunto de ns (node-set)
!! O resultado de um caminho produz um contexto
!! O n de contexto: expresses seguintes relativas ao contexto
!! Se for um node-set, o processamento de cada n do conjunto tambm
introduz um contexto: o n corrente
/
!! Todo contexto tem um tamanho e uma posio
!! Caminhos podem ser absolutos ou relativos elemento
neto
!! absolutos: comeam no n raiz (iniciam com "/") filho
!! relativos: comeam no n do contexto (context node) neto
primo
!! Exemplos:
primo
!! !"#$%!&'&(&)*+!,$'-+!)&*+.: contexto node-set 'neto',
que tem tamanho 2 primo
!! //!//!0"$(+123.: caminho relativo a 'neto', n corrente primo
elemento <primo> na posio 3 (node-set tem tamanho 4)
7
Passos
!! !"#$%%&!#&'()
!! qualquer n de texto
!! !"#$%%*$++!,&'()
!! qualquer n de comentrio
!! !"#$%%-.$*!//",01",/&.2*&"$,'()
!! qualquer instruo de processamento
!! !"#$%%-.$*!//",01",/&.2*&"$,'3456$3()
!! instruo <?alvo ... ?>
!! Nem todos os eixos podem ser usados com estes
testes (ex: parent ou attribute no podem)
12
Exemplos de passos simples
!! !"#$%&&'(%)*+ ou '(%)*+,
!! !"#$%&&- ou -,
inclui elementos,
!! ./0)'1&&'(%)*+ ou 22, comentrios, etc.
!! ./0)'1&&)$)3)'1( apenas elementos
!! 4)$5&&'(%)*+ ou 2
!! !"#$%&&!(33)'1*+ ou !(33)'1*+,
!! .0)!)%#'674#8$#'6&&-,
!! 5($$(9#'674#8$#'6&&'(%)*+,
!! 5($$(9#'6&&)$)3)'1(,
!! /'!)41(07(074)$5&&)$)3)'1(,
13
Predicados
!! Expresso XPath entre colchetes, com resultado booleano
!! Usada para filtrar resultado de um passo
!! Opera no contexto do node-set do passo
!! !"#$%&&'()*+,!"#$%&&+*-#)'./ ou '()*+,+*-#)'./
!! Predicado ser true() se existir astro/orbita
!! 0*+%1)+,20*3!+4567885./
!! true() se produto tiver atributo preco contendo 1.99
!! 0*+%1)+,'))*#-1)3&&9+:34;$#<*+;.='))*#-1)3&&0*3!+//
!! predicado restringe node-set produto (primeiro passo)
!! expresso (caminho de dois passos) retorna atributo preco
!! !"#$%&&>,0+(#)#+9?@/A4/$'()?@./
!! 0*3!3%#9B&&9+%3?@,6./
!! 0'*39)&&$#<*+,2#%#+:'450)5/C/2#%#+:'45395./
!! 0'*39)&&9+%3?@,77=1('%+(.=!"#$%&&$#<*+,23-++D.,2#%4;EF8;./
!! predicado duplo (restrio do tipo 'and') no segundo passo
!! pai de <livro> precisa estar dentro de um bloco <usados>
14
Exemplos de caminhos equivalentes
(1)
!! !"#$%&''(!)*++*,-%./0-1+-%.''!"#".#")*2
!! 33!)*++*,-%./0-1+-%.''!"#".#")*2
(2)
!! 4$05$%4"%&/*#/0$+)''5"!-&6+*7!*0-&-*%89:;<!2
22222222222222225=-+4''0$5"*7!*0-&-*%89:><!2
2222222222225=-+4''!"#".#")*7!*0-&-*%89:;<2
!! !!5"!-&6+*7;<!0$5"*7><!!"#".#")*7;<2
(3)
!! 0$+)''$+$?$%&*2@24$05$%4"%&''$+$?$%&*2
!! AA$+$?$%&*22
!! 4$05$%4"%&/*#/0$+)''$+$?$%&*2
(4)
!! !5=-+4''56#0*0!2
25=-+4''56#0*!2
25=-+4''&*!-5*0!2
25=-+4''-&$?7!*0-&-*%89:B<2
!! !56#0*0!56#0*!&*!-5*0!-&$?7B<2
15
Expresses booleanas (1)
!! Operadores de comparao
!! !"#"$ igualdade
!! !"%#"$ diferena
!! !"&'()"$ a menor que b*
!! !"*"$"ou !"&+()"$ a maior que b*
!! !"&'()#"$ a menor ou igual a b*
!! !"*#"$ ou !"&+()#"$ a maior ou igual a b*
16
Expresses booleanas (2)
!! Operadores booleanos
!! !"#$%&'()&!"#$* E lgico
!! !"#$%&&+$&!"#$* OU lgico
!! (+,&-!"#$!..'+/ Negao
!! ,$0!-/ & verdadeiro
!! 1'2.!-/& falso
17
Funes de node-set
!! !"#$%!"#$%&'%()*
!! conta o nmero de elementos de um conjunto
!! exemplos:
!! !"#$%&'()*$%++,- retorna 1 (um pai)
!! !"#$%&!./01++,- retorna no. de filhos
!! 0(2%&-3
!! Retorna o nmero com a posio do ltimo elemento do
conjunto de ns correntes
!! '"2/%/"$&-3
!! o nmero com a posio do n corrente dentro do
conjunto de ns correntes
18
Funes do n de contexto
!! !"#$!"$%&
!! retorna um identificador unvoco para o n de contexto.
!! '()*'+,*-.#%&
!! o nome local (sem o prefixo) do n de contexto
!! ,*-.#%&
!! o nome qualificado (com prefixo de namespace)
!! ,*-./0*).+12!#%&
!! URI do namespace do n de contexto
19
Expresses numricas
!! !"#"$ soma
!! !"%"$ subtrao
!! !"&"$ multiplicao
!! !"!"#$$ diviso
!! !"%&!$$ resto
!! '&()!'()*+(,,-./ arredondamento
!! *+&&''()*+(,,-./ piso (arr. p/ baixo)
!! ,-"+").'()*+(,,-./ teto (arr. p/ cima)
!! /(%'!0"$0"1110"2/" somatrio
20
Expresses de string
!! !"#!$%!"#$%&'"#$(&')))&'"#$*+'
!! concatena vrios strings
!! &'(&%)*#+!"#$&',*,-,.&'/,0+'
!! retorna um fragmento do string procurado
!! &'(&%)*#+,$-%.)!"#$&'"#$123"-45.+'
!! comea no fim de str e termina depois de str_buscado
!! &'(&%)*#+,(.-").!"#$&'"#$123"-45.+'
!! comea no incio de str e termina antes de str_buscado
21
Expresses de string (2)
!! !"#$%&'()*+,%-)!"#$%&
!! remove espaos em branco desnecessrios e remove
espaos antes e depois (trim)
!! .#%!+&%.)!"#$'&"#$()*"+,-.'&"#$("*)"#/#%&
!! troca todas as ocorrencias de str_buscado com
str_substit em str
!! /"#$%.*!0$1)#!0*1'&1,"+,$,%2
!! /"#$%.*!0$1)#!0*1'&1,"+,$,'&2.+,23%&
!! retorna um string contendo num, formatado de acordo
com a mscara (e opcionalmente de acordo com o
locale especificado)
22
Expresses de teste de string
23
XML: uma introduo prtica X100
Helder da Rocha
(helder@argonavis.com.br)
Servidor
CSS CSS Browser
XML XML
Pgina
XSL XSL
3
Uso de um XSLT no browser
! Para que o documento seja transformado ao ser carregado,
vincule-o a uma folha de estilos XSL com <?xml-stylesheet>
!"#$%&'()*+,-./012/&(-3,4+-5./+*,6778960/&":&
!"#$%&'()%*'+**(,-*.'/01234563,,
,,,,,,,,,,,,,,,,,()7*23(*#(8#'%3,+.*923'0%:;<=>?:5#'%3,"@,
!*+*;($<=*;(%<):&
&&&&!3(-;),:&
&&&&&&&&!+$<5($&>)(?./*@-15+?/&A:&
&&&&&&&&!(*;)(%<&-,$(./B,%/&4+<$(;),C$./0D92222/&A:&
&&&&!A3(-;),:&
&&&&!,)E+;<&)<+,F(4GH./21D7I/:&
&&&&&&&&!J%<-(;<&+4./J0/&-,$(./F()3K)+,/&4+<$(;),C$./L7I9/:&
&&&&&&&&&&&&!+$<5($&>)(?./$()3@)M1NJ5/&A:&
&&&&&&&&!AJ%<-(;<:&
&&&&!A,)E+;<:&
111&
4
Transformao standalone
Estilo XSLT
5
Transformao XSLT em Java* (TrAX)
! Inicialize o ambiente (DocumentBuilder, pacotes, etc.)
! Carregue o arquivo-fonte em uma rvore DOM
+"%#6&)4'+%(&"),-''''('>#?3@&$;A5$2&.B8?3&CDDD8")4&;E63B/0'''
! Inicialize a rvore DOM do arquivo resultado
+"%#6&)4'')./%(&"),-'('>#?3@&$;)&*+"%#6&)4./0'''
! Crie os objetos (e crie um InputStream com a folha XSLT)
!"#$%&'!"#$%&'()*(')&*'+,-!"#$%&.+%(&"),-/0'
1&2#34'').&#-****(')&*'+,-1&2#34.')./%(&"),-/0'
!"#$%&'!.#$-0#)**(')&*'!4$&56!"#$%&.).-1#%/0'
! Inicialize o transformador XSL
7$5)28"$6&$95%4"$:'48'('7$5)28"$6&$95%4"$:;)&*<)245)%&./0'
7$5)28"$6&$'4'('48;)&*7$5)28"$6&$.!.#$-0#)/0''
! Faa a transformao
4;4$5)28"$6.!"#$%&'()='').&#-/0''
! A rvore DOM resultante est em resDocument
* Veja cdigo completo em exemplos/Java/TransformaXSLT.java 6
Transformao XSLT em C#
! Importe System.Xml.XPath e System.Xml.Xsl
!"#$%&'(")*+,-+./&
!"#$%&'(")*+,-+.,-"./&
!"#$%&'(")*+,-+.,-01)2/&&
! Inicialize o processador com a folha de estilos
-".341$"564+&!"#$%&'"()"*7&$*8&-".341$"564+9:/&
!"#$%&'"()",;61<9=*")#.6,>".=:/&
! Inicialize fluxo de sada
-+.3*>)?4#)*4&+",!)"*7&&
&&&&&&&&$*8&-+.3*>)?4#)*49=4*"!.)1<6,"@%=:/&
! Obtenha fontes para transformar
-01)2A6B!+*$)&-'./()$!*7&$*8&-01)2A6B!+*$)9=56$)*,>+.=:/&
! Realize a transformao
!"#$%&'"()",341$"564+9-'./()$!C&$!..C&+",!)":/&
7
Transformao XSLT em PHP5
! Inicialize o processador
!"#$%$&'($)*+,-./0'**/.123$
! Crie um objeto DOM para o documento da folha de estilos e
importe para o processador
!"#$%&'%$&'($4/54/065'&,3$
!"#$%&'78+/9:1;'*,<+/="*+;23$
!"#78<5#/.,>,?+'*@'',1!"#$%&'23$
! Crie um objeto DOM para o XML fonte
!(')*+",$-%$&'($4/54/065'&,3$
!(')*+",$78+/9:1;9.A6<B/="5+;23$
! Passe parmetros se precisar
! !"#78*',-9.95','.1;#9.95C;D$;B9+/.;23$
! !"#78*',-9.95','.1;#9.95E;D$;B9+/.;23$
! Faa a transformao
! !."#*&$/('-%$!"#78,.9&*F/.5G/)HI1!(')*+",$22$
! O documento resultante est em $resultado
8
Transformao XSLT em Objective-C
! Importe as bibliotecas libxml2.2.dylib e libxslt.dylib*
! Inicialize o processador
!"#$%&'()*!"#$%&'(+*&)(*+"+*,&)-"#,*
&)(*+"...-*!.#('/).01(2#0.300(45#066&%7.(*!"#83/)*9:*
;/0&)(*+"12)+0.&1()57<=.57<>7&%?57<@*A1=B4C1()57<>7&%?57<D:,*
!"#$%&'(.-*!"#'/).045#066&%7.(*!"#83/)*9:*
;/03"'(&12%+0..&1()57<=.57<>7&%?57<@*A1=B4C1()57<>7&%?57<D:,*
! Realize a transformao
,&)-"#.-*!.#(EFF#21(2#0.300(6&)(*+"+*!"#$%&'(+*A=GG:,*
! Resultado em string
&3/)9*4$33&,*-*75#,*57(*#07<(3*-*H,*
!.#(1/I0J0.K#(B%1()57<654$33&,+*L#07<(3+*,&)-"#+*&)(*+":,*
A11()57<9*,&)$+(6!".-*;A11()57<*.()57<M5(381()57<@4$33&,..
..............................07&%?57<@A1=B4C1()57<>7&%?57<D,*
! Libere os objetos
N)0064$33&,:,*!.#(4)001(2#0.300(6&)(*+":,*
!"#4)00$%&6,&)-"#:,*!"#4)00$%&6!"#$%&'(:,*
!.#(8#0/7KFO#%P/#.6:,!"#8#0/7KF'/).0)6:,*
10
Hello World
11
Uma regra de template
12
O resultado
! O resultado ser
!"#$%!&'()*&+'!,'!#('-./)!!
!!!!01234!,'5)6)7!
!!!!,'!8.)!,'!9&*'.()!:;!!
!!!!<=>?!
!!!!@'*,)!5)A)!,';@.*)!)!&'()#)(@)!,'!!!!!
!!!!B&)!0&76)C"D#$!!
13
Caminhos vs. Padres
!"#$%&'%#()%*)+,-$#.&(
! Padro:
!/*)01/*&2()$"&1%2)01,-$#.&( !"##$%& !"##$%& !"##$%&
14
Exemplos de padres/caminhos
15
Cabealho e <xsl:stylesheet>
!"#$%&'()*+,-./012/&(-3,4+-5./6789:/";&
!"#$%#&'$(#)((&**
*****"+$,#%"#$-.)&&/%0011121324560788809:;0<5=,#>45+.**
*****?(5#@4,-.72A.B*
!0"#$%#&'$(#)((&B*
16
<xsl:template> e uma folha de estilos bsica
&&&&!#*%<=($@%H=(&$H=3?./A/;& /
&&&&&&&&!=HJ%(;!#*%<H@@%>9=($@%H=(*&A;!A=HJ%(;&
&&&&!A#*%<=($@%H=(;&
&&&&!#*%<=($@%H=(&$H=3?./@(**,H*/;& pessoas
&&&&&&&&!=);!#*%<H@@%>9=($@%H=(*&A;!A=);&
&&&&!A#*%<=($@%H=(;&
pessoa pessoa
&&&&!#*%<=($@%H=(&$H=3?./@(**,H/;&
&&&&&&&&!=4;!#*%<H@@%>9=($@%H=(*&A;!A=4;&
&&&&!A#*%<=($@%H=(;&
!A#*%<*=>%(*?((=;& 17
Outro exemplo
! O processador ir navegar pela rvore
! Deve haver um template para cada n a ser transformado
! No necessrio que haja um template para cada n (se
no houver, ele executado por default sem transformao)
!"#$%#&'$(#)((&*+(,#-./012341*
****"5$/#%"#$01)&&6%778883893.,:72;;;7<=>7?,@/#A.,51*
****"5$/#01)&&6%778883893.,:7?B7")&5$27#&,-C&1D*
!!!!"#$%&'()*%+'(!)+',-./0/1!
!!!!!!!!"-')%1!
!!!!!!!!!!!!"23451! /
!!!!!!!!!!!!!!!!"#$%&+**%56'()*%+'($!01!
!!!!!!!!!!!!"023451!
!!!!!!!!"0-')%1! pedido
!!!!"0#$%&'()*%+'(1!
!!!!"#$%&'()*%+'(!)+',-./*(4743/1!
!!!!!!!!"4781"#$%&+**%56'()*%+'($!01"04781!
total
!!!!"0#$%&'()*%+'(1!
!!!!"#$%&'()*%+'(!)+',-./'3'+%/1!
!!!!!!!!"*193'+%!43!:(4743&!"#$%&8+%;(63<!$(%(,'./=/01"0*1!
!!!!"0#$%&'()*%+'(1*
!7"#$%#&'$(#)((&D*
18
Uso do template com <xsl:apply-templates>
! <xsl:apply-templates /> processa todos os filhos
(inclusive ns de texto)
! Se algum elemento filho combinar com o match de um
template existente, esse template ser processado
! Se algum template no tiver um <xsl:apply-templates> o
processamento da rvore ir terminar
!"#$%&'()*+,-./012/&(-3,4+-5./6789:/";&
!#*%<*=>%(*?((=&#$%-*<#*%./?==@<AABBB1BC1,)5A0DDDAEFGA7)H-*I,)$/&& /
&&&&&&&&&&&&&&&&'()*+,-./012/;&
O n pessoas, que no
&&&&!#*%<=($@%H=(&$H=3?./A/;& tem um template pessoas
&&&&&&&&!J,4>;!#*%<H@@%>9=($@%H=(*&A;!AJ,4>;& tambm ser
&&&&!A#*%<=($@%H=(;& processado!
pessoa lugar
&&&&!#*%<=($@%H=(&$H=3?./@(**,H/;&
&&&&&&&&!@;!#*%<H@@%>9=($@%H=(*&A;!A@;&
&&&&!A#*%<=($@%H=(;& Todo contedo da
rvore lugar ser
&&&&!#*%<=($@%H=(&$H=3?./%K5H)/&A;& omitido!
19
<xsl:apply-templates> com select
! O atributo select pode ser usado para o <xsl:apply-
templates> pular a outro n da rvore fonte
! As expresses XPath dentro dos elementos select so consideradas no
contexto dos ns selecionados pelo match do template onde ocorrem
!"#$%&'()*+,-./012/&(-3,4+-5./6789:/";&
!#*%<*=>%(*?((=&#$%-*<#*%./?==@<AABBB1BC1,)5A0DDDAEFGA7)H-*I,)$/&
'()*+,-./012/;&
&&&&!#*%<=($@%H=(&$H=3?./A/;&
&&&&&&&&!J,4>;!#*%<H@@%>9=($@%H=(*&*(%(3=./@(**,H*A@(**,HK&A;!AJ,4>;&
&&&&!A#*%<=($@%H=(;&
&&&&!#*%<=($@%H=(&$H=3?./@(**,H*/;&
&&&&&&&&!4+';!#*%<H@@%>9=($@%H=(*&A;!A4+';&
Contexto "/"
&&&&!A#*%<=($@%H=(;&
&&&&!#*%<=($@%H=(&$H=3?./@(**,H/;&
&&&&&&&&!@;!#*%<H@@%>9=($@%H=(*&A;!A@;&
&&&&!A#*%<=($@%H=(;&
!A#*%<*=>%(*?((=;&
20
Gerao de texto com <xsl:value-of>
21
Criao de texto com <xsl:text>
!"#$%&'()*%+'(!)+',-./#/0!
!!!! ! !"#$%&'(#'012(34+!%56-+!7(*85$!
"9#$%&'(#'0!!
!"9#$%&'()*%+'(0!
!"#$%&'()*%+'(!)+',-./:/0!
!!!! ! !"#$%&'(#'0;<8!=2(34+!%56-+"9#$%&'(#'0!!
!"9#$%&'()*%+'(0!
22
Regras de template nativas
23
<xsl:attribute>
24
Attribute value templates
25
<xsl:element>
!"#$%&'()*%+'(!)+',-./,01$+/2!
!!!!"#$%&(%()(3'!3+)(./(%()(3'0/2!
!!!!!!!!"#$%&4+%5(607!$(%(,'./8/!92!!!!!
!!!!"9#$%&(%()(3'2!
"9#$%&'()*%+'(2!
! Resultado:
!"(%()(3'02!888!"9(%()(3'02!
26
<xsl:sort>
! Ordenao
! Aplica-se a cada n do conjunto de ns do
contexto. Use dentro de <xsl:apply-templates>
!"#$%&''$()*+,'$&*+#-.
...!"#$%#/0*.#+$+1*2341/567/3.8-.
...!"#$%9&$:+)/;.#+$+1*23<3.8-.
!8"#$%&''$()*+,'$&*+#-.
27
Criao de comentrios
! !"#$%&'(()*+,-+)"+'-!."#$%&'(()*+,-
! Insere um comentrio
! !"#$%/0'&)##1*231*#+04&+1'*-*5()675$8'7,-
---&'*+)9:'-!."#$%/0'&)##1*231*#+04&+1'*,-
! Insere uma instruo de processamento
28
Cpia rasa <xsl:copy>
! <xsl:copy>
! Usado para copiar o n corrente (no contexto do template)
para o documento-resultado
! No copia atributos, filhos
! Copia apenas elemento e namespace
! Para copiar rvore inteira, precisa ser chamado
recursivamente via <xsl:apply-templates>
!"#$%#&'$(#)((&*"+$,#%"#$-.)&&/%0011121324560788809:;0<5=,#>45+.**
****************?(5#@4,-.72A.B*
****!"#$%&(+/$=&(*+=&C)-.0*D*E.B*
********!"#$%C4/'B* Oferece controle sobre o
************!"#$%=//$'F&(+/$=&(#*0B* que deve ser includo na
********!0"#$%C4/'B* cpia (no match do
****!0"#$%&(+/$=&(B* template)
!0"#$%#&'$(#)((&B*
29
Cpia completa <xsl:copy-of>
! <xsl:copy-of select=expresso>
! Copia coisas (rvores, texto) para a rvore resultado
! Se o select identifica um nodeset, todos os ns do nodeset
so copiados para a rvore resultado
! O n copiado por completo (inclusive com atributos,
instrues de processamento, etc.)
! Exemplo: XSLT que copia a entrada na sada:
!"#$%#&'$(#)((&*"+$,#%"#$-.)&&/%0011121324560788809:;0<5=,#>45+.**
****************?(5#@4,-.72A.B*
****!"#$%&(+/$=&(*+=&C)-.0.B*
********!"#$%C4/'D4>*#($(C&-.2.0B* No controla o que deve ser
includo na cpia (copia o n
****!0"#$%&(+/$=&(B*
inteiro)
!0"#$%#&'$(#)((&B*
30
Blocos condicionais: <xsl:if> e <xsl:choose>
!"#$%+,--#.*-
---.&#/012"3-!"#!$%"&'("##)*-4%+-,.5&#/012"3+-
---.&#/012"3-!"#!$%"&'("##)*-6%+-,.5&#/012"3+-
------,-
---.&#/012"3-!"#!$%"&'("##)*-3%+-,.5&#/012"3+-
---.&#/0*!2"(17#"+-,-.5&#/0*!2"(17#"+-
!)"#$%+,--#.*(
31
Exemplos de <xsl:if>
!"#$%&'()$*&'+(*&,-./!"!#!$%&/0+
+++!"#$%12+&'#&./34*153'$'('6&7321$-78)7#1&1769:++
++++++++++++++++++++++++.+$*#&9:+74+;*&&48<.=*$&*=>>/0+++++
++++++!"#$%?*$@'A72+#'$',&+/;*&41BCD7C'$'('6&7/+30+
+++!3"#$%120+
!3"#$%&'()$*&'0+
!"#$%12+&'#&./9E+FG&H+I:+*6D+67&9J+F$&H+K::/0+
++++<<<<+
!3"#$%120+
!"#$%12+&'#&./#&*4&#AL1&-9;67('M+=N4*<+=:/0+
+++<<<+
!3"#$%120+
!"#$%12+&'#&./67&933'$'('6&7:/0+
+++<<<+
!3"#$%120+
32
Exemplo com <xsl:choose>
!"#$%&'((#)*+
+++++!"#$%,')-+.)#./0112&344(56-(7(/8.49)8:0*+
+111+
+++++!2"#$%,')-*+
+++++!"#$%,')-+.)#./0112&3#30*+
+111+
+++++!2"#$%,')-*+
+++++!"#$%,')-+.)#./0112#3$34;(2.)".<=+>?.@+ABBBB0*+
+111+
+++++!2"#$%,')-*+
+++++!"#$%(.')4,;#)*+
+111+
+++++!2"#$%(.')4,;#)*+
!2"#$%&'((#)*+
33
Valores booleanos em XPath
! Em XPath:
! true elemento chamado true (ou child::true)
! 'false' string contendo o texto false
! true() valor booleano true
! fcil cometer erros primrios
!"#$%&'()*#)+,!"#$,-.!/"#$%&'-(
! O bloco somente processado se existir um elemento <true> no
contexto do teste ( nodeset vazio = false() )
!"#$%&'()*#)+,0%&'($0,-.!/"#$%&'-(
! O bloco sempre processado porque o string 'false' tem mais de
zero caracteres ( string vazio = false() )
!"#$%&'()*#)+,!"#$)*+123(,%&'($,+45(!"#$,-.!/"#$%&'-(
! O bloco sempre processado porque o valor booleano true()
verdadeiro e o string 'false' no vazio
34
Looping com <xsl:for-each>
! Permite processar um conjunto de ns dentro da mesma regra
de template (sem recurso)
! !"#$%&'()*+,-.#*$*,/01*"2(*##3'14..
555.!6&'()*+,-4.
! O atributo select recebe uma expresso XPath que retorna um
node-set.
! O node-set a lista de ns correntes
! O n sendo processado a cada repetio o n corrente
! O contedo de <xsl:for-each> est no contexto do n corrente
! Exemplo N de contexto
37
Exemplos com <xsl:variable>
!"#$%#&'$(#)((&*+++,*****
****!"#$%-./0.1$(*2.3(45&0&6$75,8($.&9/07*:(*#(/-0;7#*</(#&.:7#!="#$%-./0.1$(,*
****!"#$%-./0.1$(*2.3(45$7>7&0<75,)&&<%==???+.+@73=03.>(3=$7>7+<2>!="#$%-./0.1$(,*
****!"#$%-./0.1$(*2.3(45@##5,/($.&7/07AB@##+"3$!="#$%-./0.1$(,*
****!"#$%&(3<$.&(*3.&@)45=5,*
********!)&3$,*
************!)(.:,!&0&$(,C/>7*D.-0#%*!"#$%-.$6(E7F*#($(@&45G&0&6$75=,!=&0&$(,*
****************!"#$%@7<'E7F*#($(@&45:7@63(2&HG@##I5=,*
************!=)(.:,*
************!17:',*
****************!03>*#/@45JG$7>7&0<7K5*=,*
****************!)A,!"#$%-.$6(E7F*#($(@&45G&0&6$75=,!=)A,**
!"""!
*!"#$%&(3<$.&(*3.&@)4502&(/-.$75,*
********!"#$%-./0.1$(*2.3(45&7&.$5*#($(@&45GF03*E*G020@075*=,*
********!"#$%-./0.1$(*2.3(45)7/.#5*#($(@&45F$77/HG&7&.$*:0-*LMI5*=,*
********!"#$%-./0.1$(*2.3(453026&7#5*#($(@&45G&7&.$*E*HG)7/.#*N*LMI5*=,*
********!<,O2&(/-.$7%*!"#$%-.$6(E7F**
**************************#($(@&45@72@.&HF7/3.&E2631(/HG)7/.#P*QMMQIP**
*****************************************Q%QP**
*****************************************F7/3.&E2631(/HG3026&7#P*QMMQII5*=,!=<,*
****!="#$%&(3<$.&(,!
38
<xsl:variable> uma constante
! Apesar do nome do elemento sugerir o contrrio, no possvel mudar o valor
de uma varivel. Isto no funciona:
!"#$%&'()'*$+,-'.+/0.+-#'1+.0,23!
"#$%&'(!)*$)+,-#.%&%/01234)35,6!
!!!!!"#$%&'()'*$+,-'.+/0.+-#'1+.0,#+$+45/02.+-#'1+-#267(5818+#023!
"7#$%&'(6!
"#$%&'(!)*$)+,-#.%&%/0123*035,6!
!!!!!"#$%&'()'*$+,-'.+/0.+-#'1+.0,#+$+45/02.+-#'1+-#2)-1$+#023!
"7#$%&'(6!
"01'(23+%4!)0%%0$./;OPEQEEQQ/!=5!
!"#$%&'()*%+'(!)+',-./01'(23+%4/5!
!!!!!!!!"#$%&3+20+6%(!1+)(./$(78194$/!$(%(,'./:)0%%0$!903!;<<</!!=5!
!!!!!!!!">?!@42)+'+!--&))&$$!+!*+2'02!9(!'()*4!()!$(78194$!AA5!
!!!!!!!!"#$%&3+20+6%(!1+)(./@42)+'+94/5!
!!!!!!!!!!!!"#$%&3+20+6%(!1+)(./')*B42+/!$(%(,'./C$(78194$!903!DE<</!=5!
!!!!!!!!!!!!"#$%&3+20+6%(!1+)(./-42+/!$(%(,'./@%442FC')*B42+G/!=5!
!!!!!!!!!!!!"#$%&3+20+6%(!1+)(./')*H01/!$(%(,'./FC')*B42+!A!C-42+G!I!E</!=5!
!!!!!!!!!!!!"#$%&3+20+6%(!1+)(./)018'4/!$(%(,'./@%442FC')*H01G/!=5!
!!!!!!!!!!!!"#$%&3+20+6%(!1+)(./$(78194/!!
!!!!!!!!!!!!!!!!!!!!!!!!!!$(%(,'./@%442F!FC')*H01!A!C)018'4G!I!E<G/!=5!
!!!!!!!!!!!!"#$%&3+%8(A4@!$(%(,'./,41,+'F@42)+'A18)6(2FC-42+J!K<<KGJ!K&KJ!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!@42)+'A18)6(2FC)018'4J!K<<KGJ!K&KJ!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!@42)+'A18)6(2FC$(78194J!K<<KGG/!=5!
!!!!!!!!"=#$%&3+20+6%(5!
!!!!!!!!"*5L82+MN4&!"#$%&3+%8(A4@!$(%(,'./C@42)+'+94/!=5"=*5!
"=#$%&'()*%+'(5!
40
Subrotinas com <xsl:call-template>
42
<xsl:param> e <xsl:with-param>
! <xsl:with-param> permite definir parmetros em um template
que so repassados ao template que cham-lo
! Chamada de um template:
!"#$%&'(%%)*+,-%(*+!.(,+/0!"#$%&%#01!
!!!!"'()*+,&-./%#%$0.(,+/0%120!$+%+'*/0234+.*0!51!
"5#$%&'(%%)*+,-%(*+1!
! Valores default
! Um <xsl:param> pode definir um valor default que ser usado caso a
chamada no envie um valor novo
! Template destino:
!"#$%&*+,-%(*+!.(,+/0!"#$%&%#01!
!!!"'()*/%#%$0.(,+/0%120!$+%+'*/05$+673'8$54+9(:%*$5(;'051!
!!!"#$%&7(%:+)89!$+%+'*/0<(;'0!51!
"5#$%&*+,-%(*+1!
43
Exemplos com <xsl:call-template>
!!!"
!"#$%&'()$*&'+,*('-.,/0(*$12'31('.4"
++++++++!"#$%)*0*(+,*('-.&1('5&01,6.+74+#$%%"&&'(('))"%%*"
""""""""#+),'-./0.1,2"3.(245&6/.5""
" """""" ")2,27845)91)8/03:%12;6/2<=80(2>8/03:?"@'@A5"B*"
""""""""#+),'-./0.1,2"3.(2458(CD03>275""
" " ")2,27845)91)8/03:%.;82/<=80(2>8/03:?"@'@A5"B*"
""""""""#+),'-./0.1,2"3.(245(039865""
" " ")2,27845)91)8/03:%12;6/2<=8(CD03>27?"@'@A5"B*"
""""""""#+),'-./0.1,2"3.(245)2:93E65""
" " ")2,27845)91)8/03:%.;82/<=8(CD03>27?"@'@A5"B*"
""""""""#+),'-.,92%6;")2,27845=&6/."F"GHII"J"=(03986"F"HI"J"=)2:93E65"B*"
!7"#$%&'()$*&'4+
#+),'-./0.1,2"3.(245)2:93E6)5*"
+++++++!"#$%8*$$9&'()$*&'+,*('-.,/0(*$12'31('.4+
++++++++++++!"#$%:1&;9)*0*(+,*('-.&1('5&01,6.+#'$'8&-.8*()/#.+74+
+++++++!7"#$%8*$$9&'()$*&'4"
#B+),'-./0.1,2*"
!!!"
44
<xsl:call-template> recursivo
!"#$%&'()$*&'+,*('-./*$/0$*123&*$.4!
+++!"#$%)*1*(+,*('-./*()3#501*/*3.+64++
+++!"#$%)*1*(+,*('-.#'70,83#.+64+
+++!"#$%)*1*(+,*('-.9*$31:,;.+#'$'/&-.<.+64+
+++!"#$%)*1*(+,*('-./3,&*831.+#'$'/&-.=.+64!
!!!"#$%&'()*(+%,!-(.,/0121(%3,45-62$07!
!!!!!!"#$%&8922$,7!
!!!!!!!!!":;;!3,!,$1,!<2)!2!=%1*.2>!6,'2%'(!(!$2.(!62!'(%2)!*-*8*(%!?!$,45-62$!;;7!
!!!!!!!!!"#$%&@9,-!1,$1/0A8(.B2$C5)(8(2DA82-1(62)!/!%($1EFG07!
!!!!!!!!!!!!"#$%&'(%5,;2<!$,%,81/0A'(%2)H-*!?!>#'70,83#0!I7!
!!!!!!!!!"I#$%&@9,-7!
!!!!!!!!!":;;!J($2!82-1)K)*2>!B($$,!2!121(%!82.2!'(%2)!*-*8*(%>!*-8),.,-1,!2!
!!!!!!!!!!!!!!82-1(62)!,!89(.,!,$1,!1,.B%(1,!-2'(.,-1,!82.!-2'2$!B()(.,1)2$!;;7!
!!!!!!!!!!"#$%&219,)@*$,7!
++++++++++++++!"#$%/*$$?&'()$*&'+,*('-./*$/0$*123&*$.4+
++++++++++++++++++!"#$%@;&A?)*1*(+,*('-./*()3#501*/*3.+#'$'/&-.>/*()3#501*/*3.+64+
++++++++++++++++++!"#$%@;&A?)*1*(+,*('-./3,&*831.+#'$'/&-.>/3,&*831+B+=.+64+
++++++++++++++++++!"#$%@;&A?)*1*(+,*('-.9*$31:,;.+#'$'/&-.>9*$31:,;+B+>#'70,83#.+64+
++++++++++++++!6"#$%/*$$?&'()$*&'4!
!!!!!!!!!!"I#$%&219,)@*$,7!
!!!!!!"I#$%&8922$,7!
!!!"I#$%&'()*(+%,7!
!!!":;;!L!65)(MN2!121(%!,.!$,45-62$!O!),12)-(6(!(P5*!;;7!
!!!"#$%&'(%5,;2<!$,%,81/0A121(%3,45-62$0I7!
"I#$%&1,.B%(1,7!
45
Debugging e <xsl:message>
! O elemento <xsl:message> pode ser usado para imprimir na
tela durante a execuo do processador
! uma boa ferramenta para debugging
! Pode-se us-la para imprimir valores esperados enquanto se testa a
aplicao
! Exemplo
!"#$%&'()$*&'+,*('-./*$/0$*123&*$.4+
++++!"#$%)*1*(+,*('-./*()3#.+54+
++++!"#$%)*1*(+,*('-./3,&*631.+#'$'/&-.7.+54+
!!!!"#$%&'($$)*(+"#$%&,)%-(./0!$(%(123451)'6/$!751/82)9/:;4<+"<#$%&'($$)*(++
++++!"#$%8*19*:$'+,*('-.&3&*$;'<0,63#.4+
+++++++++!"#$%/=33#'4!"#$%>=',+&'#&-.???.4???!5"#$%>=',4+
+++++++++++++!"#$%3&='1>9#'4+
+++++++++++++++++!"#$%/*$$@&'()$*&'+,*('-./*$/0$*123&*$.4???!5"#$%/*$$@&'()$*&'4+
+++++++++++++!5"#$%3&='1>9#'4+
+++++++++!5"#$%/=33#'4+
+++++!5"#$%8*19*:$'4+
!5"#$%&'()$*&'4+
46
Carregar arquivos externos com document()
! Funo XPath (extenso XSLT): document(uri)
! carrega um documento XML externo e retorna um node-set contendo a
raiz do documento
! Seleo de um documento externo
!"#$%&''$()*+,'$&*+#-#+$+.*/0!"#$%&'(
)*+&,!&-./%0*10-12--
! Constante para representar documento n inicial
!"#$%3&45&6$+-7&,+/0("(0----
------------#+$+.*/0!"#$%&'()*,./%0*23410-12--
!"#$%&''$()*+,'$&*+#-#+$+.*/05("(1,+7815*+,012--
! Seleo de n em documento encontrado em n de arquivo-fonte
!"#$%&''$()*+,'$&*+#----
--------------#+$+.*/0!"#$%&'()4,4611"9:&/;<=>0-12-
! XSLT 1.1 possui <xsl:document> com recursos adicionais
47
Fuso de documentos-fonte
! possvel, com document(), gerar um resultado a partir de
mltiplos documentos de entrada
02-A%6/*+"#$%&
!,6A71B(%.&
!"#$%&%'($)*+,-%#*.& !"#$%&%'($)*067#*.& &&!"#$%&%'($)*+,-%#*.&
&&/(0121,&3& &&/(0121,&9& &&&&/(0121,&3&
!4"#$%.& !4"#$%.& ("#$%& &&!4"#$%.&
!"#$%& ===&
!"#$%&%'($)*+,-%#*.& !"#$%&%'($)*067#*.& &&!"#$%&%'($)*067#*.&
&&/(0121,&5& &&/(0121,&8& &&&&/(0121,&8&
!4"#$%.& !4"#$%.& &&!4"#$%.&
!4,6A71B(%.&
'"#$%& )"#$%&
!:,;#.&
&&!+(-<#6.3=>?-!4+(-<#6.&
&&!+(-<#6.9=>?-!4+(-<#6.& 8#-%9-6:%2-;226&"""<&
&&!+(-<#6.5=>?-!4+(-<#6.& 8#-%91/0=/>%2&5/$2?@<(2%@&&
&&!+(-<#6.8=>?-!4+(-<#6.& &&&&&&&&&&&&&&-2%2,6?@*+,A$256.4:,;#4+(-<#67@&B<&
!4:,;#.& &&8#-%962$C%/62&$/6,;?@4@<&
*+,-"#$%&./01+0234+5627& &&&&&8/0DA=1+-<8#-%94+032/,;&-2%2,6?@@<(2%@<&
&&&&&&&8#-%9,+C:3+4&-2%2,6?@"@&B<&
&&&&&8B#-%94+032/,;<8B/0DA=1+-<&
&&8B#-%962$C%/62<&
$20E2"#-%& 8B#-%9-6:%2-;226<&
48
generate-id(expresso)
! uma funo XPath do XSLT (extenso)
! Gera um id unvoco para um conjunto de ns.
! Cada vez que generate-id() for chamado em um n, gera
sempre o mesmo id.
! Pode receber como parmetro a expresso XPath ou
aplicar-se ao n do contexto se estiver vazio
! Exemplos:
!"#$%&'$()*+,-#)$)./01!"#"$%&"'()*+#,-".2-34-
!"#$%/)56$'/)-5'/.7018+5)24-
-!"#$%&'$()*+,-#)$)./01!"#"$%&"'()*.2-34-
!3"#$%/)56$'/)4-
!'-8'5)09/!"#"$%&"'()*0.194!3'4-
49
Indexao por chave unvoca <xsl:key>
51
Desafio: agrupamento
! Como ordenar o documento-fonte abaixo por grupos?
! Agrupar por rea, ordenar reas, ordenar cursos (cdigos) por rea
!"#$#%&'&()
))))!"*+,&)"&-.'&/012340)#+5#/01#6#0(78$5+9+.,5)1#6#):5#8,!;.$5<()
))))!"*+,&)"&-.'&/0=2440)#+5#/0=>?0(@"#%#A%5)B5"$&+)C+#9D.",!;.$5<()
))))!"*+,&)"&-.'&/0=EF40)#+5#/0=>?0(=>?)@"D5<#!;.$5<()
))))!"*+,&)"&-.'&/0GH440)#+5#/0G5A0(1#6#@"+.9$!;"*+,&()
!;"#$#%&'&()
52
Como agrupar um item por grupo
! XSLT 1.0 no oferece uma soluo simples (existe em XSLT 2.0)
! Esta melhor tcnica em XSLT 1.0 ("mtodo Mnch"):
1. Crie uma chave <xsl:key> para indexar o item que ser agrupado, com
base no grupo (elemento ou atributo usado para agrupar o item)
!!!"!"#$%&'!#$%&'(()*+&(!%$)*+'(,-&.(!,-&'(/0123(!./!
2. Crie um <xsl:for-each> com a seguinte expresso select:
4,-&.01&#&2$)&345657!'!1&#&2$)&3456!8&966()*+&6:!/012370;<!7<!
53
Soluo: ordenao com agrupamento
!"#$%#&'$(#)((&*"+$,#%"#$-.)&&/%0011121324560788809:;0<5=,#>45+.*
****************?(5#@4,-.72A.B*
**!"#$%C('*,=+(-.D=&EC('.*+=&D)-.DF5#4.*F#(-.G=5(=.*0B*
**!"#$%&(+/$=&(*+=&D)-.D=&=$464.B*
*****!H$B!"#$%>45I(=D)**
***#($(D&-.DF5#4J6(,(5=&(I@HK2L*-***
***********************6(,(5=&(I@HKC('KMD=&EC('MN*G=5(=LJ7OLO.B*
************!"#$%#45&*#($(D&-.G=5(=.*0B*
************!"#$%>45I(=D)*#($(D&-.C('KMD=&EC('MN*G=5(=L.B*
****************!"#$%#45&*#($(D&-.GD4H@64.*0B*
****************!"#$%@>*&(#&-./4#@&@4,KL*-*7.B*
********************!H&B!"#$%?=$F(I4>*#($(D&-.G=5(=.*0B!0H&B*
****************!0"#$%@>B*
****************!HHB!"#$%?=$F(I4>*#($(D&-.GD4H@64.*0B%**
********************!"#$%?=$F(I4>*#($(D&-.2.*0B!0HHB*
************!0"#$%>45I(=D)B*
*****!0"#$%>45I(=D)B!0H$B*
**!0"#$%&(+/$=&(B*
!0"#$%#&'$(#)((&B*
54
Mais XSLT
! Foge do escopo deste curso introdutrio uma abordagem mais
profunda do XSLT
! Mesmo assim, alguns elementos abaixo so comuns e devem ser
investigados: explore-os e analise os exemplos fornecidos
! Mtodo de geraao de sada (muito usado)
! !"#$%&'()'(*+,(-&./0-(+$1"+$1(,"(0*23.,3(/0(4',0*56*
! Poltica de espaos e gerao de texto (organiza a sada)
! !"#$%)4,#,47,8#)9:,*,$,+,3(#/0)4,;*:&.,06!
! !"#$%#(42)8#)9:,*,$,+,3(#/0<06*
! atributo .2#9=$,8&'()'(*,#:9)23>*de !"#$%(,"(6*
! Recursos de extenso e compatibilidade (essencial se voc usa
extenses, XSLT 2.0 e ainda quer funcionar em browsers)
! !"#$%?9$$=9:@6*
! !"#$%39+,#)9:,89$29#6*
! Formatao default para nmeros (essencial para trocar ponto
decimal por vrgula)
! !"#$%.,:2+9$8?&4+9(6*,*?'3AB&*?&4+9(83'+=,4CD*
55
XML: uma introduo prtica X100
Helder da Rocha
(helder@argonavis.com.br)
<fo:page-sequence master-name="p1">
<fo:flow flow-name="xsl-region-body">
<fo:block color="blue" font-size="20pt">Hello!</fo:block>
<fo:flow>
</fo:page-sequence> Este o "<body>"
do XSL-FO
</fo:root>
3
<root>
4
Estrutura do documento
!! !"#$%&'()&*+,-.,
!! obrigatria
!! rea de contedo principal da pgina
!! define um ID implcito (fixo): /01("#$%&'()&*+, para
uso por elementos de contedo de fluxo ou esttico.
!! !"#$%&'(023"2,-.,e !"#$%&'(#'*,-.,
!! Em documentos de linguagem ocidental, start a
margem esquerda e end margem direita.
!! IDs: /01("#$%&'(023"2,e /01("#$%&'(#'*,
!! !"#$%&'()#4&"#,-.,e !"#$%&'(342#",-.,
!! before a margem superior, after a margem inferior.
!! IDs: /01("#$%&'()#4&"#,e /01("#$%&'(342#".
7
Margens e regies
!>%2=9#(=8$#(28>-#"4+
28"$%'(-&=+
!"#$%&'(#'5+34+
definidas sobre <region-body>
28"$%'("%$<-+
28"$%'(9#*-+
!"#$%&'()#*&"#+#,-#'-./012/34+
!"#$%&'()&57+34+ !"#$%&'(#'5+#,-#'-./612/34+
!! Margens de <region-body> devem ser
iguais ou maiores que os extent das
regies marginais
!"#$%&'()&57+28"$%'(9#*-./0:;12/+++++++++++
+++++++++++28"$%'("%$<-./6:012/+++
+++++++++++28"$%'()&--&2./0:612/+
+++++++++++28"$%'(-&=./0:012/+34++
!"#$%&'(8*-#"+34+
28"$%'()&--&2+
8
XSLT
!! Layout geralmente permanece fixo em folha XSLT+FO
!"#$%&'()$*&'+(*&,-./0/1!
!!"#$%&$$'!()*+,%#$-./''0%112223243$&516777189:1;$&)<'.=!
!!!"#$%*<>$?'@)<,'A&@,A'=!
!!!!!!"#$%,B)0*A@0<5A@)<,'A&!)<,'A&@+<)A-.06.=!
!!!!!!!!!"#$%&A5B$+@CA#$&A!A('A+'-.DE).1=!
!!!!!!!!!"#$%&A5B$+@A+F!A('A+'-.6E).1=!
!!!!!!!!!"#$%&A5B$+@<#'A&!A('A+'-.637E).1=!
!!!!!!!!!"#$%&A5B$+@,'<&'!A('A+'-.D3GE).1=!
!!!!!!!!!"#$%&A5B$+@C$F>!)<&5B+@*A#'-.D3HE).!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)<&5B+@&B5/'-.63DE).!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)<&5B+@C$''$)-.D36E).!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)<&5B+@'$0-.D3DE).!1=!!!!!!!!!
!!!!!!"1#$%,B)0*A@0<5A@)<,'A&=!
!!!"1#$%*<>$?'@)<,'A&@,A'=!
!!!!!!!!"#$%0<5A@,AI?A+EA!)<,'A&@+<)A-.06.=!
+++++++++++!"#$%*))$23&'()$*&'#+01!
!!!!!!!!"1#$%0<5A@,AI?A+EA=!
!!"1#$%&$$'=!
!0"#$%&'()$*&'1+
9
Contedo
!! O contedo do documento pode estar
!! Em sees <flow>, que criam nova pgina quando o
texto preenche o espao disponvel na atual
!! Em sees <static-content>, que so repetidos em
todas as pginas da seqncia.
!! Regies
!! Cada bloco de contedo deve estar associado a uma
regio existente atravs do atributo flow-name:
!"#$%&'&()*)#+&,+&-!"#$%&'()*+,-"%.)/0#&%-1'.1+.-///-
!"#$"0#1-!"#$%&'()*+,-"%.)/0#&%2#34+.-///-
!! Blocos
!! Dentro de <flow> ou <static-content>, contedo
deve estar em blocos: <block>, <list-block>,
<table>, etc.
10
Blocos de contedo
<fo:page-sequence master-name="p1" font-size="8pt">
<fo:static-content flow-name="xsl-region-after">
<fo:block>
Este bloco de
<fo:leader leader-pattern="rule"
contedo esttico est
leader-length="16cm" /> associado com
region-after
</fo:block>
<fo:block text-align="end">pgina
<fo:page-number/>
</fo:block>
</fo:block> Este bloco de
</fo:block> contedo de fluxo est
</fo:static-content> associado com
region-body
<fo:flow flow-name="xsl-region-body">
<fo:block font-family="serif" font-size="11pt">
Texto que pode atravessar pginas.
</fo:block>
</fo:flow>
</fo:page-sequence>
11
Blocos
13
<table>
<fo:table>
<fo:table-header>
<fo:table-cell>
<fo:block font-family="tahoma, sans"
font-weight="bold">Coluna 1</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-family="tahoma, sans"
font-weight="bold">Coluna 2</fo:block>
</fo:table-cell>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block font-family="monospace">clula 1.1</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-family="monospace">clula 1.2</fo:block>
</fo:table-cell>
</fo:table-row>
...
<fo:table-row> ... </fo:table-row>
</fo:table-body>
</fo:table> 14
<list-block>
<fo:list-block>
<fo:list-item>
<fo:list-item-label>
<fo:block font-size="20pt" color="red">
•
</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="70pt">
<fo:block>
Item um
</fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item> ... </fo:list-item>
...
</fo:list-block>
15
<external-graphic>
16
<basic-link>
!! Vnculo de hipertexto
!! Vincula uma referncia de ID a um ID
!! Geralmente, quando o documento gerado via XSLT, o
ID obtido do elemento ao qual se quer vincular ou via
alguma varivel
!! Exemplo (gerao de link usando XSLT):
!"#$%&'()*+,)-.!)-/01-',+20(/)-'/)$-34!"#$%4!
!!!!!!!!!!!!!!!/05/+20*$1'/)$-346-201,)-04!
!!!!!!!!!!!!!!!*$,$134&,6047!
&&&&&&&&'()*+,-*./012&)/*/3456"31$#71689&
!"8#$%&'()*+,)-.7!
17
<instream-foreign-object>
18
Visualizao
!! XSL-FO uma linguagem de descrio de pgina
!! Pginas podem ser geradas por um programa que construa o
documento na memria (como faz o browser com HTML e CSS)
ou que gere um arquivo
!! PostScript, PDF: Apache FOP, RenderX XEP, REXP
!! RTF (MS-Word): JFOR, RenderX
!! Visualizao em browser: IBM XFC
!! Ferramentas para desenvolver FO
!! HP FOA
!! Exemplos usados neste curso (use scripts .bat em c:\xml ou .sh
em /cursox100/software/scripts)
!! 1) Para rodar o FOP (gerar PDF a partir de FO)
!! !"#$!"#$%&'()'*!"#$%&'(+,)*
!! 2) Para rodar o JFOR (gerar RTF a partir de FO)
!! %!"&$!"#$%&'()'*!"#$%&'(,'-*
19