Você está na página 1de 298

XML

uma introduo prtica


Helder da Rocha
2000, 2001, 2003, 2005, 2007 Helder da Rocha
1
Objetivos

!! Oferecer uma introduo geral sobre a tecnologia


XML, com conceitos tericos e experimentao
prtica, abrangendo fundamentos e principais
aplicaes

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*)

* tpicos complexos que so abordados de forma introdutria neste curso


(eles so explorados em maior profundidade em outros cursos)

3
Formato

!! Apresentao em slides
!! Demonstraes
!! Exerccios
!! Realizados em sala de aula
!! Propostos para realizao fora do horrio de aula

4
Material

!! Slides (disponveis no site)


!! Apostila (tpicos selecionados e guia de referncia)
!! Cdigo de exemplos usados nas demonstraes
!! Cdigo de aplicaes
!! Atualizaes (slides e documentos anexos)
!! Especificaes oficiais
!! Ferramentas abertas
!! Material de referncia

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

!! Tente fazer os exerccios; se no entender, pergunte!


!! Explore os exemplos e exerccios em aplicaes reais
(no se limite a ver um exemplo didtico funcionar)
!! Tente fazer os exerccios; se no entender, pergunte!

helder.darocha@gmail.com
www.argonavis.com.br

10
Introduo a XML X100

Helder da Rocha
(helder@argonavis.com.br)

Atualizado em setembro de 2001


1
O que XML?

!! eXtensible Markup Language: padro W3C


!! Uma maneira de representar informao
!! no uma linguagem especfica
!! no define vocabulrio de comando
!! no define gramtica, apenas regras mnimas de estrutura
!! Exemplo: documento XML usuario_33.xml

<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

HTML mostra <h1>Severino Severovitch</h1>


como <h2>bill@norte.com.br</h2>
<p>
apresentar
<b>11</b>
<i>9999 4321</i>
</p>

XML mostra <nome>Severino Severovitch</nome>


o que <email>bill@norte.com.br</email>
significa <telefone>
<ddd>11</ddd>
<numero>9999 4321</numero>
</telefone>

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>

!! Menor documento contendo elemento vazio Elemento raiz

<nome></nome> = <nome/>

!! Menor documento contendo elemento e contedo texto

<nome> !"#"$%&' !"#"$'#%( </nome>

Etiqueta Contedo do Etiqueta


inicial Elemento final
4
XML Namespaces
!! Estabelecem um contexto para elementos e atributos
!! formalmente declarado atravs de um identificador (um string, geralmente
uma URI) atravs de atributo reservado do XML: xmlns
!! Podem ser associados a um prefixo para qualificar elementos e atributos
!! Quando o prefixo no usado, estabelece um namespace default adotado
pelo elemento onde declarado e seus elementos filho
!"#$%&'(')*+ Escopo do namespace vale
++!,-$.)+%/#0'0-12"-3%/0)"2*456!7,-$.)*+ para elemento <clima> e
++!(&#$'+!"#$%&'()*+,,-../0#*"-'*+ herdado por todos os seus
++++!,-$.)*(8%9)")!7,-$.)*+ descendentes
++!7(&#$'*+
!7"#$%&'(')*+ !"#$%&'(')+:$&/"+112%;#<77'..=(&#$'2*+
++!,-$.)+%/#0'0-12"-3%/0)"2*456!7,-$.)*+
Escopo do namespace vale ++!1+(&#$'*+
para descendentes de ++++!1+,-$.)*(8%9)")!71+,-$.)*+
<simulacao> qualificados ++++!,-$.)+%/#0'0-128);'"2*>?@!7,-$.)*+
com o prefixo 'w' ++!71+(&#$'*+
!7"#$%&'(')*+
Nos dois casos, elementos <tempo> significam coisas diferentes, mas no h conflito
porque pertencem a namespaces diferentes (um deles no tem namespace) 5
Documentos XML bem formados

!! Para que possa ser manipulado como uma rvore,


um documento XML precisa ser bem formado
!! Documentos que no so bem formados no so
documentos XML use um editor XML para descobrir
!! Documentos bem-formados obedecem as regras de
construo de documentos XML genricos
!! Regras incluem
!! Ter um, e apenas um, elemento raiz
!! Valores dos atributos estarem entre aspas ou apstrofes
!! Atributos no se repetirem
!! Todos os elementos terem etiqueta de fechamento
!! Elementos estarem corretamente aninhados
6
Exemplos de algumas regras

!! (1) Elementos no devem se sobrepor


!! No pode !"#!$#!%"#!%$#&
!! (2) Atributos tm que ter valores entre aspas
!! No pode !'(&)*+,'-./#&&
!! Deve ser !'(&)*+,'-0./0#&
!! (3) Nomes de elementos so case-sensitive
!! No pode !"#111!%2#&
!! (4) Todos os elementos tm marcadores de
abertura e de fechamento
!! No pode !$(#3!$(#&
!! Deve ser !$(%#3!$(%#& ou
!$(#!%$(#3!$(#!%$(#&
7
XML vlido

!! Um XML bem construdo pode no ser vlido em


determinada aplicao
!! Aplicao tpica pode esperar que
!! elementos faam parte de um vocabulrio limitado,
!! certos atributos tenham valores e tipos definidos,
!! elementos sejam organizados de acordo com uma
determinada estrutura hierrquica, etc.
!! preciso especificar a linguagem!
!! Esquema: modelo que descreve todos os elementos,
atributos, entidades, suas relaes e tipos de dados
!! Um documento considerado vlido em relao a
um esquema se obedecer todas as suas regras

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(

! Simples mas no XML ! XML, porm mais complexo


! No suporta namespaces ! Suporta namespaces
! Limitado quando a tipos de dados ! Permite definio de tipos

10
Por que usar XML para compartilhar dados?

!! Porque um padro aberto


!! Facilidade para converter para formatos proprietrios
!! Porque texto
!! Fcil de ler, fcil de processar, menos incompatibilidades
!! Porque promove a separao entre estrutura,
contedo e apresentao
!! Facilita gerao de dados para visualizao dinmica
!! Evita repetio de informao / simplifica manuteno
!! Porque permite semntica na Web
!! Elementos HTML no carregam significado, apenas dicas
de formatao: mecanismos de busca ficam prejudicados

11
Como produzir XML

!! Criando um documento de texto Unicode a partir


de qualquer editor de textos
!"#$%&%#'"#()*#+,--,.'
''!$#/0.10203)$#'10203#2)%"4!5$#/0.'
''!0/&)6.7)668$#3%09"#/973!50/&)6.'
''!%060:#$0'%);#+,"06<6&3,.'
''''!&30&.==!5&30&.'
''''!$</03#.>>>>'?-@=!5$</03#.'
''!5%060:#$0.'
!5"#$%&%#.'

!! Gerando um documento a partir de uma rvore


montada dinamicamente
!"#$%&%#'"#()*#+,--,.'
33 ''!$#/0.10203)$#'10203#2)%"4!5$#/0.'
Severino Severovitch ''!0/&)6.7)668$#3%09"#/973!50/&)6.'
bill@norte.com.br ''!%060:#$0'%);#+,"06<6&3,.'
''''!&30&.==!5&30&.'
''''!$</03#.>>>>'?-@=!5$</03#.'
''!5%060:#$0.'
celular !5"#$%&%#.'
11
9999 4321

12
Visualizao em um browser

!! Folha de estilo: conjunto de regras para formatar ou


transformar as informaes de um documento XML
!! CSS - Cascading Style Sheets
!! Transformao visando apresentao visual
!! Aplicao do estilo em tempo de execuo no cliente
!! XSLT - eXtensible Stylesheet Language
!! Transformao em texto, HTML ou outro formato
!! Aplicao em tempo real ou prvia (no servidor)
!! Se no estiver associado a uma folha de estilo, o
documento XML no tem uma "aparncia" definida
!! Vrios browsers por default mostram a rvore-fonte XML
!! Outros mostram apenas os ns de texto sem formatao
13
Formas de processamento XML

!! Via APIs de programao


!! SAX Simple API for XML: leitura seqencial, ideal para
extrao de dados
!! DOM Document Object Model: leitura completa, ideal
para manipulao (insero, reordenao, alterao,
remoo de ns)
!! Via linguagens de processamento (suportadas por
parsers e processadores padronizados pela W3C)
!! XSLT, XPath, XLink, XPointer e XQuery: extrao,
transformao e localizao de dados
!! XSL-FO, XHTML, SVG: apresentao de dados

14
Processamento XML

texto "custom" Web


XML !"#$%&
!"#$%& WML
VoiceXML
HTML
CSS
XML para
SGBD <xml> VRML
JavaScript
<xml>
e vice-versa <xml>

DOM PDF RTF


PDF
SAX PDF TeX
SGML

Grficos SVG
SGBD Imagens PDF e
JPG e PNG PostScript
2000 2001

15
XPath

!! Linguagem usada para navegar na rvore XML


!! Uma expresso XPath um caminho na rvore que resulta
em um valor (nmero, texto, booleano), objeto (elemento,
atributo, n de texto) ou conjunto de objetos
! Caminhos absolutos
!"#$%&%#!'"#()*#+
33 ++!"#$%&%#!%,-,.#$,!'%)/#+
Severino Severovitch
++!"#$%&%#!%,-,.#$,!$01,2#!%,3%45+
bill@norte.com.br

celular ! Relativos ao contexto !"#$%&%#+:


11 ++'"#()*#+!"#$6!'"#()*#%$
9999 4321 ++%,-,.#$,!'%)/#+!"#$6!%,-,.#$,!'%)/#%$
++%,-,.#$,!$01,2#!%,3%45+

!! Expresses XPath so usadas dentro de atributos XML


!! Usadas em XSLT, XLink, XQuery e XPointer

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>

!! XSL Transformations (XSLT)


!! Linguagem (XML) para criao de documentos que
contm regras de transformao para documentos XML
!! Documentos escritos em XSLT so chamados de folhas
de estilo (mas so na verdade templates) e contm
!! Elementos XSLT: !"#$%&'"#(, !)*(, !*+,-#'./(, ...
!! Expresses XPath para localizar ns da rvore-fonte
!! Texto ou XML a ser gerado no documento-resultado
!! Usa-se um processador XSLT
fonteToHtml.xslt
Folha de
estilos
Processador XSLT
Documento
fonte.xml Xalan, TrAX, Saxon
Resultado
Firefox, I. Explorer, etc.
Documento
Fonte
19
XSLT: documento-fonte (1)

!! Considere o seguinte documento-fonte:


!"#$%&'#($!)*+,-./01,2!
!!!"&%)3$4!5#%6)*#+,789:;,2<)&!*$!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!=#'$)%&">&%)3$42!
!!!"*$?6)'&2@A&!-#BC&">*$?6)'&2!
">#$%&'#($2!

!! E sua representao como uma rvore-fonte


0$
4(&*#)(5&6$

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)

!! Elementos XSLT so qualificados com prefixo (da forma


!"#$%&$&'&()*+) para evitar conflitos com o documento-resultado
!! O prefixo xsl e namespace precisam ser declarados com xmlns:xsl
21
XSLT: documento-resultado (3)
!! Aps a transformao, o resultado ser

!"#$%!&'()*&+'!,'!#('-./)!!
01234!,'5)6)7!
,'!8.)!,'!9&*'.()!:;!!
<=>?!
@'*,)!5)A)!,';@.*)!)!&'()#)(@)!,'!
BC)!0&76)D"E#$!

!! Para obter outros resultados e gerar outros formatos


com os mesmos dados, pode-se criar folhas de estilo
adicionais

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

!! XSL Formatting Objects


!! Linguagem XML de descrio de pgina com os mesmos
recursos que PostScript ou PDF
!! Descreve o layout preciso de texto e imagens
!! Possui centenas de elementos, atributos e propriedades (que
so semelhantes s propriedades do CSS)
!! Pginas so facilmente convertidas para PDF e PostScript
!! Ideal para gerar documentos para impresso (livros, etc.)
!! Normalmente gerada via XSLT
XML
XSLT XML
Processador Documento Documento
XSLT
FOP
XML XSLFO PDF
Fonte

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" />

!! Scalable Vector Graphics (padro W3C)


!! Grficos vetoriais em XML
!! Plug-ins para principais browsers: concorre com Flash
!! Suporta animaes, links, JavaScript, CSS
!! Produzido por ferramentas como Adobe Ilustrator
!! Pode ser embutido no cdigo XHTML e XSL-FO

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

!! XML uma tima soluo para compartilhar dados


!! Para implementar solues em gesto de
informaes usando XML, pode-se usar
!! DTD ou XSchema para especificar o modelo de dados e
validar as informaes
!! As APIs DOM ou SAX para extrair dados dos documentos,
gerar documentos, ler e gravar em bancos de dados
!! XSLT e XPath para transformar os dados em outros formatos
!! XLink, XPointer e XQuery para criar vnculos lgicos entre os
documentos e localizar seus componentes
!! XSL-FO ou XHTML para formatar os dados para impresso
ou visualizao na tela (PDF, Word ou Web)
!! SVG para gerar informaes em forma de grfico vetorial
30
XML: uma introduo prtica X100

Helder da Rocha
(helder@argonavis.com.br)

Atualizado em setembro de 2001


1
Como criar um documento XML

!! XML no tem comandos, nem operadores, nem


funes, nem tipos
!! No exatamente uma "linguagem"
!! A especificao XML no estabelece nenhum vocabulrio
!! Define apenas uma estrutura e sintaxe geral para a
organizao de informaes estruturadas
!! Para criar o menor documento XML
!! Abra um editor de textos qualquer
!! Salve o arquivo com extenso .xml
!! Escreva um elemento raiz vazio; por exemplo:
!"#$$%&'(
!! Salve o arquivo
!! Abra em um browser como Firefox ou Internet Explorer
2
Especificao XML
!! As regras para criao de documentos XML so definidas pelo
World Wide Web Consortium (W3C) atravs de especificao
!! !""#$%%&&&'&(')*+%,-%./0%1
!! A especificao no define
!! nomes de elementos e atributos (cada aplicao define os seus)
!! como escrever documentos vlidos: a validade de um documento XML
definido pelo autor da aplicao em que ele usado
!! A especificao define
!! tokens, caracteres e formatos de texto que podem ser usados em
documentos XML (basicamente texto Unicode)
!! elementos e atributos reservados (comeam com o string xml)
!! regras mnimas que possibilitam a leitura por um processador XML: um
documento que segue essas regras bem formado
!! como uma aplicao pode validar um documento XML usando um DTD
(Document Type Definition) com sintaxe similar a SGML

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

numero ddd /imagens/logo14bis.gif

tipo

LEGENDA
21 n de elemento
2313011
n de atributo
residencial n de texto
5 www.argonavis.com.br 5
Componentes de um documento

!! Um documento pode conter


!! Prlogo
!! Comentrios
!! Instrues de processamento
!! Atributos nos elementos
!! Ns de texto dentro dos elementos
!! Elementos aninhados (sendo apenas um na raiz)
!! Contedo misto (elemento e texto) dentro de elementos
!! Entidades gerais
!! Entidades de caractere
!! Blocos CDATA

6
Declarao XML Prlogo
Comentrio (pode aparecer em qualquer lugar)
Instruo de processamento
Declarao de tipo de documento

<?xml version="1.0" encoding="iso-8859-1" ?>


<!-- Isto um comentrio -->
<?comando tipo="simples" parametro ?>
<!DOCTYPE cartao-simples SYSTEM "cartoes.dtd">
<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>
</cartao-simples>

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

!! S podem conter um descendente: n de texto


<?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>
<numero>2313011</numero>
</telefone> atributos
</cartao-simples>

9
Ns de texto

!! No podem ter descendentes (so as folhas da rvore)


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

!! Tambm so substitudas durante o processamento


do documento
!! Sintaxe:
!! !"#$%&'()*+,-./0123456
!! !"7#$%&'()*+,-8/73./0123456
!! Exemplos:
!! !"9+:56;"799<=566
!! !"799=95 representa um espao em Unicode
!! Veja mais em www.unicode.org/charts/
!! XML no define por default as entidades do HTML
!! No existe !>,?@56ou !3A14./56a menos que sejam
definidas em um DTD (como no DTD do XHTML)
12
Elementos e atributos: regras bsicas

!! Etiqueta inicial e final tm que ter o mesmo nome


(considerando diferena de maiscula e minscula)
!! No pode haver espao depois do ! nas etiquetas iniciais
nem depois do !"#nas finais
!! Atributos tm sempre a forma nome, seguido de '$',
seguido do valor entre aspas ou apstrofes
!! !"#$%&'()"*&+ou !"#$+%+,'()"*, so vlidos
!! aspas podem ser usadas entre apstrofes
!! apstrofes podem ser usados entre aspas
!! aspas e apstrofes no podem ser neutralizados, mas podem
ser representados pelas entidades -./"01+e -(2"31+
!! No pode haver atributos na etiqueta final
!! Atributos no podem se repetir no mesmo elemento
13
Um documento bem formado quando

!! Tem um nico elemento raiz


!! Todas as etiquetas iniciais e finais dos seus elementos
combinam (levando em conta maisculos e minsculos)
!! Seus elementos esto bem aninhados
!! No acontece nada do tipo !"#!$#!"#$!%$#&
!! Valores dos atributos esto entre aspas ou apstrofes
!! Os atributos no se repetem
!! Elementos e atributos tm identificadores vlidos
!! Comentrios no aparecem dentro de etiquetas
!! Sinais < ou & nunca ocorrem dentro de atributos ou
ns de texto do documento

14
Elementos e atributos

!! Elementos mal formados


!"#$%&'(()%*+$,-'./.%"01$%&'(()%*!
"23*"24*'./5!-5"0.6*"0.$*!
!!".6*'./5!-5"0!.6*!
!"/,-787%*9!:!;!"!<!:!="0/,-787%*!
!">?@ABC*DEFGHH"0IJKLMN*!
!! Atributos mal formados
!"1$%&'((7%!.'1%OD*+$,-'./.%"01$%&'(()%*!
!"8P7Q/!9ORSTUFVR#WFFR!0*!
!!"7!9ORDR!;ORXR!<ORER!9ORHR!0*!
!! Elementos e atributos bem formados
!"1$%&'((7%!.'1%OYXY*Z[('8%"01$%&'(()%*!
!"8P7Q/!9!O!RSTUFV\,-%.]#WFFR!0*!
15
Quando usar elementos ou atributos?

!! H vrias maneiras de representar a mesma


informao em XML
!"#$#%&'()&(*++,!("#$#%-

!"#$#-".#/0&'0-123/0)&0-#45/0*++,0-(%-

!"#$#%-
-!".#%&'!(".#%-
-!123%)&!(123%-
-!#45%*++,!(#45%-
!("#$#%--

16
Quando usar elementos ou atributos?

!! Uma questo de design


!! Elementos geralmente referem-se a coisas que tm
atributos
!! Atributos geralmente so caractersticas dessas coisas
que podem ser descritas com poucas palavras
!! Uma questo de suporte tecnolgico
!! Atributos no podem conter subelementos
!! Atributos so mais fceis de serem validados num DTD
!! Sempre que possvel, priorize os argumentos de
design aos de suporte tecnolgico

17
Identificadores de elementos e atributos

!! Nomes de atributos e elementos


!! Podem conter
!! qualquer caractere alfanumrico ou ideograma
!! ! (ponto)
!! " (hfen)
!! #$(sublinhado)
!! No podem comear com
!! ponto
!! hfen
!! nmero
!! No podem comear com a seqncia 'xml'
!! reservada para atributos e elementos com significado
especial, definido em especificao (ex: xmlns, xml:lang)
18
Identificadores de elementos e atributos

!! Elementos bem formados


<!"#$%&%'('$>)'"# )&#*%#+*$</!"#$%&%'('$>
!"#$%&'()*+*,-./01203'
''!#&45&#$6375%6#$8'9#6%$#!:#&45&#$63'
''!&5;<='=<>?6#$6/@ABCC@''
'''''''''DE6=;F/@AGHB@3IJ6"D&#?='K6=%665$L'MN>"$#!:&5;<=3'
!:"#$%&3'
!OAO:3'
!PQQ+.R-ST-U'PQQ+PVQ/@WWX@3Y-Z1VQ2[\V',']^_!:PQQ+.R-ST-U3'

!! Elementos mal formados


!H`T-Z1V3a2-Q,)R-ZVb!:H`T-Z1V3'
!P,1Z\V'QR'P1cQTZV3AdHeXfBGGBfXeHdA!:P,1Z\V'QR'P1cQTZV3'
!()*T.2R3gVTb,b!:()*T.2R3''

19
Contedo misto

!! Texto misturado com elementos XML


!"#$%&'()
))!*$%+'(,!-*$%+'()
))!.+#+/#+0'(1)2345+5$)5$)430'#6+78'))))
))5$3"#')5$)26)5'%26$3"')9:;)<)'))
))!5$0434%+'($=$6$3"'!-5$0434%+'(>)?6))
))$=$6$3"')<)0'#6+5').'#)52+*))
))!5$0434%+'($"4@2$"+*!-5$0434%+'()@2$))
))+"#4A2$6)+=/26)*4/3404%+5')+'))
))%'3"$B5'>)!-.+#+/#+0'()
!-"#$%&'())

20
Bloco CDATA

!! Ignora efeitos especiais dos caracteres


!"#$#%&'()%*+'!,-!./0"1#$#%&'(!
"-2-34&'()'5+$,-*-!'!+-6%$5#-!#*-78'!,-!./09!
!"#$%&'&#!
!!!!!"-34*-+:(!
!!!!!!!!!"5'3-(;'<'!()/:*$:!=1>"15'3-(!
!!!!!"1-34*-+:(!
**+)
!!"1-2-34&'(!!

21
Instrues de processamento

!! Instrues dependentes do processador


!! Funcionam como comentrios para os processadores
que no a conhecem
!"!"#$%&"%'()"*#$%&'(%'(&()*'"+''

!"+,$-.%/+(**
''*%,%-.'/)0%1'%0&2,''
'''''3$)0'&4%/(&''
'''''56%$%'2(789''
"+''

22
Comentrios

!! Iguais aos comentrios HTML


!"##$%&'($)$*+$,(+-.'/01($##2$

!! Comentrios no podem conter a seqncia --


!"##$$1&'($)$*+$-00($!!"&)01("$##2$

23
Declarao XML

!! uma instruo de processamento para o


processador XML
!! opcional
!! Exceto quando o encoding no for UTF-8 (default)

!"#$%&!'()*+,-./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">

<ct:nome>Fulano de Tal</ct:nome> URI padro


XHTML
<nome>Contabilidade</nome>
<endereco>Rua Projetada, 33</endereco>
<html:a href="web.html">
<html:strong>link negrito HTML</html:strong>
</html:a>
<urgencia><ct:numero>2313011</ct:numero></urgencia>
</departamento>

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)

Atualizado em setembro de 2001 1


Documentos XML bem formados

!! Para que possa ser manipulado como uma rvore,


um documento XML precisa ser bem formado
!! Documentos que no so bem formados no so
documentos XML use um editor XML para descobrir
!! Documentos bem-formados obedecem as regras de
construo de documentos XML genricos
!! Regras incluem
!! Ter um, e apenas um, elemento raiz
!! Valores dos atributos estarem entre aspas ou apstrofes
!! Atributos no se repetirem
!! Todos os elementos terem etiqueta de fechamento
!! Elementos estarem corretamente aninhados
2
XML vlido

!! Um XML bem construdo pode no ser vlido em


determinada aplicao
!! Aplicao tpica pode esperar que
!! elementos faam parte de um vocabulrio limitado,
!! certos atributos tenham valores e tipos definidos,
!! elementos sejam organizados de acordo com uma
determinada estrutura hierrquica, etc.
!! preciso especificar a linguagem!
!! Esquema: modelo que descreve todos os elementos,
atributos, entidades, suas relaes e tipos de dados
!! Um documento XML considerado vlido em relao
a um esquema se obedecer todas as suas regras

3
Por que validar?

!! Para a maior parte das aplicaes, um XML bem


formado suficiente
!! possvel, em documentos XML bem-formados,
mas que no so vlidos
!! Montar a rvore usando DOM
!! Extrair ns, acrescentar ns, alterar o contedo dos
elementos usando SAX ou DOM
!! Transformar o documento em outro usando XSLT
!! Gerar um PDF ou um SVG com dados contidos no
documento
!! Exibir o XML em um browser usando CSS
!! Ento porque ter o trabalho de criar um DTD ou
um XML Schema? 4
Definir um esquema

!! Documentos no vlidos so "individualistas"


!! Um esquema representa um conjunto de documentos,
que existem e que viro a existir
!! possvel fazer muitas coisas com UM documento no
vlido. difcil automatizar os processos sem considerar
uma CLASSE de documentos
!! Um esquema uma formalidade necessria
!! Se voc tem uma grande coleo de documentos que
foram construdos segundo determinadas regras, voc j
tem, informalmente, um esquema
!! Para validar documentos de acordo com suas convenes,
preciso ter um esquema

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

!! Um relacionamento pode ser estabelecido


formalmente entre um esquema e sua instncia
!! Declarao de tipo de documento (para DTD)
!! !"#$%&'()*!"#$%&%'+'+&),*-./012324535-6*
!! Declarao de namespace e schema (para XML Schema),
no elemento raiz
!! !!"#$%&%'785/98:-;,<=&>-*
?@0AB:-133CDEEF.7478@-*
?@0ABD?B/:-133CDEEGGG4GH48I9EJKKLEM,N+712@FO/AB3FA72-*
?B/DB712@FN87F3/8A:-133CDEEF.7478@*./012324?B5-6*444*
!! Para validar
!! Use um parser validador (com suporte linguagem de
esquema desejada)

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

!! Considere o seguinte documento XML

<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

!! Este DTD valida o documento de forma pouco


rigorosa
!"#$#%#&'()*+,-.-(/(0112(345546-*71(8(9(
!":''$;<'()*+,-.-(=1>*61(&%'?@#&(AB#CD;B#E(9(

!"#$#%#&'(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

!! Este DTD restringe as informaes que podem ser


usadas nos atributos de voo
!"#$#%#&'()*+,-.-(/(01123(456657-*81(9(:(
!";''$<='()*+,-.-(>1?*71(&%'@A#&(BC#DE<C#F(:(

!"#$#%#&'(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

!! Alguns DTDs possuem um identificador formal pblico (FPI)


!! Neste caso, so declarados com a palavra PUBLIC e duas strings: o
identificador seguido de uma URL onde pode ser encontrado
!>D8EFGHI&JFKL&&+,-.#(/9MMNOEMMDFD&JFKL&P12MMIQ/&&&&&&&&&&&&&&&
&&&&/R@@ASMMTTT1TO1,)5MFUMUIE9R@$%P2M*@)+3@14@4/=&&

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

!! O DTD foi importado, mas est incompleto. Parte dele


definido localmente
!"#$%&'()*+,--./*!"!#$%&'()**+,-./.'0*
***!")1)2)3&*4.5,*67(%#8&89:*
***!")3&;&'**<=<*>#.?@5,4=*&A+,*#,BC4C=C.4>:*
D:*
!! Elementos, atributos e entidades definidos no
documento tm prioridade sobre declaraes
importadas
!! Processador l primeiro elementos locais, depois os que
foram carregados do DTD externo
!! A primeira declarao usada. Declaraes adicionais para
o mesmo elemento/atributo/entidade so desconsideradas
logo, declaraes locais tm precedncia
19
DTD: exemplo zero ou uma
ocorrncia exatamente uma
ocorrncia cada

<!ELEMENT cartao-simples ( logotipo?, zero ou mais


nome, endereco, ocorrncias
definio de
elemento email*, uma ou mais
telefone+ ) > ocorrncias
<!ELEMENT logotipo EMPTY >
no pode conter outros ns
<!ATTLIST logotipo
(exceto atributos)
href CDATA #REQUIRED >
<!ELEMENT nome ( #PCDATA ) >
atributo obrigatrio
<!ELEMENT endereco ( #PCDATA ) > contm "Character DATA"
<!ELEMENT email ( #PCDATA ) >
<!ELEMENT telefone ( ddd, numero ) > um ou
o outro valor default
<!ATTLIST telefone
lista de tipo ( residencial | comercial ) "residencial"
atributos codigo-pais NMTOKEN #IMPLIED >
<!ELEMENT ddd ( #PCDATA ) >
atributo opcional
<!ELEMENT numero ( #PCDATA ) > contm nome ou nmero
20
Elemento <!ELEMENT>

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

!! Parsed Character Data


!! Elemento declarado com esse tipo pode conter apenas
texto simples
!! Pode conter entidades &valor;
!! No pode conter elementos

22
Contedo Seqncia

!! O contedo deve ter uma lista de elementos


separados por vrgula
!! Indica que os elementos filho que podem aparecer dentro
do elemento declarado
!! Define uma ordenao dos elementos filho
!! Podem ter sufixos indicando multiplicao
!! ! zero ou mais
!! " um ou mais
!! # zero ou um
!! Exemplos
!! !"#$#%#&'($%&'%())*+,-.(/-0-1+*-2.((
((((((((((((((((((-,3405.(6-784/-9:(;(
!! !"#$#%#&'('&*+))0+<+,+/4=3.(=3>+-85:(;((
23
Contedo lista de opes

!! Lista de elementos separada por |


!! Indica que um dentre os elementos filho listados pode ser
usado como contedo do elemento declarado
!! Exemplos
!"#$#%#&'(!"#$%&')*+,,-./0,/-(1(23,+-(1((
(((((((((((((((((((,-4-./0,/-(1(*56./257(8((
!"#$#%#&'($("$)*&')9+:;,-<(),2/-(1(4/2=+;,-77(8(
!"#$#%#&'(+&,!&'))><(?7(1(),<(@77(8(
!"#$#%#&'(,&-#')A,+:-=+(1(B-C,+:-=+(1((
((((((((((((((()A,+:-=+<(/:/9/25D<(B-C,+:-=+778(

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

!! Elementos que no podem conter nada devem ser


declarados como EMPTY
!! !"#$#%#&'()*+,(!"#$%-(
!! Elementos EMPTY podem conter atributos
!! !".''$/0'()*+,(12,)*+,(34.'.(56#78/6#4-(
!! A declarao acima permite elementos como
!! !)*+,(12,)*+,9:;*<=:(>-(
!! ANY: use para elementos que podem conter
qualquer coisa
!! !"#$#%#&'(?*@*<(&'%-(

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

!! CDATA (character data) representa qualquer texto


arbitrrio
!! Pode conter espaos, pontuao, etc.
!! NMTOKEN (name token). semelhante a um
nome de elemento ou atributo
!! Caracteres alfanumricos apenas
!! No pode conter espaos nem pontuao
!! NMTOKENS representa um ou mais NMTOKEN
separados por espaos.
!"#"$"%&'()&*+,-&'./-$(0'+1(&*21(34(56/7(

30
Tipo lista de opes

!! Uma lista de NMTOKENS dentre os quais pode-


se escolher o valor do atributo.
!! As escolhas so separadas por |:
!"#$%%&'(%!)**!+,-,!./0121342(567!8/096'/05:!!
!"#$%%&'(%!;<-=*!+>-?*@*!.@?,2A*?B>7!CA*?B>C:!!
!! Elementos no podem conter espaos ou outros
caracteres no-alfanumricos
!! O tipo de cada opo NMTOKEN!

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

!! IDREF referncia para um ID. Exemplo:


!"#$%%&'(%!)*+,-,!.+,/.0,!!"#$%&12345'2367!
!! Aplicao
".89,),9-,7!
!!":,,!/,0*;,<=#'()*=7!>>>!"?:,,7!
!!":,,!/,0*;,<=#'+,-=7!>>>!"?:,,7!
!!")*+,-,!@AB89,<=.(=!.+,/.0,<=#'()*=7!!
!!!>>>!"?)*+,-,7!
!!")*+,-,!@AB89,<=.)=!.+,/.0,<=#'+,-=7!!
!!!>>>!"?)*+,-,7!
"?.89,),9-,7!

33
Tipo IDREFS

!! Lista de elementos IDREF. Exemplo:


!"#$%%&'(%!)*+,-,!.+,/.0,!!"#$%&'12345'2367!!
!! Aplicao (codigo e numero so IDs)
!".89,),9-,7!!
! !":,,!/,0*;,<=#()*+=7!>>>!"?:,,7!!
! !":,,!/,0*;,<=#(,-.=7!>>>!"?:,,7!!
! !")*+,-,!!@AB89,<=&*=!!
! ! ! ! ! !.+,/.0,<=#(,-.'#()*+=7!!
! !>>>!"?)*+,-,7!!
!"?.89,),9-,7!

34
Valores default

!! #REQUIRED: fora o autor do documento a definir


um valor explcito ao atributo.
!! #IMPLIED: o atributo opcional.
!! #FIXED: o atributo tem um valor fixo, constante
!! Valor no pode ser mudado
!! Autor no precisa definir atributo e, se o fizer, no pode
mudar o valor.
!! Exemplo:
!"#$$%&'$()*+,-(.,/0*(12#$#(!"#$%&'()*+(3((
!! Valor inicial, entre aspas
!! Autor no precisa definir atributo, mas pode mud-lo
!"#$$%&'$(),,(4,.5*678*(9:;(<(=>?((,-('3((
!"#$$%&'$(/60/-/4,(5*8@(12#$#((./0123(3(
35
Elemento <!NOTATION> e tipo NOTATION
!! Associa URI a um nome
!! Usado frequentemente para associar valores !"#$#%a &'$()*&
(mesmo onde no h URIs)
!! Exemplos
%+,!"#$#%"!&-.-/01%232$*'%45667899:::;-.-/01;<0.4=%%
%+,!"#$#%"!&>-?1@A%232$*'%45667899:::;>1;<0.4=%%
!! Tipo &($#$B(&%de +,#$$CB2$=% til em situaes onde
no se pode usar !"#$#
%+,#$$CB2$%>00D%%
%%%%%%%%%%A60?@%!"#$#%"!&E-.-/01%F%>-?1@AG%HI*JKBI*"=%%
!! Assim pode-se limitar melhor valores dos atributos
%+>00D%A60?@L4-.-/014%9=%

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: &#333; &#x3AB4;
!! globais cinco entidades: &lt; &gt; &amp; &quot; e &apos;
!! 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

!! Carregam texto de arquivos externos ao XML


! !"#$%&'&(!)*+,!-(-&$.!/012/3!
! !"#$%&'&(!)*+,!4567'8!/9:2/!/012/3!
!! Exemplo
!"#$%&%'()*+,-.,/(-(-&$.!01.*21)*+,34)506(
!! Uso
!*5*)*+786(
!! Resultado
;+,)0<=0:>!
!*5*)*+786( !*5*)*+786(
!! Contedo de menu.xml: ((!)*+,6(
((((%*478(
!)*+,6(
((!1)*+,6(
%*478(
!1*5*)*+786(
!1)*+,6(
39
Entidades gerais externas no processadas

!! Usadas para carregar dados que no podem ser


processados (que no so texto) atravs de atributos
!"#$%&'&(!)*+,!-(-&$.!/012/!%34&4!)*5678*9!!
!! Depende de uma declarao NOTATION
!! Neste caso tpico usada para informar tipo de dados
!! Exemplo de uso no DTD
!"#$%&'&(%$!:2;!)*)&+,!-./01231.4-5!!
!"#+$&(&*!<*:*!)*)&+,!-671781.4-!%34&4!:2;5!!
!! Atributos podem declarar receber tipo ENTITY
!"#'&&9()&!2+6:,+!;*)5,!$%&'&(!:;+<=(;+>5!
!! Uso no XML: Esta entidade geral logo usada
apenas em atributos
!"2+6:,+!;*)5,?-<*:*-5!! A sintaxe diferente: seria &logo;
se fosse uma entidade processada 40
Entidades de parmetro internas

!"#$%&%'()(*+,-(./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

!! primeira vista parecem inteis


!! Servem para construir DTDs configurveis e modulares
!! Mdulos permitem segmentao e reuso
!! So usados por aplicaes como XHTML 1.1, SVG 1.1
!! Bloco IGNORE: ignora o contedo
!"#$!"#$%&'$!
!!!"#%&%'%()!*+,-./+0!123456)678!
998!
!! Bloco INCLUDE: declara que o texto deve ser
interpretado
!"#$!#()*+&'$!
!!!"#%&%'%()!*+,-./+0!123456)678!
998!
43
Utilidade de blocos condicionais
!! Se texto "IGNORE" OU "INCLUDE" for atribudo a entidades de
parmetro, pode-se "ligar" ou "desligar" declaraes
!! Exemplo: no DTD importado
!"#$%&%'(!"#$%&'$()*#(+)")&*$+,#)-(
!"#$%&%'(!"#$%&'$()*#(#*&,")&*$+,#)-(
!"./0123415670586(.(
(((!"#9#:#$%(;73<=<(>?@ABC%CD-(
EE-(
!"./01234156705073<(.(
(((!"#9#:#$%(6=3<;73<=<(>?@ABC%CD-(
EE-(
!! Blocos acima so "desligados" por default
!! Em um DTD local, pode-se "ligar" o que se deseja usar
(!"#$%&%'(!"#$%&'$()*#(+)")&$A9FB#)-(
!! Agora elemento <coisas> faz parte do DTD!
44
Validao: alm do DTD

!! 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)

Atualizado em setembro de 2001 1


Programao com XML
! H duas maneiras populares para manipular (interpretar, gerar,
extrair dados e tratar eventos) arquivos XML:
! Document Object Model (DOM) representao em rvore
! Simple API for XML (SAX) representao sequencial
! As duas tcnicas servem a finalidades diferentes.
! SAX mais simples. Oferece mtodos que respondem a
eventos produzidos durante a leitura do documento
! Notifica quando um elemento abre, quando fecha, etc.
! Permite ler dados enquanto XML carrega
! DOM monta uma estrutura hierrquica de objetos, em forma
de rvore, que permite a navegao na estrutura do documento
! Propriedades dos objetos podem ser manipuladas
! Viabiliza scripting em aplicaes como XHTML e SVG
! Oferece suporte a vrias APIs que usam XPath para extrair dados,
permitindo maior produtividade e eficincia
2
SAX ou DOM?
! SAX
! Gasta menos memria: no precisa carregar o documento inteiro
! Ideal para aplicaes simples que no precisam manipular com toda a
rvore de objetos (ex: busca simples)
! Programao em nvel mais primitivo: foco em eficincia
! Pode-se usar SAX para montar uma rvore DOM
! No um 'padro'; mais uma tcnica de processamento que uma API;
h vrias alternativas similares: StAX (Java), SAX2, etc.
! DOM
! Mais novo (linguagens mais antigas suportam apenas SAX)
! Baseado em objetos e mais fcil de usar (API de nvel mais alto)
! H uma API padro do W3C (h outras APIs similares: JDOM, etc.)
! a nica opo para manipulao no cliente (via scripts)
! Permite validao e busca sofisticada combinado com XPath
! APIs disponveis em vrias linguagens
! Java, VB, C/C++, Objective-C, C#, Python, Ruby, JavaScript (DOM)
3
Bibliotecas e APIs populares
! Em C e C++ (parsers, SAX e DOM)
! libxml2 (projeto Gnome): http://www.xmlsoft.org
! Apache Xerces C++: http://xerces.apache.org/xerces-c
! Em Java
! Pacotes nativos: javax.xml (parsers), org.w3c.dom, org.w3c.sax
! Microsoft .NET
! XmlTextReader (navegao na rvore), XmlReader (SAX)
! XmlDocument (DOM), XPathNavigator
! PHP
! xml_parser_create() (SAX, desde PHP3)
! new DomDocument (DOM, desde PHP5)
! Python
! Pacotes nativos: xml.sax e xml.dom
! Objective-C na plataforma Apple
! Mac OS X: NSXML (SAX) NSXMLDocument (similar a DOM)
! iOS 4: NSXML (SAX) DOM somente usando bibliotecas de terceiros
4
W3C DOM

! Document Object Model API padro


! Padres do W3C: DOM Level 1, DOM Level 2
! Usado tambm por HTML
! Objetivo da especificao: oferecer uma interface
de programao uniforme, independente de
plataforma e linguagem, para aplicaes que
manipulam XML
! Serve para
! criar um novo documento XML
! navegar na rvore XML
! modificar, remover ou adicionar ns (elementos,
atributos, texto, comentrios, PIs, etc.)
5
SAX

! Simple API for XML


! Tcnica de processamento que dispara eventos
durante processamento do documento
! eventos representam componentes lidos e podem ser
capturados por objetos ouvintes cadastrados
! aes podem ser tomadas em cada situao
! Exemplos de eventos
! inicio e fim do documento
! incio e fim do elemento (pode-se descobrir qual)
! n de caractere
! n de comentrio
! ...

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

! Leitura do documento (pode usar SAX)


! Passo 1: carregar o documento e identificar os tokens
! Passo 2: identificar elementos e outros ns
! Passo 3: montar a rvore (pode ser feito durante passo 2)
! Alterao (com a rvore na memria)
! Localiza o n de referncia
! Remove, altera, muda posio, cria n antes ou depois.
! Criao
! Cria raiz; cria elemento raiz; cria elementos filho e
atributos; cria ns de texto
! Monta rvore
! coloca atributos em elementos, ns de texto em elementos,
elementos filho em elementos pai, elemento raiz na raiz
11
W3C DOM (padro): tipos de dados
! Colees: NodeList, NamedNodeMap
! Raiz da hierarquia de ns: Node
! Subclasses de Node
! Attr (atributo)
! CharacterData (classe abstrata)
! Text (n de texto)
! CDATASection (seo CDATA)
! Comment (comentrio)
! Document (documento inteiro)
! DocumentFragment (sub-rvore)
! DocumentType <!DOCTYPE>
! Element (elemento)
! Entity (valor da entidade - contedo)
! EntityReference (nome da varivel)
! Notation (valor de uma notao)
! ProcessingInstruction (instruo de processamento)
12
W3C DOM: Hierarquia

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)

* Nomes das constantes s vezes variam, conforme a implementao


14
Alguns mtodos da interface Node
! Node appendChild(Node)
! Node cloneNode(boolean)
! NamedNodeMap getAttributes() attributes
! NodeList getChildNodes() childNodes
! boolean hasAttributes()
! boolean hasChildNodes()
atalhos!
! Node insertBefore(Node, Node)
! Node removeChild(Node)
! Node replaceChild(Node, Node)
! Node getFirstChild() firstChild
! Node getLastChild() lastChild
! Node getNextSibling() nextSibling
! Node getPreviousSibling() previousSibling
! String getNodeName() nodeName
! short getNodeType() nodeType
! String getNodeValue() nodeValue
! Document getOwnerDocument() ownerDocument
! Node getParentNode() parentNode
15
Mtodos para listas e mapas

! 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

! Use mtodos que levam em conta o namespace


! necessrio para acessar elementos e atributos que
usam namespaces (ex: xlink)
! necessrio quando se usa XML com namespaces (ex:
quando usado junto com SVG, XHTML, XSL-FO, etc.)
! Em vez de getAttribute, getElement, etc.
! Use getAttributeNS, getElementNS, etc.
! Exemplo usando Java
!"#$%&'()&*!'+',-""./0011121324#&056660()&,7'
!"#$%&'89$%:*!'+',-""./0011121324#&0;<<<089$%:,7'

*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

! Usando interfaces do W3C DOM padro


!" #$%&'()*" Obter objeto do tipo Document
(depende de processador): document

+%,-*,." /0('()*"
carta := document.createElement("carta")

+'()1,2('." /0('()*"
mens := document.createElement("mensagem")
3$'"45,6" 7*-5)2"

texto := document.createTextNode("Bom dia!")


! Atributos
+%,-*,"5489:9." carta.setAttribute("id", "1")

21
DOM: montagem da rvore

! Usando interface DOM padro


! 1. Sub-rvore <mensagem> ! 3. rvore completa
#$%&'()%$*"
!"
mens.appendChild(texto)

+,$"-.(/"
#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:!!

! Exemplo de uso de DOM com Java


! ?,'&'()!','&'()#!3!%)*"+&,-4@')?,'&'()*16-8=7'$0#=9:!
! ','&'()#40<<'(-AB+,-8%)*"+&,-4$.'0)'?,'&'()8=<=99:!
24
Java: gravao em XML

! Uma vez criada a rvore DOM, ela pode ser


serializada para XML (arquivo de texto)
! Soluo padro usar XSLT (javax.transform)
! javax.xml.transform.*
! javax.xml.transform.dom.DOMSource;
! javax.xml.transform.stream.StreamResult;
! O trecho abaixo imprime o documento XML contido
em document na sada padro (System.out)
TransformerFactory tFactory = TransformerFactory.newInstance(); !
Transformer transformer = tFactory.newTransformer(); !!
DOMSource source = new DOMSource(document); !!
StreamResult result = new StreamResult(System.out); !!
transformer.transform(source, result);

25
Exemplo de DOM com .NET (C#)

! Use a biblioteca System.XML


!"#$%&'(")*+,-./0&

! Para criar um Document vazio (e obter a referncia


para o seu elemento raiz):
-+1234!+*$)&!"#$%&'()5&$*6&-+1234!+*$)780&

! Para processar um documento existente


-+1234!+*$)&!"#$%&'()5&$*6&-+1234!+*$)780&
934!+*$),13:9-+17;<=*""3:><$3+*>,,,<?=*""3:>;80&

! Exemplo de uso de DOM com C#


@1*+*$)&*1*+*$)3&5&!"#$%&'(,%*)@1*+*$)A(B97;"*4:3;80&
*1*+*$)3,:==*$9CD#197!"#$%&'(,4E*:)*@1*+*$)7;=;880&
! Para gravar em texto em arquivo
934!+*$),':F*7;4GHHE*"!1):93,I+1;80&

26
Exemplo de DOM em PHP 5

! Para obter o Document de uma rvore nova:


$document = new DomDocument;

! Para processar um documento XML existente e obter


seu Document:
$document = new DomDocument;
$document->load('arquivo.xml');

! Exemplo de uso de DOM em PHP


$elemento = $document.getElementById("secao");
$elemento->appendChild($document->createElement("p"));

! Para gravar a rvore novamente em XML (imprimindo


na sada padro)
! print $document->saveXML();

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

! Em linguagens de script, que rodam no browser, use


sempre DOM padro W3C
! Usar solues proprietrias em aplicaes que rodam no
cliente no recomendado
! Em aplicaes no servidor ou standalone, escolha a
soluo mais adequada sua aplicao
! Use as solues nativas se existirem
! Escolha entre solues de acordo com recursos desejados,
eficincia, etc (ex: vrias APIs DOM diferentes para Mac
OS e iPhone)
! Java oferece APIs mais fceis de usar que so alternativas
ao DOM padro com JDOM e DOM4J

29
XML: uma introduo prtica X100

Helder da Rocha
(helder@argonavis.com.br)

Atualizado em setembro de 2001 1


Apresentao do XML

!! Por que apresentar os dados?


!! Impresso
!! Web
!! Verificao
!! Edio
!! Solues
!! Cascading Style Sheets (CSS)
!! Document Style Semantics and Specification Language
(DSSSL)
!! eXtensible Stylesheet Language Transformations (XSLT):
transforma em qualquer coisa: PDF, SVG, XSL-FO, etc.

2
O que uma folha de estilos?

!! Conjunto de regras para formatar


!! um documento
!! vrios documentos
!! Comum em
!! processadores de texto (Word: .DOT)
!! DTP (Framemaker: .FOS, Ventura Pub: .STY)
!! Separa estrutura e contedo da apresentao
!! portabilidade maior
!! maior facilidade para gerar vises diferentes dos dados
!! facilita manuteno e promove reutilizao
!! Veja exemplos (HTML + CSS)

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

!! Em XML (inclusive XHTML)


!! Folha de estilos externa
!"#$%&'()*&+(,++)!)*-+./)+$)01((/!,2+3./45161((/!#7!
!! Em HTML (e tambm XHTML)
!! Folha de estilos externa (use dentro de ",+487)
"&9:;!2+&./()*&+(,++)/!)*-+./)+$)01((/!!
!!!!!!!!!!!!!!!!!!!!!!!,2+3./45161((/7!
!! Folha de estilos embutida (use dentro de ",+487)
!"()*&+7!!
! !-!<1=&=2>!2+8?!3=:)'(9@+>!AB-)C!!
!"0()*&+7!
!! CSS aplicado em elementos individuais
!"-!()*&+./1=&=2>!2+8?!3=:)'(9@+>!AB-)/7)+$)="0-7!

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

!! Identifica um ou mais elementos


!! Um elemento identificado por ID (xml:id ou id definido
pel DTD da aplicao SVG, XHTML, XSL-FO, HTML, etc.)
!! Um ou mais elementos determinados por
!! nome do elemento
!! atributos que contm
!! valores dos atributos
!! padres encontrados nos valores dos atributos (predicados)
!! contexto hierrquico
!! contexto de posio no documento
!! modificador (pseudo-classe)
!! atributo de classe (vale para SVG, HTML e XHTML)
!! Exemplo de seletores
!"#$!"#$#$%&!'()*#$+,-&%./*&0'1234567-4*$89:';('<$0:.+;=$

8
Seletores elementares

!! Os seletores mais simples so nomes de elementos


!! Definem estilo para todos os elementos
identificados com o mesmo nome
!"#"$%&!'(&%&)*!+%$,-!!
!!!!!!!!.&/"01#2,*!345"-6!
!5!'!",7"0#/8,/"*!9:;,<!=#<5&)">/"!6!!
"8?!%#?!$%!'!.&/"*!935"!1>/101,)#.6!!
">+%,!'!.&/"01#2,*!3@5"!6!!
!A!'.&/"01#2,*!3B5"6!CA!1,%,"&)!$/#D,)1>%AC!
!! Estilo aplicado herdado pelos elementos filho

9
Resoluo de conflitos

!! Ao importar folhas de estilo, definir novas regras,


pode haver conflitos de precedncia
!! Regras bsicas
!! Estilos mais especficos predominam: ser mais especfico
mais importante que chegar depois
!! Propriedades no sobrepostas so herdadas
!! Elementos filho herdam propriedades dos pais
!! exceto quando filhos definem suas propriedades (mesmo que
antes das dos pais): vale a regra do 'mais especfico'
!! Regra aplicada via * (seletor universal) considerada
mais especfica que uma regra herdada pela estrutura
!! O seletor mais especfico de todos o ID

10
Predicados

!! Usam valor do atributo para identificar elemento


!! Exemplos
!! !"#$!%&'"
" " " " " " " " "()*+*,-",&./"
!! !"#$!%&"0"12$2)2*3.!34!52$!1'" "()*+*,-",&./"
!! !"#$!%&"60"14!52$!1'" " " " "()*+*,-",&./"
!! !"#$!%&"70"12$2)2*31'""" " " "()*+*,-",&./"
!! !"#$!%&'#8,&9601%&:;2<&=)*%1'"" "()*+*,-",&./"
!! Podem ser aplicados no eletor universal
!! Exemplo: todos os elementos que tenham atributo name
com valor "coisa"
>#$!%&"0"1)*2;!1'""

11
IDs

!! Atributos especificados na DTD, ou no esquema,


ou por xml:id, como sendo do tipo ID
!! Podem ser referenciados diretamente usando o
identificador do elemento no documento
!! Sintaxe
!! !"!#!$%&'()!$%(*(+,)&-..
!! '()!$%(*(+,)&- (recomendada)
!! Exemplo:
!! /)(0.()12*-!)23.444./5)(03.
!! '*-!).6+&"&-7.8-!!$9..

12
Seleo por contexto hierrquico

!! Dois ou mais nomes correspondem a um seletor


!! Relao ancestral-descendente
!! !"#$%&'!()*$%#$"*$"&$)+#,(,'-)'$*.)
!! &!/($)&*0)1()/)+#,(,'-2$((,3.)
!! /,*2)4)567)+/,'*$'835*&9-):4;.)
!! Descendncia direta, do tipo pai-filho
!! $($6$"&,<4!5)=)$($6$"&,<>5(9,)+#,(,'-)'$*.)
!! &!/($)=)&')=)&*)+#,(,'-)/(1$.)
!! Outra forma (h pelo menos um elemento entre
ancestral e descendente):
!! !"#$%&'!()?)*$%#$"*$"&$)+#,(,'-)7'!2.)

13
Seleo por contexto de posio

!! Pode-se selecionar um elemento com base no seu


vizinho anterior usando-se o smbolo +.
!! O elemento vizinho anterior (preceding-sibling) um
elemento irmo
!! Exemplo:
!! !"#$%&'()*+),-.-$!'$/$0"-12"3"/4-536$7-
!! seleciona o elemento 8$!'$/$2"9-que est no mesmo
nvel de 8!"#$-&'()*+)9-e imediatamente aps o
mesmo.

14
Pseudo-classes

!! Pseudo-classes permitem selecionar elementos


marginais e acrescentar texto antes ou depois de um
elemento.
!! Uma pseudo-classe liga-se ao nome de um elemento
atravs de :
!! !"#$%"&!'()%*+,-(.*."#,/"0012,,
34,5$0!5,6"%70%".,8!+9,43,
!! 6#:0$."0,-(.1!01!#,;8+%<,(*5&&=>65"5/"5$.>9;2,
6#5$!0",-(.1!01!#,;83+%<9;2,
!! 5&&?1!.#$%"&!'()%*+#:0$."0,,
,,,,,,,,-(.1!01!#,;@&&?1!.&#,;A,$.1!#,:.*+2,
!! Em HTML, pseudo-classes alteram elemento <a>
!! 5#<%&%!0+B,5#*%1CB,5#5(!%<0B,5#).<0",,

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-+#+&#51+#'()*'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

!! Importa outra folha de estilos


!! Implementa a cascata
!! Regras podem ser herdadas ou sobrepostas
!! Regras mais especficas persistem
!! Exemplo: !"#$%&!'&()*(#!+'&!+"#$%&,
!! Aplicar estilo em "#$%:
,"#$%,-.#/#01,0)$2
afeta ' somente se ' j no tiver estilo definido
!! Exemplo
!! 345'#0(,6)7(4/#8.779:,
!! 345'#0(,6;(('1++<<<8)7(4/#78#0=+)7(4/#8.779:,

17
@font-face

!! Descreve uma fonte para uso na pgina


!! !"#$%&"'()*!""
""""#$%&'#()*+,-"./0(1&21.3""
""""415-"61+7.0&&8-994*&29#$%&4950(1&21.:"
";""
!"#$%&"'()*!""
"""#$%&'#()*+,-".<=*44">?@.3""
"""415-"61+74=*44>?@A8#1:3"9B"<=*44">?@"B9""
;""
!! "
&*&6+$""""!"#$%&'#()*+,-".<=*44">?@.C"4(%4'421*#";""
8(1(D1(#$"!"#$%&'#()*+,-"./0(1&21.C"421*#";""

18
@page e @media

!! !"#$% controla a aparncia de mdia paginada


!! !&%'(#)define estilos diferentes para mdias diferentes
!! Opes: all, aural, braille, embossed, handheld, print,
projection, screen, tty, tv
!"#$%&!'!()*&+!,-.)/!00)/1!!
!!!!!!!!2$3%)/+!0)/!4!!
!"#$%&!'!()*&+!50622!578221!!
!!!!!!!!2$3%)/+!5-.92!4!!
!"2&:)$!;$/:;&<:!'!
!!!"#$%&!'!
!!!!!!()*&+!056#=!056#=1!
!!!!!!2$3%)/+!.#=1!
!!!4!
!!!#!'>?/@A()*&+!,#@14!
4!

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)

Atualizado em setembro de 2001 1


XLink

!! Coleo de atributos, do namespace http://


www.w3.org/1999/xlink usado para oferecer
recursos de hipertexto a documentos XML
!! Tipos de links disponveis
!! links simples (como os que j existem em HTML)
!! links estendidos com capacidade de
!! apontar para vrios destinos ao mesmo tempo
!! ser destino e fonte ao mesmo tempo
!! ser vrtice de um grafo e controlar toda uma teia de
navegao
!! Combinado com XPointer e XPath pode apontar
para partes de um documento ou at caracteres
individuais.
2
XPointer

!! Funo e sintaxe para apontar para pedaos de um


documentos XML
!! XPointer usa a linguagem XPath para representar
elementos e conjuntos de elementos.
!! Possui funes para navegar no interior dos elementos e
apontar para caracteres individuais de texto
!! Pode selecionar uma faixa de valores, com base nas
coordenadas individuais
!! Pode ser ou no destino de um XLink
!! Aplicaes no s na Web
!! tambm em interfaces de processamento de texto!

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

!! Funo que recebe uma expresso XPath


!! Serve para apontar para um recurso ou parte do
documento
!! Para apontar para um recurso descoberto por uma
expresso XPath
!! xpointer(expresso)
!! Quado h campos marcados com ID no documento
destino, pode-se usar um ponteiro de referncia
!! !"#$%&'()'!"('**+#,-"#%&'$(#.
!! -"#%&'$(#.

6
XML: uma introduo prtica X100

Helder da Rocha
(helder@argonavis.com.br)

Atualizado em Jan 2003


O que um Esquema XML?
Documentos que aderem !! O esquema representa uma classe
especificao (vlidos)
!! Os documentos so instncias

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

! Simples mas no XML ! XML, porm mais complexo


! No suporta namespaces ! Suporta namespaces
! Limitado quando a tipos de dados ! Permite definio de tipos
3
W3C XML Schema

!! Padro para validao XML, modular, extensvel, com


amplo suporte a tipos de dados
!! DTD
!! foco na estrutura
!! poucos recursos para controle de tipos de dados
!! baseado em sintaxe SGML
!! no suporta namespaces
!! XML Schema
!! tudo so tipos de dados; grande controle sobre tipos
!! estruturas so tipos; tipos podem ser estendidos, criados e
redefinidos
!! no h suporte para entidades gerais
!! suporte completo a namespaces
4
Exemplo: design plano - objetos globais

<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

<!ATTLIST imagem href CDATA #REQUIRED >

<!ATTLIST astro id ID #REQUIRED >


<!ATTLIST astro nome CDATA #REQUIRED >
<!ATTLIST astro diametrokm NMTOKEN #IMPLIED >

Atributo sempre Tipos de dados simples


associado a elemento (somente para atributos)
6
Exemplo: design "boneca russa"
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="astro">
<xs:complexType>
<xs:sequence>
<xs:element name="imagem" minOccurs="0">
<xs:complexType>
<xs:attribute name="href" type="xs:anyURI"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required"/>
<xs:attribute name="nome" type="xs:string"/>
<xs:attribute name="diametrokm" type="xs:decimal"/>
</xs:complexType>
</xs:element>
</xs:schema>

Apenas um elemento (o elemento raiz) visvel


Tipos no podem ser reutilizados
Pode haver elementos de mesmo nome em contexto diferente
7
Fundamentos XML Schema: Tipos

!! H duas qualidades de tipos


!! Tipos simples representam tipos de dados bsicos
como texto, nmeros, tokens, booleanos
!! Fazem parte do namespace do XML Schema (requerem
prefixo associado ao identificador do namespace), por
exemplo: xs:int, xs:string
!! Tipos complexos representam estruturas do
documento como entidades, atributos, etc.
!! Podem fazer parte do namespace default do prprio
documento (e no necessitar de prefixo) se definidos
localmente

8
Fundamentos: Modelos de contedo

!! Definem a estrutura de tipos complexos


!! Modelos de contedo podem ser simples ou
complexos
!! So simples quando elemento vazio ou quando
contm apenas texto
!! Modelo de contedo simples pode conter atributos
!! So complexos quando elemento contm outros
elementos
!! Elementos podem ser definidos localmente
!! Elementos globais podem ser reutilizados

9
Raiz e namespace

!! Um documento XML Schema tem a seguinte


estrutura mnima
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema">
... definies de elementos, atributos, tipos
</xs:schema>
!! Para us-lo, a sub-rvore a ser validada (instncia)
deve ter a seguinte assinatura. Exemplo:
<sistemaEstelar
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="sistemaEstelar.xsd">
...

10
Namespaces

!! Schemas estimulam o uso de namespaces.


!! Os exemplos abaixo mostram uso com namespaces
!! Esquema principal
<xs:schema
targetNamespace="http://cosmos.org.br"
xmlns:cm="http://cosmos.org.br/com"
xmlns:st="http://cosmos.org.br/sat"
xmlns="http://cosmos.org.br"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

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

!! possvel gerar um esquema a partir de um DTD


!! Ferramentas criam elementos e atributos
!! Um esquema simples contm definies de
elementos de atributos
!! Elementos tpicos em um esquema simples
!! <schema> - elemento raiz
!! <element>
!! <attribute>
!! <simpleType> ou <complexType>
!! <simpleContent> ou <complexContent>
!! <restriction> ou <extension>
!! <enumeration>, <union>, <list>
!! <sequence>, <choice>, <all>
12
<element>

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

<xs:element name="cometa" type="cometaType" />


ou
<xs:element name="cometa">
<xs:complexType>
<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>
</xs:element>
13
<attribute>

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

!! Tipo que apenas pode conter texto


!! possvel criar novos tipos a partir de derivao dos
tipos existentes (globalmente acessveis)

<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

duration dateTime time date gYearMonth gYear gMonth gDay

base64binary hexbinary NOTATION double anyURI QName

float

string boolean decimal

normalizedString nonPositiveInteger integer nonNegativeInteger

token negativeInteger long positiveInteger

int unsignedLong
language Name NMTOKEN

short
NCName NMTOKENS unsignedInt
byte
ID IDREF ENTITY unsignedShort

IDREFS ENTITIES unsignedByte


16
<complexType>

!! Tipo que pode conter outros elementos ou atributos


<xs:complexType name="imagemType">
<xs:attribute name="href" type="xs:anyURI"/>
</xs:complexType>

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

!! Modelo de contedo simples


!! Determina o tipo dos dados contido em um
elemento que pode possuir atributos

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

!! Modelo de contedo complexo


!! Determina a organizao dos elementos filho (se
uma lista de opes, uma seqncia, etc.
<xs:complexType name="estrelaType">
<xs:complexContent>
<xs:extension base="astroType">
<xs:sequence>
<xs:element name="satelite"
type="sateliteType"
minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="cor" type="xs:token"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
19
<restriction> e <extension>

!! Permite restringir um tipo ou estend-lo


!! Podem tambm ser usados em modelos de contedo
complexos para derivar tipos de outros existentes
<xs:simpleType name="isbn">
<xs:restriction base="xs:NMTOKEN">
<xs:length value="10"/>
<xs:pattern value="[0-9]{9}[0-9X]"/>
</xs:restriction>
</xs:simpleType>

20
<sequence>

!! Permite definir uma seqncia de elementos


!! Equivalente ao modelo de contedo (a, b, c) no DTD

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

Equivalente, em DTD, a (centro, orbita*, cometa*)


21
<choice>

!! Permite escolher um elemento de um conjunto


!! Ou mais, caso maxOccurs seja "unbounded"
!! Equivalente ao modelo de contedo (a | b | c) no DTD
<xs:complexType name="orbitaType">
<xs:choice>
<xs:element name="estrela" type="estrelaType"/>
<xs:element name="planeta" type="sateliteType"/>
<xs:element name="asteroide" type="sateliteType"
minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
<xs:attribute name="raioMedUA" type="xs:decimal"/>
</xs:complexType>

Equivalente a (estrela | planeta | asteroide*)


22
<import>

!! Permite importar sub-esquemas


!! preciso definir o namespace usando xmlns no
elemento raiz
!! Namespace deve coincidir com namespace definido
nos sub-schemas
<xs:import
namespace="http://www.cosmos.org.br/satelites"
schemaLocation="satelites.xsd"/>
<xs:import
namespace="http://www.cosmos.org.br/cometas"
schemaLocation="cometas.xsd"/>

23
XML: uma introduo prtica X100

Helder da Rocha
(helder@argonavis.com.br)

Atualizado em outubro de 2005 1


O que XPath

!! XPath uma linguagem usada para localizar


informaes em um documento XML
!! Serve para navegar pelos ns e localizar dados
!! usada por vrias outras tecnologias do XML, como
XSLT, Xquery, Xpointer, XML Schema, bancos de dados e
linguagens que fazem mapeamento com XML
!! XPath opera sobre o XML processado
!! O arquivo-fonte usado pelo XPath no tem entidades (por
exemplo: &atilde;) ou blocos CDATA
!! O processador resolve todas as entidades antes do
processamento com XPath, e todas as entidades e sees
CDATA so convertidas em XML e texto

2
Exemplo de XPath

!! Uma expresso XPath um caminho na rvore-fonte


que resulta em um
!! valor (nmero, texto, booleano),
!! objeto (elemento, atributo, n de texto) ou
!! conjunto de objetos
! Caminhos absolutos
!"#$%&%#!'"#()*#+
33 ++!"#$%&%#!%,-,.#$,!'%)/#+
Severino Severovitch
++!"#$%&%#!%,-,.#$,!$01,2#!%,3%45+
bill@norte.com.br

celular ! Relativos ao contexto !"#$%&%#+:


11 ++'"#()*#+!"#$6!'"#()*#%$
9999 4321 ++%,-,.#$,!'%)/#+!"#$6!%,-,.#$,!'%)/#%$
++%,-,.#$,!$01,2#!%,3%45+

!! Expresses XPath so usadas dentro de atributos XML


!! Usadas em XSLT, XLink, XQuery e XPointer
3
Modelo de dados

!! XPath trata um documento XML como uma rvore


de ns (similar, mas no igual, rvore DOM)
!! DOM opera sobre o documento XML cru, e pode
representar entidades e blocos CDATA
!! Os ns usados pelo XPath podem ser de sete tipos
!! Raiz (s h um desses)
!! Elemento
!! Atributo
!! Texto
!! Namespace
!! Instruo de processamento
!! Comentrio

4
Tipos e valores

!! Cada n, ao ser processado, produz um valor que


tem um tipo
!! O contedo de um n processado pode ser
representado pelo contedo de texto do n
!! Todos os ns de texto que no estiverem em atributos
!! O valor do n pode conter um dos quatro* tipos de
contedo a seguir
!! uma estrutura de outros ns (node-set)
!! um escalar numrico (number)
!! um string (string)
!! um valor booleano (boolean)
* A abordagem de XPath neste curso est restrita a XPath 1.0; XPath 2.0
suportar muito mais tipos (todos os tipos do XML Schema).
5
Expresses XPath 1.0

!! Os tipos de expresso suportadas por XPath so


relacionados aos tipos de dados
!! operaes sobre ns da rvore-fonte (caminhos)
!! operaes sobre texto
!! operaes booleanas
!! operaes numricas
!! E cada tipo de expresso devolve um resultado que
pode ser um dos quatro tipos de dados
!! um conjunto de ns (node-set)
!! um texto (string)
!! um valor booleano (boolean)
!! um nmero (number)

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

!! Um caminho contm uma seqncia de passos


!! Cada passo pode ter trs partes
!! um eixo: descreve a direo a ser tomada, e se
representa um namespace, atributo ou elemento
!! ancestor, sibling, descendant, child, etc.
!! attribute, namespace
!! um teste: que seleciona um conjunto de ns
!! nome do n, tipo do n
!! um predicado opcional: que reduz o conjunto com base
em caractersticas dos ns
!! atributos, valores de atributos, posio
!! Sintaxe
!! !"#$!!%!&%!"'(!)"*+)$#$
8
Eixos
!! H treze eixos
!! 11 para navegar entre elementos
!! 1 para navegar por atributos
!! 1 para navegar por namespace
!! Eixos que representam elementos
!! ancestor, ancestor-or-self
!! child, self, parent
!! descendant, descendant-or-self
!! following, preceding
!! following-sibling, preceding-sibling
!! Eixo que representa um atributo
!! attribute
!! Eixo que representa um namespace
!! namespace
9
Atalhos

!! Pode-se usar smbolos em vez dos nomes de alguns


eixos mais comuns
!! !"#$"%!&%'()*(#"+,-- !!"
!! #"+,-- #"
!! .&*"%'-- ##"
!! &''*/01'"--2 $"
!! $3/+!-- (ausncia de eixo)
!! Ex:
!! %&'()**+'(&," a mesma coisa que +'(&, ou #!+'(&,"
(-.(+**/,).01!%&'()**+'(&,)
!! ).-%./)2/34,54-.(+**/.3," o mesmo que !!/.3,"
!! 2335'673.**')" o mesmo que $')"
!! 825./3**/,).01!+'(&," o mesmo que ##!+'(&,"
10
Testes (eixo::teste)

!! Um teste restringe os resultados de um eixo


!! !"#$%%&$'!()*
!! qualquer n (inclusive comentrios, ns de texto e
instrues de processamento)
!! !"#$%%+*
!! qualquer elemento, atributo ou namespace
!! Ex: ,--."/0-!%%+*(qualquer atributo)
!! !"#$%%nome
!! Onde nome o nome de um elemento, atributo ou
namespace
!! Ex: 12"3'%%-,/3!*(o elemento filho table)
!! Ex: 4!35%%-,/3!*(o elemento corrente table)
!! Ex: 6,.!&-%%-,/3!*(o elemento pai table)
11
Testes (2)

!! !"#$%%&!#&'()
!! 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*

* Se no forem usadas dentro de um documento XML, as expresses


podem ser escrita sem os escapes: a < b, a > b, a <= b, 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

!! Retornam valor booleano


!! !"#$"!%&'"()!"#$%&"#'(#$%")"
!! *+,"#',!)!"#$%&"#'(#$%")"
!! Retornam inteiro
!! !"$',-%./,-"()!"#$%")"

23
XML: uma introduo prtica X100

Helder da Rocha
(helder@argonavis.com.br)

Atualizado em maro de 2007 1


Fundamentos de transformao
! A transformao XSLT realizada sobre a rvore de um
documento-fonte
! A localizao dos ns feita com XPath
! Todos os ns do documento so acessveis
! Pode-se transformar qualquer documento-fonte XML em outro
tipo de documento
! HTML ou texto
! XML (qualquer formato)
! XSLT uma linguagem de programao completa
! Ou seja, complexa e no se aprende em um dia
! Este curso apresentar fundamentos* do XSLT e exemplos
! A transformao XSLT pode acontecer dinamicamente ao
carregar um documento XML com um XSL vinculado
! Pode tambm ser usada para gerar um arquivo independente
* Para uma abordagem mais profunda de XSLT, veja o curso e tutorial X300, que explora os
temas abordados aqui na prtica e em mais profundidade com carga-horria de 24 horas)
2
Alternativas para gerao de HTML ou SVG

! Gerao prvia no servidor

Servidor CSS Cliente

XML CSS HTML


Pgina
XSL

! Gerao durante carga no browser (limitado)

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

! Para fazer uma transformao permanente,


gerando um arquivo de resultados, pode-se usar um
processador XSLT como o Saxon, Xalan, libxslt
! xalan.apache.org
! saxon.sourceforge.net
! O Saxon ou Xalan pode ser embutido em projetos que
usam linguagens de programao para processar XML
Fonte XML
Processador Resultado
XSLT (XML, HTML, Texto)

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:,*

* Apple Store rejeita dylibs importados: preciso baixar os fontes e recompilar


9
Como rodar o processador
! Para este curso podemos processar XSLT de duas formas
! Atravs da ferramenta usada no curso (Eclipse, Oxygen, XML Spy, JEdit)
! Atravs de linha de comando (usando Saxon ou outro processador)
! Saxon 9: baixe em saxon.sourceforge.net (use saxon9he.jar)
! Voce deve ter um ambiente Java habilitado para execuo de aplicaes
em linha de comando
! Exemplo de uso
!"#"$$%&'$(")*+,-./!"0$+.1/(2/(")*+/30"+(2*04$%1$$$$$5$
$$ $%(62*+1./)47$%)(76.(187*/)(7$%*60.(971":*/-147$
! Para passar parmetros
$$!"#"$$%&'$(")*+,-./!"0$+.1/(2/(")*+/30"+(2*04$%1$$$$$5$
$$ $$$ $%(62*+1./)47$%)(76.(187*/)(7$%*60.(971":*/-147$$$5$
$ $$$$$'"0"4;<=#"7*0;=$$$$5$
$$$$$$$'"0"4><=#"7*0>=$$$$$

10
Hello World

! Suponha que seu documento-fonte contenha o


seguinte:
!"#$%&"'#()*+,-./01,2(
(((!%$)3#4(5"$6)*"+,789:;,2<)%(*#(="&#)$%!>%$)3#42(
(((!*#?6)&%2@"%(-"AB%!>*#?6)&%2(
!>"#$%&"'#2(
! Ns para seleo em XPath
! >"#$%&"'#>C)* ( ( ( ( ( (-./01(
! >"#$%&"'#>%$)3#4 ( ( ( ( (<)%(*#(="&#)$%(
! >"#$%&"'#>%$)3#4>C5"$6)*" ( (789:;(
! >"#$%&"'#>*#?6)&%( ( ( ( (@"%(-"AB%(

11
Uma regra de template

! O seguinte template poderia extrair seus dados


!"#$%&'()*%+'(!)+',-./+(012+3(/4!
!!!!"*45!+(012+3(!6(!*0(78#1!!
!!!!"#$%&3+%9(:17!$(%(,'./;86/!<4!6(,1%19!
!!!!6(!"#$%&3+%9(:17!$(%(,'./108=()/!<4!>$!!
!!!!"#$%&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!

12
O resultado

! O resultado ser
!"#$%!&'()*&+'!,'!#('-./)!!
!!!!01234!,'5)6)7!
!!!!,'!8.)!,'!9&*'.()!:;!!
!!!!<=>?!
!!!!@'*,)!5)A)!,';@.*)!)!&'()#)(@)!,'!!!!!
!!!!B&)!0&76)C"D#$!!

13
Caminhos vs. Padres

! Templates usam padres XPath (match) no lugar


de caminhos (select)
! Caminho:
!"##$%#&

!"#$%&'%#()%*)+,-$#.&(
! Padro:
!/*)01/*&2()$"&1%2)01,-$#.&( !"##$%& !"##$%& !"##$%&

'$("& '$("& '$("&

! Na rvore ao lado, se o n de 01.%'$& )*+,%'$& -"./,%'$&


contexto for 34&11#)15(
! o caminho devolver um conjunto vazio
! o padro devolver um conjunto de trs ns

14
Exemplos de padres/caminhos

! Atributos XSLT match, recebem padres para


instanciar templates:
! !"#$%&'()$*&'+!"#$%,-*.&/0-1+222+
! !"#$%&'()$*&'+!"#$%,-$340/55)*637*89:;-1+222+
! Atributos XSLT select e test, usados dentro dos
templates, recebem caminhos:
! !"#$%4*$.'</=+&'('$#,-225$340/5&3&.$/-+51+
! !"#$%=/0<'*>?+&'('$#,-@7.('0/-+1+222+
! !"#$%3=+#'&#,-7/&A&3&.$/B-1+222++

15
Cabealho e <xsl:stylesheet>

! Todos os elementos de uma folha de estilos so


definidos dentro de <xsl:stylesheet>
! O esqueleto bsico para uma folha de estilos

!"#$%&'()*+,-./012/&(-3,4+-5./6789:/";&
!"#$%#&'$(#)((&**
*****"+$,#%"#$-.)&&/%0011121324560788809:;0<5=,#>45+.**
*****?(5#@4,-.72A.B*

!0"#$%#&'$(#)((&B*

16
<xsl:template> e uma folha de estilos bsica

! Uma folha de estilos bsica possui um ou mais


templates
! Boa prtica ter um template para cada n que envolver
transformao: divide a complexidade
!"#$%&'()*+,-./012/&(-3,4+-5./6789:/";&
!#*%<*=>%(*?((=&#$%-*<#*%./?==@<AABBB1BC1,)5A0DDDAEFGA7)H-*I,)$/&
'()*+,-./012/;&

&&&&!#*%<=($@%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>

! <xsl:value-of> pode ser usado para gerar texto a


partir de dados do documento-fonte
! Converte todo o contedo para texto
! Expresso XPath relativa ao n corrente.
!"#$%&'()*%+'(!)+',-./,01'#'/2!
!!"#$%&'(%)*+,-!$*%*./01*%*2*3/,1!45!
"3#$%&'()*%+'(2!

! No exemplo acima, select seleciona qualquer n que


contenha o string contxt/elemento
! Use "." para valor de elemento corrente
! Use "/" para usar caminhos absolutos

21
Criao de texto com <xsl:text>

! <xsl:text> pode ser usado para gerar texto


esttico, formatar a sada, etc.
! Preserva espaos, novas-linhas e tabuaes
! til para controlar forma de impresso do texto

!"#$%&'()*%+'(!)+',-./#/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

! Vrias regras de template esto embutidas


! Pode-se re-declar-las localmente para mudar o
comportamento default
! 1. Processamento da raiz e todos os elementos
!"#$%&'()$*&'+(*&,-./012/3+
++++!"#$%*))$45&'()$*&'#23+
!2"#$%&'()$*&'3
! 2. Processamento de atributos e ns de texto+
+ +!"#$%&'()$*&'+(*&,-./&'"&67180/3+
++++ +!"#$%9*$:'5;<+#'$',&./=/23+
+ +!2"#$%&'()$*&'3
! 3. Processamento de texto
!"#$%&'()$*&'++
++++++(*&,-./)>;,'##?@A5?@#&>:,&?;@671,;(('@&67/23

23
<xsl:attribute>

! O elemento <xsl:attribute> permite criar atributos


na rvore-resultado
!"#$%&'()*%+'(!)+',-./%012/3!
!!!!"+3!
!!!!"#$%&'(()*+,(-!.'/-012)-314!
!!!!!!!!"#$%&4+%5(678!$(%(,'./9:(8/!;3!!!!!
!!!!"5#$%&'(()*+,(-4!
!!!!"#$%&4+%5(678!$(%(,'./</!;3!
!!!!";+3!
!!";#$%&'()*%+'(3!
! Resultado
"+!-:(8./<<<!,71'(=>7!>(!9:(8!<<</3!!
!!!!!!!!!<<<!,71'(=>7!>(!%012!<<<!";+3!

24
Attribute value templates

! Em vez de usar <xsl:attribute> para criar os


atributos dinmicamente, possvel usar uma
sintaxe especial
! !"#$%"&&'()*
! Sintaxe chamada de atrribute value templates
! As chaves consideram o valor da expresso resolvida
! usada dentro de atributos
*+#&,-."/$,0."*/0.1234,56748*
****+0*2%"934!:%"9"48*
****+#&,-;0,<"=(9*&","1.34>4*?8+?08*
**+?#&,-."/$,0."8*

25
<xsl:element>

! Assim como possvel criar atributos, possvel criar


elementos, usando <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"#$%&''$()*+,'$&*+#-.

! Para ordenar nmeros use o atributo 5&*&)


*('+23=:,>+03.(default ordem alfabetica)

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>

! H dois tipos de blocos condicionais em XSLT


!"#$%&'(!"#!$%"&'("##)*%+,!)"#$%&'*(

!"#$%+,--#.*-
---.&#/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#"+-
!)"#$%+,--#.*(

! <xsl:if> processa o contedo se a expresso resultar true()


! <xsl:choose> um bloco do tipo case ou if-elseif-else

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

. .!"#$%/*72$+/*.7+/,-01!"#$%14. Node-set com ns correntes


.... .&'(!)*%$+,-./0(,!,.123.-4"15!%36.
........ .!"#$%8+$9*)'&.#*$*,/014%("1"%7891.64. Posio do n
........ .!"#$%/*"/45.!6"#$%/*"/4. corrente dentro
........ .!"#$%8+$9*)'&.#*$*,/011"15!%1.64. da lista de ns
correntes
0000 0&:'(!)*%$+,-./6. N dentro do
. .!6"#$%/*72$+/*4. contexto do n
corrente 35
<xsl:for-each> e <xsl:sort>
! <xsl:sort> pode ser usado dentro de <xsl:for-each> para
ordenar os elementos de acordo com um campo
! O atributo select uma expresso que retorna o valor associado ao n
corrente que ser usado como critrio de ordenao
! !"#$%&'()$*&'+(*&,-./!"#!$%/0+ N de contexto
++++!"#$%1234'*,-+#'$',&./&''(")*/0+ Ns correntes
++++++++,-'./'*0)+'%.%$)123#%4%52+67+
++++++++!"#$%5*$6'421+#'$',&./3#%4%5/+70+ indice
++++++++!"#$%&'"&0%+!7"#$%&'"&0+
++++++++!"#$%5*$6'421+#'$',&./8/+70+
++++!7"#$%1234'*,-0+ assunto assunto
!7"#$%&'()$*&'0+

! Pode haver mais de um <xsl:sort>, @dewey @dewey


com outro select, para ordenar
texto texto
por outros campos associados ao
n corrente
String usado 005.133 920.4
na ordenao
36
Variveis <xsl:variable>
! Podem ser
! Locais: definidas dentro do escopo de uma uma regra de template,
bloco <xsl:for-each>, etc.
! Globais: definidas no primeiro nvel, como filhas de
<xsl:stylesheet>
! Uma vez que tenham valor, tornam-se constantes
! Podem conter qualquer tipo (node-set, string, boolean ou number)
! Para definir
!"#$%&'()'*$+,-'.+/0!"#01$%#&'(!"!2"#$%&'()'*$+1,
!"#$%&'()'*$+,-'.+/0)%*(0,#+$+34/0)%*(+,-0,21,
! Para usar
!"#$%&'$5+678,#+$+34/0.)%*(0,21,
!',9(+8/0/.!"#00,1!2'1,

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!

! A soluo realizar operaes dentro de <xsl:variable> que produzam o


valor final em um <xsl:value-of>. Por exemplo:
!"#$%&'()'*$+,-'.+/0.+-#'1+.03!
!!!!"#$%&'(!)*$)+,-#.%&%/01234)35,6!
!!!!!!!!"#$%&8/%9*:;(!$*%*<)+,7.*0$/1*0$74;=)919*$,76!
!!!!"7#$%&'(6!
!!!!"#$%&'(!)*$)+,-#.%&%/0123*035,6!
!!!!!!!!"#$%&8/%9*:;(!$*%*<)+,7.*0$/1*0$7'01%*$,76!
!!!!"7#$%&'(6!
!2"#$%&'()'*$+3,
39
Exemplos com <xsl:variable>

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

! Templates podem ser usados como subrotinas!


! Ao definir um <xsl:template>, em vez do atributo match,
use o atributo name:
!"#$%&'()$*&'+!"#$%&'()#"*")&,+
---+.'/.*#+)*.*+01.(*&*.+
!2"#$%&'()$*&',
! Templates sem match no so chamados automaticamente
durante o processamento de ns
! Templates com name podem ser chamados de dentro de
outros templates, de definies de variveis, etc.
! O valor retornado pelo template substitui a chamada
! Use <xsl:call-template> para realizar a chamada
de templates pelo nome
! !"#$%+",,-*$#.,"*$/3*('45'()#"*")5+2,+
41
Parmetros <xsl:param>
! Parmetros so quase o mesmo que variveis
!!"#$%&'&("#$%&'(#)%&*("+&,&-.'(&/01(2"
!!"#$%&'&("#$%&'(#)%&3(2444!5/+,60$1$%2"
444"
!/+,67$,8&9):"+&,&-.'(;#)%&*("52"
!$"#$%&'(<=;#)%&3>(2!5$2"
! So semelhantes a variveis, mas diferem um pouco:
! <xsl:variable> recebe o valor (resultante da expresso XPath) como
constante (no aceita outro valor); o select ausente (e elemento vazio)
equivale a um string vazio.
! O select de <xsl:param> opcional pois pode ser atribudo atravs de
chamadas <xsl:call-template> e <xsl:with-param> ou, se for
global, atravs de parmetros passados externamente.

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>

! Define um ndice com trs atributos


! Sintaxe
!"#$%&'()*+,'-.*/,'.),+012-.3+456/.)7#'-.'"35.8)
! name: nome do ndice
! match expresso XPath que descreve os ns a serem
indexados
! use expresso XPath que define a propriedade usada para
criar o ndice.
! Exemplos
! !"#$%&'()*+,'-.3$+*'0+#.),+012-.3$+*'0+.)))
)))))) )7#'-.!"#$%.)98)
! !"#$%&'()*+,'-.+#05/#.))
)))))) ),+012-.3$+*'0+:+#0'5/;4':#+0'$;0'.))
)))))) )7#'-.!&'($%)*#+$.)98)
50
Acesso a chave unvoca: key()
! Funo XSLT que referencia uma relao definida com um
elemento <xsl:key>
! Sintaxe:
!"#$!"#$%&'%()'*$+,-!&-($%&
! Exemplo. Se houver um
./0123$4,!'#$5671'!$8'06,#'8()5671'!$8'6,,
, ,,,,,90$56:!"#$6,;<,
a chamada
3$4=>71'!$8'0>+,>?97-8$@>A,,
retorna um node-set que contm todos os elementos
<planeta> do documento que tenha um atributo nome igual
a Jupiter

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$!;"*+,&()
!;"#$#%&'&()

! Este resultado esperado. Como fazer?


!IJ<%)65+,.&8/0EK40)58"&-.8'/0LMNOP0I()
!-%()
))))!-$(1#6#!;-$()
)))) )!--(1234Q)78$5+9+.,5)1#6#):5#8,!;--()
))))!-$(G5A!;-$()
)))) )!--(GH44Q)1#6#@"+.9$!;--()
))))!-$(=>?!;-$()
)))) )!--(=EF4Q)=>?)@"D5<#!;--()
)))) )!--(=244Q)@"#%#A%5)B5"$&+)C+#9D.",!;--()
!;-%()

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

3. IDs gerados do mesmo n so sempre idnticos. A expresso compara o


n corrente (.) com o primeiro item do grupo, logo a lista de ns
correntes do <xsl:for-each> inclui apenas um item de cada grupo
4. Em um segundo <xsl:for-each> aninhado selecione cada item da
chave ( um node-set) que pertena ao grupo:
!!!!8&966()*+&6:!/01237!

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)

Atualizado em setembro de 2001 1


XSL Formatting Objects

!! Aplicao XML para descrever o layout preciso de


texto e imagens em uma pgina
!! Elementos representam
!! Regras para formatao de vrias pginas
!! Layout de pginas individuais, margens, rodaps
!! Hifenao, alinhamento, fontes, cores, leading
!! Imagens, grficos, tabelas, listas, links
!! Isoladamente, XSL-FO no folha de estilo
!! formato final, com estrutura que visa a apresentao
(como XHTML) linguagem de descrio de pgina
(como PDF ou PostScript)
!! Tpicamente, se cria um XSLT que gera FO a partir de
uma fonte XML
2
Hello World
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
Este o "<head>"
do XSL-FO
<fo:layout-master-set>
<fo:simple-page-master master-name="p1">
<fo:region-body/>
</fo:simple-page-master> Ligao entre as
regras de layout e
</fo:layout-master-set> o contedo afetado

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

!! Raiz do documento XSL-FO


!! Define o namespace
!! !""#$%%&&&'&(')*+%,---%./0%1)*23"4
!! Uso tpico
!"#$%##&''
()*+,$"#-./&&0$112223243#%516777189:1;#%)<&.='
333'
!1"#$%##&='
!! Normalmente, documentos FO so gerados com XSLT
!(,*$&>)0*<&>')<&?/-.1.='
444456)$*))"44
444447289:$6);<!""#$%%&&&'&(')*+%,---%./0%1)*23"<='
''''!(,*$<00*@A&>)0*<&>,'1='
44445%6)$*))"=4
!1(,*$&>)0*<&>='

4
Estrutura do documento

!! O elemento <root> deve conter:


!! 1) Um <layout-master-set>
!! contm "mestres de layout": templates reutilizveis para
layout de pginas
!! cada mestre possui um identificador que usado para
associ-lo a um bloco de contedo
!! o tipo de mestre mais simples <simple-page-master>
!! 2) Pelo menos um <page-sequence>
!! onde fica o contedo
!! define uma seqncia de pginas em um documento
!! cada <page-sequence> deve estar associado a um
mestre de layout existente
!! contm objetos <flow> e/ou <static-content>
5
Cabealho
!! Cabealho mnimo
!"#$%&'($)*+,'-*./+-.*0!
!!!"#$%&'()*+,)-.+,(-&/+0!(-&/+0,1-(+23)435!
!!!!!!!!!"#$%0+.'$1,6$7895!
!!!!!"9#$%&'()*+,)-.+,(-&/+05!
!!!"1#$%&'($)*+,'-*./+-.*0!
!! <simple-page-master> define margens, altura e
largura da pgina e contm pelo menos uma regio
!! master-name do elemento ID para que elementos de
contedo <page-sequence> possam referenci-lo
!!"#$%-2,3&.+3'4.+,'-*./!(-&/+0,1-(+23)43!
!!!!!!!!!!!!!,'/425+*$36789:;,7!!,'/425+<$**$,67=;,7!
!!!!!!!!!!!!!,'/425+&.#*67=9:;,7!,'/425+/24>*6789:;,7!
!!!!!!!!!!!!!3'4.+?2@*>67=8;,7!!!3'4.+>.24>*67=A9B;,70!
!!!!!999!/.42C.-!'#.*'@'-!999!
!!"1#$%-2,3&.+3'4.+,'-*./0!
6
Cinco regies

!! !"#$%&'()&*+,-.,
!! 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"$%'(-&=+

!"#$%&'()#*&"#+34+ !! Margens do <simple-page-master>


limitam a rea de impresso
!! <region-body> ocupa todo o espao
restante
!! Outras regies opcionais podem ser
!"#$%&'(>-8"-+34+

!"#$%&'(#'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

!! Os elementos <flow> e <static-content> devem


conter elementos de bloco
!! <block> Bloco de propsito geral
!! <list-block> Bloco que contm itens de lista
!! <table> Bloco que contm tabela
!! Blocos podem ter contedo misto, contendo texto e
elementos
!! <inline> Trecho de propsito geral
!! <external-graphic> Imagem ou grfico externo
!! <page-number> Nmero de pgina
!! <basic-link> Referncia de hipertexto
!! <instream-foreign-object> XML embutido (ex: SVG)
!! <leader> Linhas e outros decoradores
12
Propriedades
!! Propriedades de estilo podem ser aplicadas em <flow>,
<static-content> e em quaisquer elementos descendentes
!! Propriedades so atributos XML
!! Maior parte das propriedades so iguais e tm mesma sintaxe
que as propriedades do CSS
!!"#$%&#'()"#*+,"-./&012+-3#.-4)5-*5,567/"2)))))))))))
) ) )))"#*+,5/86129:;+2))
)))))))))'#&#7127<%=:>>4)?>4)?>@2)
))))))))).-7</*,+#;129'.2))
)))))))))"#*+,A6/<3+12%#&B2))
)))))))))+6C+,-&/<*12'6*+672D"#$!!"#$/*&/*6)
'#&#712%&E62D%&'($!F"#$/*&/*6D))*!+*,+-!!F"#$%&#'(D)
!! Relao com CSS
!! Algumas propriedades CSS so elementos em XSL-FO
!! Alguns seletores CSS so atributos em XSL-FO

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">
&#x2022;
</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>

!! Permite incluir uma imagem na pgina


!! Objeto inline
!! !"#$%&#'()*
****!"#$+,-+./0&12.0345'*6.'789#+:25"8;)*
!;"#$%&#'()**
!! !"#$%&#'()*
****!"#$+,-+./0&12.0345'**
************6.'784--3$;;<<<:,:'#9;9#+:25"8;)*
!;"#$%&#'()*

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>

!! Permite embutir outra linguagem XML na pgina


!"#$%&'()*+,-.#$*+&/'.$01+2)3!
!!!"(4/%(4/!!
!!!!!!!5-6'(%(4/789)):%;;<<<=<>=$*/;?@@@;(4/8!!
!!!!!!!<&A)978>@@8!9+&/9)78>@@8!!
!!!!!!!4&+<0$578@!@!>@@!>@@83!
!!!!!!!"(4/%2&*26+!()B6+78#&66%!/*++'8!!
!!!!!!!!!!!!!!!!!!!*78C@8!2578DC@8!2B78DC@8!;3!!
!!!";(4/%(4/3!
";#$%&'()*+,-.#$*+&/'.$01+2)3!

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