XML

uma introdução prática
Helder da Rocha
© 2000, 2001, 2003, 2005, 2007 Helder da Rocha

1

Objetivos
!! Oferecer uma introdução geral sobre a tecnologia
XML, com conceitos teóricos e experimentação
prática, abrangendo fundamentos e principais
aplicações

2

Agenda
!! Dia 1
!! 1. Introdução a XML e tecnologias relacionadas
!! 2. Fundamentos de estrutura e sintaxe
!! 3. Especificação de aplicações com DTD

!! Dia 2
!!
!!
!!
!!

4. Programação com DOM e SAX (fundamentos*)
5. Visualização de documentos XML usando CSS
6. Referências e navegação com XLink e XPointer
7. Especificação de aplicações com XML Schema (fundamentos*)

!! Dia 3

!! 8. Localização e extração de dados com XPath
!! 9. Transformação de XML com XSLT (fundamentos*)
!! 10. Layout de página e gráficos com XSL-FO e SVG (fundamentos*)
* tópicos complexos que são abordados de forma introdutória neste curso
(eles são explorados em maior profundidade em outros cursos)

3

Formato
!! Apresentação em slides
!! Demonstrações
!! Exercícios

!! Realizados em sala de aula
!! Propostos para realização fora do horário de aula

4

Material
!! Slides (disponíveis no site)
!! Apostila (tópicos selecionados e guia de referência)
!! Código de exemplos usados nas demonstrações
!! Código de aplicações
!! Atualizações (slides e documentos anexos)
!! Especificações oficiais
!! Ferramentas abertas
!! Material de referência

5

Sobre material avulso e alterações
!! O material didático distribuído refere-se ao roteiro usado como
referência para a maior parte dos cursos
!! Em cursos personalizados, alguns tópicos poderão não ser
abordados, e material avulso de outros cursos poderá ser usado
!! Mesmo em cursos normais, material avulso poderá ser
introduzido como atualização
!! A maior parte dos cursos de tecnologia envolvem assuntos que mudam
com freqüência
!! Melhoramentos na apresentação e didática às vezes são introduzidos
antes e uma reforma geral do material

!! Durante o curso o instrutor também poderá trocar a ordem de
apresentação de assuntos, aprofundar um assunto ou mesmo
tratar superficialmente outro assunto, caso isto traga benefícios
ao curso de uma forma geral
6

Sobre ferramentas usadas no curso
!! As ferramentas e aplicações usadas em sala tem acima de tudo
um objetivo didático
!! Podem não ser as melhores ferramentas em termos de produtividade e
uso profissional

!! Algumas ferramentas usadas em aula foram adaptadas para
explorar os exemplos e exercícios apresentados
!! As ferramentas podem não estar mais disponíveis na Web ou estarem
em versões mais novas e possivelmente incompatíveis
!! Geralmente uma pasta com todo o código usado nessas ferramentas
será distribuída com o material didático (depende do curso) – use a
versão fornecida (a menos que o instrutor indique outra alternativa)
!! É possível que algumas ferramentas só funcionem em determinadas
plataformas (Windows, Mac, Java)

7

Ferramentas úteis para este curso
!! Para programação
!! 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 edição (de XML genérico)
!! 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 "satélite". Contém últimas especificações 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/. Contém 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. O’Reilly & Associates, 2001. Explora XSLT com aplicações

práticas em Java.
[6] Elliotte

Rusty Harold. XML Bible, Second Edition, 2001. Aborda todas as

principais tecnologias W3C. 5 capítulos em http://cafeconleche.org/books/bible2/
[7] Erik

T. Ray. Learning XML. O’Reilly & Associates, 2001. Introdução ao XML e

DTD, XSLT, XLink e XPointer (os dois últimos baseados em especificações draft).

9

Importante
!! Tente fazer os exercícios; se não entender, pergunte!
!! Explore os exemplos e exercícios em aplicações reais
(não se limite a ver um exemplo didático funcionar)
!! Tente fazer os exercícios; se não entender, pergunte!
helder.darocha@gmail.com
www.argonavis.com.br

10

Introdução a XML

X100

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

Atualizado em setembro de 2001

1

O que é XML?
!! eXtensible Markup Language: padrão W3C
!! Uma maneira de representar informação
!! não é uma linguagem específica
!! não define vocabulário de comando
!! não define gramática, apenas regras mínimas de estrutura

!! Exemplo: documento XML

usuario_33.xml

<contato codigo="33">
<nome>Severino Severovitch</nome>
<email>bill@norte.com.br</email>
<telefone tipo="celular">
<area>11</area>
<numero>9999 4321</numero>
</telefone>
</contato>

elemento
atributo
"nó" de texto

2

XML versus HTML
HTML mostra
como
apresentar

<h1>Severino Severovitch</h1>
<h2>bill@norte.com.br</h2>
<p>
<b>11</b>
<i>9999 4321</i>
</p>

XML mostra
o que
significa

<nome>Severino Severovitch</nome>
<email>bill@norte.com.br</email>
<telefone>
<ddd>11</ddd>
<numero>9999 4321</numero>
</telefone>

3

Anatomia de um documento XML
!! Documentos XML são documentos de texto Unicode
!! É uma hierarquia de elementos a partir de uma raiz
!! Menor documento tem um elemento (vazio ou não):
<nome> !"#"$%&' !"#"$'#%( </nome>

!! Menor documento contendo elemento vazio
<nome></nome>

=

Elemento raiz

<nome/>

!! Menor documento contendo elemento e conteúdo texto
<nome> !"#"$%&' !"#"$'#%( </nome>
Etiqueta
inicial

Conteúdo do
Elemento

Etiqueta
final

4

XML Namespaces
!! Estabelecem um contexto para elementos e atributos
!! É formalmente declarado através de um identificador (um string, geralmente
uma URI) através de atributo reservado do XML: xmlns

!! Podem ser associados a um prefixo para qualificar elementos e atributos
!! Quando o prefixo não é 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 não há conflito
porque pertencem a namespaces diferentes (um deles não tem namespace)

5

Documentos XML bem formados
!! Para que possa ser manipulado como uma árvore,
um documento XML precisa ser bem formado
!! Documentos que não são bem formados não são
documentos XML – use um editor XML para descobrir

!! Documentos bem-formados obedecem as regras de
construção de documentos XML genéricos
!! Regras incluem
!! Ter um, e apenas um, elemento raiz
!! Valores dos atributos estarem entre aspas ou apóstrofes
!! Atributos não se repetirem
!! Todos os elementos terem etiqueta de fechamento
!! Elementos estarem corretamente aninhados
6

Exemplos de algumas regras
!! (1) Elementos não devem se sobrepor
!! Não pode

!"#!$#!%"#!%$#&

!! (2) Atributos têm que ter valores entre aspas
!! Não pode
!! Deve ser

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

!! (3) Nomes de elementos são case-sensitive
!! Não pode

!"#111!%2#&

!! (4) Todos os elementos têm marcadores de
abertura e de fechamento
!! Não pode
!! Deve ser

!$(#3!$(#&
!$(%#3!$(%#&
ou
!$(#!%$(#3!$(#!%$(#&
7

XML válido
!! Um XML bem construído pode não ser válido em
determinada aplicação
!! Aplicação típica pode esperar que
!! elementos façam parte de um vocabulário limitado,
!! certos atributos tenham valores e tipos definidos,
!! elementos sejam organizados de acordo com uma
determinada estrutura hierárquica, etc.

!! É preciso especificar a linguagem!
!! Esquema: modelo que descreve todos os elementos,
atributos, entidades, suas relações e tipos de dados

!! Um documento é considerado válido em relação a
um esquema se obedecer todas as suas regras
8

Esquema
Documentos que aderem à
especificação (válidos)

!! O esquema representa uma classe
!! Os documentos são instâncias

Esquema (universo de
documentos válidos)
Documento
fora da
especificação

!! Como definir esquemas:
!! DTD - Document Type Definition
!! W3C XML Schema

9

DTD vs. XML Schema
!! Um esquema é essencial para que haja
comunicação usando XML
!! Pode ser estabelecido "informalmente" (via software)
!! Uso formal permite validação usando ferramentas
genéricas de manipulação de XML

!! Soluções padrão do W3C
DTD
!"#$#%#&'()*+,-,*((
((((((((((.+*/01(0/-231(,0304*+056(
!"7''$89'()*+,-,*(
(((((((((()*:2;*(&%'<=#&(>?#@A8?#B6(

•! Simples mas não é XML
•! Não suporta namespaces
•! Limitado quando a tipos de dados

XML Schema
!CD:ED)F0/-((
(((((C/3+DECD:GHIIIJK%$9)F0/-H6(
(!CD:E030/0+,(+-/0GH)*+,-,*H6(
((!CD:E)*/L30C'ML06(
(((!CD:E-,,N2OP,0(+-/0GH)*:2;*H((((((((
(
((((((((((((((((((PD0GHN0QP2N0:H6(

•! É XML, porém mais complexo
•! Suporta namespaces
•! Permite definição de tipos

10

Por que usar XML para compartilhar dados?
!! Porque é um padrão aberto
!! Facilidade para converter para formatos proprietários

!! Porque é texto
!! Fácil de ler, fácil de processar, menos incompatibilidades

!! Porque promove a separação entre estrutura,
conteúdo e apresentação
!! Facilita geração de dados para visualização dinâmica
!! Evita repetição de informação / simplifica manutenção

!! Porque permite semântica na Web
!! Elementos HTML não carregam significado, apenas dicas
de formatação: 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
Severino Severovitch
bill@norte.com.br
celular
11
9999 4321

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

12

Visualização em um browser
!! Folha de estilo: conjunto de regras para formatar ou
transformar as informações de um documento XML
!! CSS - Cascading Style Sheets
!! Transformação visando apresentação visual
!! Aplicação do estilo em tempo de execução no cliente

!! XSLT - eXtensible Stylesheet Language
!! Transformação em texto, HTML ou outro formato
!! Aplicação em tempo real ou prévia (no servidor)

!! Se não estiver associado a uma folha de estilo, o
documento XML não tem uma "aparência" definida
!! Vários browsers por default mostram a árvore-fonte XML
!! Outros mostram apenas os nós de texto sem formatação
13

Formas de processamento XML
!! Via APIs de programação
!! SAX – Simple API for XML: leitura seqüencial, ideal para
extração de dados
!! DOM – Document Object Model: leitura completa, ideal
para manipulação (inserção, reordenação, alteração,
remoção de nós)

!! Via linguagens de processamento (suportadas por
parsers e processadores padronizados pela W3C)

!! XSLT, XPath, XLink, XPointer e XQuery: extração,
transformação e localização de dados
!! XSL-FO, XHTML, SVG: apresentação de dados
14

Processamento XML
texto

XML para
SGBD
e vice-versa

"custom"
XML

!"#$%&
!"#$%&

<xml>
<xml>
<xml>

Web

VRML

PDF
PDF
PDF

DOM
SAX

SGBD

WML
VoiceXML

Gráficos SVG
Imagens
JPG e PNG

HTML
CSS
JavaScript

RTF
TeX
SGML
PDF e
PostScript

2000 2001

15

XPath
!! Linguagem usada para navegar na árvore XML
!! Uma expressão XPath é um caminho na árvore que resulta
em um valor (número, 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
11
9999 4321

•! Relativos ao contexto !"#$%&%#+:
++'"#()*#+!"#$6!'"#()*#%$
++%,-,.#$,!'%)/#+!"#$6!%,-,.#$,!'%)/#%$
++%,-,.#$,!$01,2#!%,3%45+

!! Expressões XPath são usadas dentro de atributos XML
!! Usadas em XSLT, XLink, XQuery e XPointer

16

XLink, XPointer e XQuery
!! XLink: especificação W3C que define vínculos (de diversos
tipos) entre documentos XML
!! Funcionalidade mínima é igual ao <a href> do HTML
!! É uma coleção de atributos, com namespace próprio, que podem ser
usados em elementos de qualquer linguagem XML.

!! XPointer: aponta para partes de documentos XML
!! Identificador no destino, acessível por XLink: !"#$%&'()*+,-#.)$/,0
!! Caminho resultante de expressão XPath: !12#$/)(34"#5(24#.60

!! XQuery: linguagem para pesquisar documentos XML através 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
!! Aplicação de XML para transformação e apresentação de dados
disponíveis em XML

!! Não existe mais como uma especificação. Foi dividida em duas
!! XSLT – foca em transformação de dados. XSLT é uma linguagem
funcional para processamento de templates
!! XSL-FO – linguagem de descrição de página (como PDF, HTML+CSS)

!! Cada especificação define um namespace próprio

!! XSLT usa o identificador !""#$%%&&&'&(')*+%,---%./0%1*2345)*67
!! XSL-FO usa !""#$%%&&&'&(')*+%,---%./0%8)*62"7

!! Importante: as URLs acima são usadas como identificadores
de namespace, e não representam nenhum endereço Web
!! É muito comum usar URLs como identificadores de namespace
!! Todas as aplicações XML do W3C usam URLs da forma:
77!""#$%%&&&'&(')*+%!"#$%&'%()*"("$+%!,'(#$-$.*"+/

18

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="livro/titulo">
<td><xsl:value-of select="." /></td>

XSLT

!! XSL Transformations (XSLT)
!! Linguagem (XML) para criação de documentos que
contêm regras de transformação para documentos XML
!! Documentos escritos em XSLT são chamados de folhas
de estilo (mas são na verdade templates) e contêm
!! Elementos XSLT: !"#$%&'"#(, !)*(, !*+,-#'./(, ...
!! Expressões XPath para localizar nós da árvore-fonte
!! Texto ou XML a ser gerado no documento-resultado

!! Usa-se um processador XSLT
fonteToHtml.xslt
Folha de
estilos

fonte.xml
Documento
Fonte

Processador XSLT
Xalan, TrAX, Saxon
Firefox, I. Explorer, etc.

Documento
Resultado

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 representação 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)

documento
resultado
(em preto)

!"#$%&'()$*&'+(*&,-./*'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+
elementos XSLT
(em vermelho, com prefixo xsl)

!! Elementos XSLT são 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)
!! Após a transformação, 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">
<fo:region-body/>

XSL-FO

!! XSL Formatting Objects
!! Linguagem XML de descrição de página com os mesmos
recursos que PostScript ou PDF
!! Descreve o layout preciso de texto e imagens
!! Possui centenas de elementos, atributos e propriedades (que
são semelhantes às propriedades do CSS)
!! Páginas são facilmente convertidas para PDF e PostScript
!! Ideal para gerar documentos para impressão (livros, etc.)

!! Normalmente gerada via XSLT
XML

XSLT
XML

Fonte

XML

Processador
XSLT

Documento
XSLFO

FOP

Documento
PDF

23

XSL-FO: menor documento
!"#$%##&'!"#$%&'()*+,,-&..///0/10(23.4555.678.9(2":,*('
Este é o "<head>"
do XSL-FO

'''!"#$)*+#,&-.*/&0%-/0&('
'''''''!"#$/1.2)0-2*30-.*/&0%'.*/&0%-4*.056276('
'''''''''''!"#$%031#4-8#9+:('
Ligação entre as
'''''''!:"#$/1.2)0-2*30-.*/&0%('
regras de layout e
!!!":"#$)*+#,&-.*/&0%-/0&('
o conteúdo 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>Página XHTML</title></head>
<body>
<h1>Página XHTML</h1>

XHTML

!! eXtensible HTML
!! Linguagem XML de descrição de página Web
!! Mesmos elementos do HTML 4.0 Strict
!! Elementos descrevem somente a estrutura dos
componentes da página. A forma precisa ser especificada

usando CSS: não há elementos/atributos para mudar
cor, alinhamento, etc.
!! Pode ser misturada (estendida) com outras linguagens XML
(MathML, SVG, linguagens proprietárias)

!! Normalmente gerada via XSLT
XML

XSLT
XML

Documento
Fonte

XML

Processador XSLT

Documento
XHTML

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"
height="2.5cm" width="1.5cm" />

SVG

!! Scalable Vector Graphics (padrão W3C)
!!
!!
!!
!!
!!

Gráficos vetoriais em XML
Plug-ins para principais browsers: concorre com Flash
Suporta animações, links, JavaScript, CSS
Produzido por ferramentas como Adobe Ilustrator
Pode ser embutido no código 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%%
CSS
%%%%!/'8/51%")@51+,A'55B%81(,%%
%%%%%%%%%%%%/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,%%
%%%%%%%%%%%%/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%%

XLink

27

Outras aplicações populares do XML
TEI

MathML

DocBook

Classe
oper(): void
oper2(): int

1

*

Classe2
oper(): void
oper2(): int

XMI
WML
VoiceXML

Classe3
oper(): void
oper2(): int

Web Services

SOAP
WSDL
UDDI

XML-RPC

CML
ebXML
28

Demonstração
!! Exemplo de transformação XML

PDF

<xslt>
FO

FOP

(1)

<xml>

(1.b)

Saxon
<xslt>
Texto

<xsl:fo>

(1.a)

(3)

<xslt>
SVG

JFOR

(4)
(2)

Texto texto
texto texto
texto texto
texto texto
texto

<xslt>
HTML

HTML

2000 2001

SVG

29

Conclusões
!! XML é uma ótima solução para compartilhar dados
!! Para implementar soluções em gestão de
informações usando XML, pode-se usar
!! DTD ou XSchema para especificar o modelo de dados e
validar as informações
!! 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 vínculos lógicos entre os
documentos e localizar seus componentes
!! XSL-FO ou XHTML para formatar os dados para impressão
ou visualização na tela (PDF, Word ou Web)
!! SVG para gerar informações em forma de gráfico vetorial

30

XML: uma introdução prática

X100

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

Atualizado em setembro de 2001

1

Como criar um documento XML
!! XML não tem comandos, nem operadores, nem
funções, nem tipos
!! Não é exatamente uma "linguagem"
!! A especificação XML não estabelece nenhum vocabulário
!! Define apenas uma estrutura e sintaxe geral para a
organização de informações estruturadas

!! Para criar o menor documento XML

!! Abra um editor de textos qualquer
!! Salve o arquivo com extensão .xml
!! Escreva um elemento raiz vazio; por exemplo:
!"#$$%&'(
!! Salve o arquivo
!! Abra em um browser como Firefox ou Internet Explorer
2

Especificação XML
!! As regras para criação de documentos XML são definidas pelo
World Wide Web Consortium (W3C) através de especificação
!! !""#$%%&&&'&(')*+%,-%./0%1

!! A especificação não define

!! nomes de elementos e atributos (cada aplicação define os seus)
!! como escrever documentos válidos: a validade de um documento XML é
definido pelo autor da aplicação em que ele é usado

!! A especificação define
!! tokens, caracteres e formatos de texto que podem ser usados em
documentos XML (basicamente texto Unicode)
!! elementos e atributos reservados (começam com o string xml)
!! regras mínimas que possibilitam a leitura por um processador XML: um
documento que segue essas regras é bem formado
!! como uma aplicação 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 vários nós (galhos e folhas)
<?xml version="1.0" encoding="iso-8859-1" ?>
<!-- Isto é um comentário -->
informações 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 - Petrópolis - 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 comentário,
</telefone>
•! uma instrução,
•! uma declaração,
</cartao-simples>
•! uma entidade, ...

4

nó raiz

/

Árvore XML

elemento raiz do
documento

cartao-simples

email

dumont@14bis.com.br

nome
endereco

Alberto
Santos
Dumont

logotipo

numero

ddd
tipo
21

2313011
5

residencial

href

/imagens/logo14bis.gif

LEGENDA

telefone

Rua do Encanto, 22 2o. andar - Centro
- 25600-000 Petrópolis - RJ

nó de elemento
nó de atributo

nó de texto
www.argonavis.com.br

5

Componentes de um documento
!! Um documento pode conter
!! Prólogo
!! Comentários
!! Instruções de processamento
!! Atributos nos elementos
!! Nós de texto dentro dos elementos
!! Elementos aninhados (sendo apenas um na raiz)
!! Conteúdo misto (elemento e texto) dentro de elementos
!! Entidades gerais
!! Entidades de caractere
!! Blocos CDATA

6

Prólogo

Declaração XML
Comentário (pode aparecer em qualquer lugar)
Instrução de processamento
Declaração de tipo de documento

<?xml version="1.0" encoding="iso-8859-1" ?>
<!-- Isto é um comentário -->
<?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 - Petrópolis - 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
documento

nó raiz
(/)

<?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 - Petrópolis - 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 - Petrópolis - RJ</endereco>
<email>dumont@14bis.com.br</email>
<telefone tipo="residencial" >
<ddd>21</ddd>
<numero>2313011</numero>
</telefone>
atributos
</cartao-simples>

9

Nós de texto
!! Não podem ter descendentes (são 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 - Petrópolis - RJ</endereco>
<email>dumont@14bis.com.br</email>
<telefone tipo="residencial" >
<ddd>21</ddd>
<numero>2313011</numero>
nós de
</telefone>
texto
</cartao-simples>

10

Entidades gerais
!! São constantes associadas a um valor de texto
!! Podem aparecer em qualquer lugar do documento
!! São substituídas durante o processamento do documento
!! Podem ser definidas pelo usuário (via DTD)

!! Sintaxe: !"#$%&'&"()
!! Exemplo:
!! !"#$#%"&%'()&*+

!! Entidades pré-definidas:
!! !*$()
) )que corresponde a
!! !,$()
) )que corresponde a
!! !'./() )que corresponde a
!! !012$())que corresponde a
!! !'/24())que corresponde a

+)
-)
!)
3)
5))
11

Entidades de caracteres
!! Também são substituídas durante o processamento
do documento
!! Sintaxe:
!! !"#$%&'()*+,-./0123456
!! !"7#$%&'()*+,-8/73./0123456

!! Exemplos:

!! !"9+:56;"799<=566
!! !"799=95 representa um espaço em Unicode
!! Veja mais em www.unicode.org/charts/

!! XML não define por default as entidades do HTML
!! Não existe !>,?@56ou !3A14./56a menos que sejam
definidas em um DTD (como no DTD do XHTML)
12

Elementos e atributos: regras básicas
!! Etiqueta inicial e final têm que ter o mesmo nome
(considerando diferença de maiúscula e minúscula)
!! Não pode haver espaço depois do ! nas etiquetas iniciais
nem depois do !"#nas finais

!! Atributos têm sempre a forma nome, seguido de '$',
seguido do valor entre aspas ou apóstrofes
!! !"#$%&'()"*&+ou !"#$+%+,'()"*, são válidos
!! aspas podem ser usadas entre apóstrofes
!! apóstrofes podem ser usados entre aspas
!! aspas e apóstrofes não podem ser neutralizados, mas podem
ser representados pelas entidades -./"01+e -(2"31+
!! Não pode haver atributos na etiqueta final
!! Atributos não 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 maiúsculos e minúsculos)
!! Seus elementos estão bem aninhados
!! Não acontece nada do tipo !"#!$#!"#$!%$#&

!! Valores dos atributos estão entre aspas ou apóstrofes
!! Os atributos não se repetem
!! Elementos e atributos têm identificadores válidos
!! Comentários não aparecem dentro de etiquetas
!! Sinais < ou & nunca ocorrem dentro de atributos ou
nós 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á várias maneiras de representar a mesma
informação em XML
!"#$#%&'()&(*++,!("#$#%!"#$#-".#/0&'0-123/0)&0-#45/0*++,0-(%!"#$#%-!".#%&'!(".#%-!123%)&!(123%-!#45%*++,!(#45%!("#$#%-16

Quando usar elementos ou atributos?
!! Uma questão de design
!! Elementos geralmente referem-se a coisas que têm
atributos
!! Atributos geralmente são características dessas coisas
que podem ser descritas com poucas palavras

!! Uma questão de suporte tecnológico
!! Atributos não podem conter subelementos
!! Atributos são mais fáceis de serem validados num DTD

!! Sempre que possível, priorize os argumentos de
design aos de suporte tecnológico

17

Identificadores de elementos e atributos
!! Nomes de atributos e elementos
!! Podem conter
!! qualquer caractere alfanumérico ou ideograma
!! ! (ponto)
!! " (hífen)
!! #$(sublinhado)

!! Não podem começar com
!! ponto
!! hífen
!! número

!! Não podem começar com a seqüência 'xml'
!! É reservada para atributos e elementos com significado
especial, definido em especificação (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

Conteúdo 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

Instruções de processamento
!! Instruções dependentes do processador
!! Funcionam como comentários para os processadores
que não a conhecem
!"!"#$%&"%'()"*#$%&'(%'(&()*'"+''
!"+,$-.%/+(**
''*%,%-.'/)0%1'%0&2,''
'''''3$)0'&4%/(&''
'''''56%$%'2(789''
"+''

22

Comentários
!! Iguais aos comentários HTML
!"##$%&'($)$*+$,(+-.'/01($##2$

!! Comentários não podem conter a seqüência -!"##$$1&'($)$*+$-00($!!"&)01("$##2$

23

Declaração XML
!! É uma instrução de processamento para o
processador XML
!! É opcional

!! Exceto quando o encoding não for UTF-8 (default)

!"#$%&!'()*+,-./012/!!
!!!!!!(-3,4+-5./+*,6778960/!!
!!!!!!*:;-4;&,-(./<(*/!#=!!

24

XML Namespaces
!! Permite que elementos de mesmo nome de diferentes
aplicações 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 não estão 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 é arbitrário e só existe dentro do documento
!! O identificador (geralmente uma URI) deve ser reconhecido
pela aplicação para validar o documento
!! XML Namespaces é uma especificação a parte
!! !""#$%%&&&'&(')*+%,-%./0123/45%6

25

Exemplo
Vale para todo o
elemento <cartao>

Esta URI
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 - Petrópolis - 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">
URI padrão
<ct:nome>Fulano de Tal</ct:nome>
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

Observações importantes sobre namespaces
!! O escopo da declaração xmlns (sem prefixo) inclui
!! O elemento onde ela acontece
!! Os elementos-filho

!! O escopo da declaração xmlns:prefixo inclui
!! O próprio elemento se qualificado com mesmo prefixo
!! Os elementos-filho qualificados com o prefixo
!! Os atributos do elemento onde ocorre a declaração e
elementos filho qualificados com o prefixo

!! O identificador não representa endereço na internet
!! Geralmente é escrito como URL, porque URLs são unívocas
!! O identificador é string e não endereço: omitir ou incluir
uma ! final faz diferença

!! Declarar e usar um namespace pode ser opcional
!! Depende da aplicação que irá processar o documento

28

XML: uma introdução prática

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 não são bem formados não são
documentos XML – use um editor XML para descobrir

!! Documentos bem-formados obedecem as regras de
construção de documentos XML genéricos
!! Regras incluem
!! Ter um, e apenas um, elemento raiz
!! Valores dos atributos estarem entre aspas ou apóstrofes
!! Atributos não se repetirem
!! Todos os elementos terem etiqueta de fechamento
!! Elementos estarem corretamente aninhados
2

XML válido
!! Um XML bem construído pode não ser válido em
determinada aplicação
!! Aplicação típica pode esperar que
!! elementos façam parte de um vocabulário limitado,
!! certos atributos tenham valores e tipos definidos,
!! elementos sejam organizados de acordo com uma
determinada estrutura hierárquica, etc.

!! É preciso especificar a linguagem!
!! Esquema: modelo que descreve todos os elementos,
atributos, entidades, suas relações e tipos de dados

!! Um documento XML é considerado válido em relação
a um esquema se obedecer todas as suas regras
3

Por que validar?
!! Para a maior parte das aplicações, um XML bem
formado é suficiente
!! É possível, em documentos XML bem-formados,
mas que não são válidos
!! Montar a árvore usando DOM
!! Extrair nós, acrescentar nós, alterar o conteúdo 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

!! Então porque ter o trabalho de criar um DTD ou
um XML Schema?

4

Definir um esquema
!! Documentos não válidos são "individualistas"
!! Um esquema representa um conjunto de documentos,
que existem e que virão a existir
!! É possível fazer muitas coisas com UM documento não
válido. É difícil automatizar os processos sem considerar
uma CLASSE de documentos

!! Um esquema é uma formalidade necessária
!! Se você tem uma grande coleção de documentos que
foram construídos segundo determinadas regras, você já
tem, informalmente, um esquema
!! Para validar documentos de acordo com suas convenções,
é preciso ter um esquema
5

Esquema
Documentos que aderem à
especificação (válidos)

!! O esquema representa uma classe
!! Os documentos são instâncias

Esquema (universo de
documentos válidos)
Documento
fora da
especificação

!! Como definir esquemas:

!! DTD - Document Type Definition
!! W3C XML Schema

6

Documentos válidos
!! Um relacionamento pode ser estabelecido
formalmente entre um esquema e sua instância
!! Declaração de tipo de documento (para DTD)

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

!! Declaração 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 vocabulário
!! Elementos, atributos

!! Uma gramática
!! Relacionamentos (que elementos são permitidos onde, e
de que forma, e com que conteúdo)

!! Uma coleção de entidades

!! Variáveis que são substituídas por valores constantes
durante o processamento (nem todo esquema tem
suporte a declaração 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 são válidos 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
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT

pessoa (nome, web?, telefone+)>
nome (prenome, inicial*, sobrenome)>
prenome (#PCDATA)>
pessoa tem nome, seguido de zero
ou um web e um ou mais telefone
inicial (#PCDATA)>
nome tem um prenome, seguido
sobrenome (#PCDATA)>
de zero ou mais inicial e um
web (email|website)>
sobrenome
email (#PCDATA)>
web pode conter ou um
website (#PCDATA)>
email ou um website
telefone (#PCDATA)>
Elementos que só podem conter texto

9

Documentos válidos segundo o DTD
!! Os documentos abaixo são válidos segundo o DTD mostrado na
página 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 inválidos segundo o DTD
!! Os documentos abaixo não são válidos 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 instância
!! 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

Possíveis regras de validação
!! Os elementos permitidos são
!! bilhete, voo, passageiro, sobrenome, prenome

!! O elemento bilhete contém 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 contém valores
!! que podem ser escolhidos de uma lista em um DTD
!! que podem ser qualquer coisa, em outro DTD

13

UM possível 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 informações 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 início do documento XML

!! !"),)-).&*++

!! Define um elemento

!! !"/&&,01&*++

!! Define os atributos de um elemento

!! !").&0&'*++

!! Define uma entidade ( ex: !"#$%&')

!! !".$&/&0$.*++

!! Define notação interna para uma URI
16

Elemento <!DOCTYPE>
!! O elemento <!DOCTYPE> é um elemento do DTD que deve
ser usado dentro da página XML
!! Identifica o elemento raiz
!! Associa o arquivo a um DTD através de URL ou identificador público

!! 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
raiz do documento

onde buscar validação:
SYSTEM ou PUBLIC

URI ou
identificador

!! Alguns DTDs possuem um identificador formal público (FPI)
!! Neste caso, são 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 têm prioridade sobre declarações
importadas

!! Processador lê primeiro elementos locais, depois os que
foram carregados do DTD externo
!! A primeira declaração é usada. Declarações adicionais para
o mesmo elemento/atributo/entidade são desconsideradas –
logo, declarações locais têm precedência

19

DTD: exemplo

zero ou uma
ocorrência

exatamente uma
ocorrência cada

<!ELEMENT cartao-simples ( logotipo?,
zero ou mais
ocorrências
nome, endereco,
definição de
email*,
elemento
uma ou mais
telefone+ ) >
ocorrências
<!ELEMENT logotipo EMPTY >
não pode conter outros nós
<!ATTLIST logotipo
(exceto atributos)
href CDATA #REQUIRED >
<!ELEMENT nome ( #PCDATA ) >
atributo obrigatório
<!ELEMENT endereco ( #PCDATA ) >
contém "Character DATA"
<!ELEMENT email ( #PCDATA ) >
um ou
<!ELEMENT telefone ( ddd, numero ) >
valor default
o outro
<!ATTLIST telefone
tipo ( residencial | comercial ) "residencial"
lista de
codigo-pais NMTOKEN #IMPLIED >
atributos
<!ELEMENT ddd ( #PCDATA ) >
atributo opcional
<!ELEMENT numero ( #PCDATA ) >
contém nome ou número

20

Elemento <!ELEMENT>
!! Sintaxe
!!"#"$"%&'"#$%&'#&%(%$%")#*+#")%,'#*-*

!! O conteúdo pode ser
!! (1) ()*+,-&-.,
!! (2) (uma seqüência.,
!! (3) (uma lista de opções.,
!! (4) (conteúdo misto.,
!! (5) a palavra "$*&/ ou
!! (6) a palavra -%/.

21

Conteúdo #PCDATA
!! Parsed Character Data
!! Elemento declarado com esse tipo pode conter apenas
texto simples
!! Pode conter entidades &valor;
!! Não pode conter elementos

22

Conteúdo Seqüência
!! O conteúdo deve ter uma lista de elementos
separados por vírgula
!! Indica que os elementos filho que podem aparecer dentro
do elemento declarado
!! Define uma ordenação dos elementos filho

!! Podem ter sufixos indicando multiplicação
!! ! zero ou mais
!! " um ou mais
!! # zero ou um

!! Exemplos

!! !"#$#%#&'($%&'%())*+,-.(/-0-1+*-2.((
((((((((((((((((((-,3405.(6-784/-9:(;(
!! !"#$#%#&'('&*+))0+<+,+/4=3.(=3>+-85:(;((

23

Conteúdo lista de opções
!! Lista de elementos separada por |
!! Indica que um dentre os elementos filho listados pode ser
usado como conteúdo 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

Conteúdo misto
!! !"#$%&'&()(*+*,-()(...()(*+*,/01(
!! Permite conteúdo de elementos, conteúdo de texto ou
elementos misturados com texto

!! Conteúdo misto não admite outra sintaxe
!! "#$%&'&(tem que ser o primeiro elemento
!! O * no final é obrigatório
!! Não é possível controlar o número ou ordem dos filhos

!! Exemplo: a seguinte declaração em DTD
!"#$%$&$'(!2345*()*+,-.(.!/!*/245*012!

permite o seguinte conteúdo
(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

Conteúdo Vazio e Any
!! Elementos que não podem conter nada devem ser
declarados como EMPTY
!! !"#$#%#&'()*+,(!"#$%-(

!! Elementos EMPTY podem conter atributos
!! !".''$/0'()*+,(12,)*+,(34.'.(56#78/6#4-(

!! A declaração 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 opções

*&$,$,*+%

,"%

&($#$,(&%

29

Tipo CDATA e NMTOKEN
!! CDATA (character data) representa qualquer texto
arbitrário
!! Pode conter espaços, pontuação, etc.

!! NMTOKEN (name token). É semelhante a um
nome de elemento ou atributo
!! Caracteres alfanuméricos apenas
!! Não pode conter espaços nem pontuação

!! NMTOKENS representa um ou mais NMTOKEN
separados por espaços.
!"#"$"%&'()&*+,-&'./-$(0'+1(&*21(34(56/7(
30

Tipo lista de opções
!! Uma lista de NMTOKENS dentre os quais podese escolher o valor do atributo.
!! As escolhas são separadas por |:
!"#$%%&'(%!)**!+,-,!./0121342(567!8/096'/05:!!
!"#$%%&'(%!;<-=*!+>-?*@*!.@?,2A*?B>7!CA*?B>C:!!

!! Elementos não podem conter espaços ou outros
caracteres não-alfanuméricos
!! O tipo de cada opção é NMTOKEN!

31

Tipo ID
!! Atributos do tipo ID tem que conter um nome (e não
NMTOKEN) que seja unívoco no documento.
!! Nome tem mesmas regras que identificador XML
(caracteres alfanuméricos, não começa com número, etc.)

!! Não se pode usar um número como conteúdo de um
atributo declarado como ID.
!! A solução é colocar um prefixo antes do número que seja ou
uma letra ou um sublinhado.

!! Elementos só podem ter um tipo ID

!! Não pode haver outro elemento na mesma página com o
mesmo ID

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

32

Tipo IDREF
!! IDREF é referência para um ID. Exemplo:
!"#$%%&'(%!)*+,-,!.+,/.0,!!"#$%&12345'2367!

!! Aplicação
".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!!

!! Aplicação (codigo e numero são IDs)
!".89,),9-,7!!
! !":,,!/,0*;,<=#()*+=7!>>>!"?:,,7!!
! !":,,!/,0*;,<=#(,-.=7!>>>!"?:,,7!!
! !")*+,-,!!@AB89,<=&*=!!
! ! ! ! ! !.+,/.0,<=#(,-.'#()*+=7!!
! !>>>!"?)*+,-,7!!
!"?.89,),9-,7!
34

Valores default
!! #REQUIRED: força o autor do documento a definir
um valor explícito ao atributo.
!! #IMPLIED: o atributo é opcional.
!! #FIXED: o atributo tem um valor fixo, constante

!! Valor não pode ser mudado
!! Autor não precisa definir atributo e, se o fizer, não pode
mudar o valor.
!! Exemplo:
!"#$$%&'$()*+,-(.,/0*(12#$#(!"#$%&'()*+(3((

!! Valor inicial, entre aspas

!! Autor não 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 não há URIs)

!! Exemplos
%+,!"#$#%"!&-.-/01%232$*'%45667899:::;-.-/01;<0.4=%%
%+,!"#$#%"!&>-?1@A%232$*'%45667899:::;>1;<0.4=%%

!! Tipo &($#$B(&%de +,#$$CB2$=%é útil em situações onde
não 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á vários tipos de !"#$%&%'()
!! Definem entidades: variáveis usadas nos DTDs e documentos XML

!! Entidades de parâmetro (*+,-./): usadas apenas no DTD
!! internas – contém texto declarado localmente no DTD
!! externas – contém conteúdo de arquivos externos (sub DTDs)

!! Entidades gerais (0+,-./): usadas apenas no XML
!! internas (são sempre processadas)
!! caractere – código Unicode: &#333; &#x3AB4;
!! globais – cinco entidades: &lt; &gt; &amp; &quot; e &apos;
!! definidas pelo usuário – contém 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
!! não-processadas – incluem formatos binários (ex: imagens); o processador
ignora o conteúdo e não 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(
;+,)0<=0:>!
!*5*)*+786(

!! Conteúdo de menu.xml:
!)*+,6(
%*478(
!1)*+,6(

!! Resultado
!*5*)*+786(
((!)*+,6(
((((%*478(
((!1)*+,6(
!1*5*)*+786(
39

Entidades gerais externas não processadas
!! Usadas para carregar dados que não podem ser
processados (que não são texto) através de atributos
!"#$%&'&(!)*+,!-(-&$.!/012/!%34&4!)*5678*9!!

!! Depende de uma declaração NOTATION
!! Neste caso típico 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:
!"2+6:,+!;*)5,?-<*:*-5!!

Esta entidade geral logo é usada
apenas em atributos
A sintaxe é diferente: seria &logo;
se fosse uma entidade processada

40

Entidades de parâmetro internas
!"#$%&%'()(*+,-(./01+2.3(
!! Variáveis 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 parâmetro 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+,!
"#$.$*$%&!---,!

!! Conteúdo de voos.dtd:

!"#$%&'&(!/!01!!+2345367+,!!
!"#$%&'&(!/!89:!+3'35);7+,

42

Condicionais
!! À primeira vista parecem inúteis
!! Servem para construir DTDs configuráveis e modulares
!! Módulos permitem segmentação e reuso
!! São usados por aplicações como XHTML 1.1, SVG 1.1

!! Bloco IGNORE: ignora o conteúdo
!"#$!"#$%&'$!
!!!"#%&%'%()!*+,-./+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 atribuído a entidades de
parâmetro, pode-se "ligar" ou "desligar" declarações
!! Exemplo: no DTD importado
!"#$%&%'(!"#$%&'$()*#(+)")&*$+,#)-(
!"#$%&%'(!"#$%&'$()*#(#*&,")&*$+,#)-(
!"./0123415670586(.(
(((!"#9#:#$%(;73<=<(>?@ABC%CD-(
EE-(
!"./01234156705073<(.(
(((!"#9#:#$%(6=3<;73<=<(>?@ABC%CD-(
EE-(

!! Blocos acima são "desligados" por default
!! Em um DTD local, pode-se "ligar" o que se deseja usar
(!"#$%&%'(!"#$%&'$()*#(+)")&$A9FB#)-(

!! Agora elemento <coisas> faz parte do DTD!
44

Validação: além do DTD
!! DTD
!! vantagem: é simples
!! desvantagens: (1) não usa sintaxe XML; (2) é limitado.

!! XML Schema
!! vantagem: (1) é XML; (2) permite especificação muito
mais precisa e detalhada.
!! desvantagem: é muito mais complicado que DTD

!! Schema ainda não resolve todos os problemas

!! Outras alternativas: Trax, RELAX, Schematron
!! XML Schema é extensível e permite usar essas linguagens
para completar a validação
!! Em certos casos ainda pode ser preciso realizar validação
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&
!! XML Schema é uma
&&&!#*4*(FG(-5(3&
&H111I&
alternativa ao DTD
&&!#*4(%($(-8&-7$(./',,/3&
!! Oferece mais
&&&!#*45,$9%(#DE9(3&
recursos
&&&&!#*4788)+CG8(&-7$(./J(/&G*(./)(FG+)(J/3&
&&&&&!#*4*+$9%(DE9(3&
!! Usa sintaxe XML
&!#*4)(*8)+58+,-&C7*(./#*4*8)+-=/3&
!! Exemplo (trecho do
&&!#*4(-G$()78+,-&'7%G(./KLM/&:3&
&&!#*4(-G$()78+,-&'7%G(./MNO/&:3&
XML Schema para
&&!#*4(-G$()78+,-&'7%G(./NKP/&:3&
o bilhete de vôo)
&&!#*4(-G$()78+,-&'7%G(./BQP/&:3&
&!:#*4)(*8)+58+,-3&
&&&&&!:#*4*+$9%(DE9(3&
&&&&!:#*4788)+CG8(3&H111I&
&!:#*4(%($(-83&
!:#*4*56($73&

46

XML: uma introdução prática

X100

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

Atualizado em setembro de 2001

1

Programação com XML
!  Há duas maneiras populares para manipular (interpretar, gerar,
extrair dados e tratar eventos) arquivos XML:
!  Document Object Model (DOM) – representação em árvore
!  Simple API for XML (SAX) – representação sequencial

!  As duas técnicas servem a finalidades diferentes.
!  SAX é mais simples. Oferece métodos 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 hierárquica de objetos, em forma
de árvore, que permite a navegação na estrutura do documento
!  Propriedades dos objetos podem ser manipuladas
!  Viabiliza scripting em aplicações como XHTML e SVG
!  Oferece suporte a várias APIs que usam XPath para extrair dados,
permitindo maior produtividade e eficiência

2

SAX ou DOM?
!  SAX
!  Gasta menos memória: não precisa carregar o documento inteiro
!  Ideal para aplicações simples que não precisam manipular com toda a
árvore de objetos (ex: busca simples)
!  Programação em nível mais primitivo: foco em eficiência
!  Pode-se usar SAX para montar uma árvore DOM
!  Não é um 'padrão'; é mais uma técnica de processamento que uma API;
há várias alternativas similares: StAX (Java), SAX2, etc.

!  DOM
! 
! 
! 
! 
! 

Mais novo (linguagens mais antigas suportam apenas SAX)
Baseado em objetos e mais fácil de usar (API de nível mais alto)
Há uma API padrão do W3C (há outras APIs similares: JDOM, etc.)
É a única opção para manipulação no cliente (via scripts)
Permite validação e busca sofisticada combinado com XPath

!  APIs disponíveis em várias 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 (navegação 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 padrão
!  Padrões do W3C: DOM Level 1, DOM Level 2
!  Usado também por HTML

!  Objetivo da especificação: oferecer uma interface
de programação uniforme, independente de
plataforma e linguagem, para aplicações que
manipulam XML
!  Serve para
!  criar um novo documento XML
!  navegar na árvore XML
!  modificar, remover ou adicionar nós (elementos,
atributos, texto, comentários, PIs, etc.)
5

SAX
!  Simple API for XML
!  Técnica de processamento que dispara eventos
durante processamento do documento

!  eventos representam componentes lidos e podem ser
capturados por objetos ouvintes cadastrados
!  ações podem ser tomadas em cada situação

!  Exemplos de eventos
!  inicio e fim do documento
!  início e fim do elemento (pode-se descobrir qual)
!  nó de caractere
!  nó de comentário
!  ...
6

Como escolher entre SAX e DOM
!  Não são concorrentes – são complementares
!  DOM é ideal para manipular a árvore XML recursivamente
e fundamental para scripting
!  SAX é ideal para ler o documento seqüencialmente
!  DOM requer carga de todo o documento antes de iniciar o
processamento: consome mais memória
!  SAX não "lembra" de tarefas realizadas: não serve para
validar referências cruzadas

!  Em aplicações típicas, havendo suporte a DOM, use-o!
!  É muito mais produtivo, moderno e fácil de entender
!  Use SAX quando precisar de eficiência
!  Use SAX quando não puder ter o XML inteiro na memória
(ex: extração 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 informações desejadas
8

Como usar SAX em Java
!  Crie classe ouvinte estendendo !"#$%&'$()*$+,-)./01)23/,"4
!"#$%&'&$())'567)*1)23/,"4*+,*-.)'/*0("$,1(-.$*2'34445'

!  Implemente os métodos 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 nós
!  Passo 3: montar a árvore (pode ser feito durante passo 2)

!  Alteração (com a árvore na memória)
!  Localiza o nó de referência
!  Remove, altera, muda posição, cria nó antes ou depois.

!  Criação

!  Cria raiz; cria elemento raiz; cria elementos filho e
atributos; cria nós de texto
!  Monta árvore
!  coloca atributos em elementos, nós de texto em elementos,
elementos filho em elementos pai, elemento raiz na raiz
11

W3C DOM (padrão): tipos de dados
!  Coleções: NodeList, NamedNodeMap
!  Raiz da hierarquia de nós: Node
!  Subclasses de Node
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 

Attr
CharacterData
Text
CDATASection
Comment
Document
DocumentFragment
DocumentType
Element
Entity
EntityReference
Notation
ProcessingInstruction

(atributo)
(classe abstrata)
(nó de texto)
(seção CDATA)
(comentário)
(documento inteiro)
(sub-árvore)
<!DOCTYPE>
(elemento)
(valor da entidade - conteúdo)
(nome da variável)
(valor de uma notação)
(instrução de processamento)

12

W3C DOM: Hierarquia
DocumentFragment
Document

Text

CDATASection

CharacterData
Attr
Node

Comment

Element
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 implementação

)

)

14

Alguns métodos da interface Node
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 

Node
appendChild(Node)
Node
cloneNode(boolean)
NamedNodeMap getAttributes()
NodeList
getChildNodes()
boolean
hasAttributes()
boolean
hasChildNodes()
Node
insertBefore(Node, Node)
Node
removeChild(Node)
Node
replaceChild(Node, Node)
Node
getFirstChild()
Node
getLastChild()
Node
getNextSibling()
Node
getPreviousSibling()
String
getNodeName()
short
getNodeType()
String
getNodeValue()
Document getOwnerDocument()
Node
getParentNode()

attributes
childNodes
atalhos!

firstChild
lastChild
nextSibling
previousSibling
nodeName
nodeType
nodeValue
ownerDocument
parentNode

15

Métodos para listas e mapas
!  NamedNodeMap
!  Node
!  Node
!  Node
!  void
!  int

item(int)
getNamedItem(String)
nextNode()
reset()
getLength()
length

!  NodeList
!  Node
!  Node
!  void
!  int

item(int)
nextNode()
reset()
getLength()

length

16

Interface Element
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 

String
String
Attr
Attr
NodeList
NodeList
String
boolean
boolean
void
void
void
void

getAttribute(String)
getAttributeNS(String, String)
getAttributeNode(String)
getAttributeNodeNS(String, String)
getElementsByTagName(String)
getElementsByTagNameNS(String, String)
getTagName()
tagName
hasAttribute(String)
hasAttributeNS(String, String)
removeAttribute(String)
removeAttributeNS(String, String)
setAttribute(String, String)
setAttributeNS(String, String, String)
17

Interfaces Attr e Text
!  Attr
!  String
!  Element
!  String
!  void

getName()
getOwnerElement()
getValue()
setValue(String)

name
ownerElement
value

!  Text e CharacterData
!  void
!  String
!  int
!  void
!  void
!  void

appendData(String)
getData()
data
getLength()
length
insertData(int, String)
replaceData(int, int, String)
setData(String)
18

W3C DOM 2.0 com namespaces
!  Use métodos que levam em conta o namespace
!  É necessário para acessar elementos e atributos que
usam namespaces (ex: xlink)
!  É necessário 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 criação de árvore
!  Usando interfaces do W3C DOM padrão
!"

Obter objeto do tipo Document
(depende de processador): document

#$%&'()*"

+%,-*,."

/0('()*"

carta := document.createElement("carta")
+'()1,2('."

/0('()*"

mens := document.createElement("mensagem")
3$'"45,6"

!  Atributos
+%,-*,"5489:9."

7*-5)2"

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

carta.setAttribute("id", "1")

21

DOM: montagem da árvore
!  Usando interface DOM padrão
!  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 referência 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 aplicações 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 implementações de visualizadores SVG o objeto default
também se chama document
23

Obtenção 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: gravação em XML
!  Uma vez criada a árvore DOM, ela pode ser
serializada para XML (arquivo de texto)
!  Solução padrão é 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 saída padrão (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 referência
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 saída padrão)
!  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 (não usa interfaces DOM padrão)

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

!  Gravação 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 padrão: usar o não usar
!  Em linguagens de script, que rodam no browser, use
sempre DOM padrão W3C
!  Usar soluções proprietárias em aplicações que rodam no
cliente não é recomendado

!  Em aplicações no servidor ou standalone, escolha a
solução mais adequada à sua aplicação
!  Use as soluções nativas se existirem
!  Escolha entre soluções de acordo com recursos desejados,
eficiência, etc (ex: várias APIs DOM diferentes para Mac
OS e iPhone)
!  Java oferece APIs mais fáceis de usar que são alternativas
ao DOM padrão com JDOM e DOM4J
29

XML: uma introdução prática

X100

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

Atualizado em setembro de 2001

1

Apresentação do XML
!! Por que apresentar os dados?
!! Impressão
!! Web
!! Verificação
!! Edição

!! Soluções
!! 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
!! vários documentos

!! Comum em
!! processadores de texto (Word: .DOT)
!! DTP (Framemaker: .FOS, Ventura Pub: .STY)

!! Separa estrutura e conteúdo da apresentação

!! portabilidade maior
!! maior facilidade para gerar visões diferentes dos dados
!! facilita manutenção e promove reutilização

!! Veja exemplos (HTML + CSS)
3

CSS e XSL
!! Principais linguagens de folhas de estilo disponíveis 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 execução (não pode guardar o
resultado da transformação)

!! XSL (XSLT + XSL-FO)

!! altera a estrutura do documento (transforma)
!! regras informam ao processador elementos e atributos que devem
ser substituídos
!! formatação estilo-CSS via especificação XSL-FO
!! interpretada em tempo de execução ou previamente (pode
guardar o resultado da transformação)
4

Por que usar CSS?
!! Em HTML
!! Alterar a forma original determinada pelo estilo do browser
!! Separar conteúdo da forma de apresentação
!! Simplificar a manutenção de um grande site
!! Ter grande controle sobre cores, fontes, layout
!! Tornar as páginas mais leves e o site mais rápido

!! Em XML
!! Dar forma a elementos que não têm forma predefinida
!! Solução 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)
!! Aplicações como SVG e XHTML definem em especificação
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 também 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
!! Comentários:
!56!"#$#%&'!.7+&'0/&!,8&+%1!(9-%4!!65!

!! Instruções:

!:.;-&'%!
!:;#/.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 aplicação SVG, XHTML, XSL-FO, HTML, etc.)
!! Um ou mais elementos determinados por
!! nome do elemento
!! atributos que contém
!! valores dos atributos
!! padrões encontrados nos valores dos atributos (predicados)
!! contexto hierárquico
!! contexto de posição 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 são 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

Resolução de conflitos
!! Ao importar folhas de estilo, definir novas regras,
pode haver conflitos de precedência
!! Regras básicas

!! Estilos mais específicos predominam: ser mais específico
é mais importante que chegar depois
!! Propriedades não sobrepostas são herdadas
!! Elementos filho herdam propriedades dos pais
!! exceto quando filhos definem suas propriedades (mesmo que
antes das dos pais): vale a regra do 'mais específico'

!! Regra aplicada via * (seletor universal) é considerada
mais específica que uma regra herdada pela estrutura
!! O seletor mais específico 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

Seleção por contexto hierárquico
!! Dois ou mais nomes correspondem a um seletor
!! Relação ancestral-descendente
!! !"#$%&'!()*$%#$"*$"&$)+#,(,'-)'$*.)
!! &!/($)&*0)1()/)+#,(,'-2$((,3.)
!! /,*2)4)567)+/,'*$'835*&9-):4;.)

!! Descendência 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

Seleção por contexto de posição
!! Pode-se selecionar um elemento com base no seu
vizinho anterior usando-se o símbolo “+”.
!! O elemento vizinho anterior (preceding-sibling) é um
elemento irmão
!! Exemplo:
!! !"#$%&'()*+),-.-$!'$/$0"-12"3"/4-536$7!! seleciona o elemento 8$!'$/$2"9-que está no mesmo
nível de 8!"#$-&'()*+)9-e imediatamente após 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
através 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 vários elementos
!! Depende de suporte formal por parte da aplicação XML: requer a
definição de um atributo class (logo não funcionam com qualquer XML)
!! São 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 parágrafo 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 específicas persistem
!! Exemplo: !"#$%&!'&()*(#!+'&!+"#$%&,
!! Aplicar estilo em "#$%:
,"#$%,-.#/#01,0)$2

afeta ' somente se ' já não 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 página
!! !"#$%&"'()*!""
""""#$%&'#()*+,-"./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 aparência de mídia paginada
!&%'(#)define estilos diferentes para mídias diferentes

!! !"#$%
!!

!! Opções: 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 aparência dos dados, e que são
aplicados aos seletores
!! Sempre dependem de suporte da aplicação XML e do processador
!! Aplicar propriedades CSS em um XML genérico 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 compatível

!! Sintaxe de declarações

!! Quando usadas dentro de folhas de estilos
!"#$%&'()*#+,'

!! Quando usadas em atributos -./*% de aplicações XML que o suportam
(XHTML, SVG, etc.)
0%*%$%".#'-./*%12"#$%&'()*#+23'

!! Valores válidos dependem de suporte da aplicação

!! Para browsers, aplicações XHTML e SVG, valores válidos incluem
nomes, unidades, porcentagens, cores, URIs, etc.

20

Propriedades de classificação
!! display
!! muda o papel do elemento
!! bloco, tabela, lista, inline, invisível
!! essencial para formatar XML genérico em um browser,
pois elementos não têm estrutura default

!! white-space
!! definem a forma de tratamento de espaços

!! list-style-*

!! marcadores, números, etc.
!! estilos para listas de tópicos

!! content
!! substitui seletor por outro conteúdo
21

Fontes
!! font-*
!! Alteram propriedades relativas a fontes

!! font-family
!! família (tipo)

!! font-size

!! tamanho, em várias unidades: !"#$%&#$'(#$!)#$*&#$*)#$!%$

!! font-weight
!! peso: +,-.#$-'/0"#$122#$322#$444$#$522$

!! font-style
!! estilo de grifo: '"6-'%#$,+-'78*$

!! font-variant
!! variação9$:&6--;%6!:$

!! font-stretch
!! expande ou condensa a fonta

!! font

!! atalho para especificar várias 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 também RGBA (transparência)
!! SVG usa fill e stroke para preenchimento de objetos e
traços, 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 à página

!! background (atalho)
25

Blocos
!! Caixa do elemento

!! Posições

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 conteúdo 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

página)
!! )(%!'*+(:

relativo à posição anterior
!! #'!'*,: relativo ao texto da página

!! top
!! coordenada y (0 é canto superior)

!! left

!! coordenada x (0 é canto esquerdo)

!! z-index
!! coordenada z (layers)
29

XML: uma introdução prática

X100

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

Atualizado em setembro de 2001

1

XLink
!! Coleção de atributos, do namespace http://
www.w3.org/1999/xlink usado para oferecer
recursos de hipertexto a documentos XML
!! Tipos de links disponíveis
!! links simples (como os que já existem em HTML)
!! links estendidos com capacidade de
!! apontar para vários destinos ao mesmo tempo
!! ser destino e fonte ao mesmo tempo
!! ser vértice de um grafo e controlar toda uma teia de
navegação

!! Combinado com XPointer e XPath pode apontar
para partes de um documento ou até caracteres
individuais.

2

XPointer
!! Função e sintaxe para apontar para pedaços de um
documentos XML
!! XPointer usa a linguagem XPath para representar
elementos e conjuntos de elementos.
!! Possui funções 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 não destino de um XLink

!! Aplicações não só na Web

!! também em interfaces de processamento de texto!
3

XLink é coleção de atributos
!! Namespace:
!! http://www.w3.org/1999/xlink

!! Atributos:
!! !"#$%=!"#$%&'!(!')*'+,',!(!&-./*-0!(!!
!!!!!!!!!!/0.!(!*#*&'!(!0'"-10.'!
!! &'$(%=!a URI destino do vínculo
!! )&*+%=!+'2!(!0'%&/.'!(!'$3',!(!-*4'0!(!+-+'!
!! ,-!.,!$%=!-+5-/,!(!-+6'71'"*!(!-*4'0!(!+-+'!
!! !/!0$ = descrição detalhada
!! '*0$ = papel / contexto do vínculo
!! 0,1$0 = descrição sucinta (para exibição)

!! Exemplo de uso típico
! !8'&'$'+*-!20/345&'$(9:4**%;<<&1=/0>.-$:!<?!
4

Exemplos de link "tipo <a href>" e "<img>"
!"#$%&'()$&*'+,-.//")001112132456078880$&*'+-##
#$&*'+)/9":,-(*%"&:-## Conteúdo será substituído...
...quando o usuário
#$&*'+).5:;,-<:'=-##
solicitar.
#$&*'+)(.41,-5:"&>?:-##
#$&*'+)>?/@>/:,-4'A:B@:(/-C&*'+!0"C##
!*%6#$%&'()$&*'+,-.//")001112132456078880$&*'+-##
#$&*'+)/9":,-(*%"&:-##
#$&*'+).5:;,-7D3EF2G"6-##

Conteúdo será
embutido no
documento...

#$&*'+)(.41,-:%H:=-##
#$&*'+)>?/@>/:,-!"#!$%-0C##
... quando o
documento for
carregado.

5

XPointer
!! Função que recebe uma expressão XPath
!! Serve para apontar para um recurso ou parte do
documento

!! Para apontar para um recurso descoberto por uma
expressão XPath
!! xpointer(expressão)

!! Quado há campos marcados com ID no documento
destino, pode-se usar um ponteiro de referência
!! !"#$%&'()'!"('**+#,-"#%&'$(#.
!! -"#%&'$(#.

6

XML: uma introdução prática

X100

Helder da Rocha
(helder@argonavis.com.br)
Atualizado em Jan 2003

O que é um Esquema XML?
Documentos que aderem à
especificação (válidos)

!! O esquema representa uma classe
!! Os documentos são instâncias

Esquema (universo de
documentos válidos)
Documento
fora da
especificação

"!

Como definir esquemas:
"!
"!

DTD - Document Type Definition
W3C XML Schema

2

DTD vs. XML Schema
!! Um esquema é essencial para que haja comunicação
usando XML

!! Pode ser estabelecido "informalmente" (via
software)
!! Uso formal permite validação usando ferramentas
genéricas de manipulação de XML

!! Soluções padrão do W3C
DTD

<!ELEMENT contato
(nome, email, telefone)>
<!ATTLIST contato
codigo NMTOKEN #REQUIRED>

•! Simples mas não é XML
•! Não suporta namespaces
•! Limitado quando a tipos de dados

XML Schema
<xsd:schema
xmlns:xsd=".../XMLSchema">
<xsd:element name="contato">
<xsd:complexType>
<xsd:attribute name="codigo"
use="required">

•! É XML, porém mais complexo
•! Suporta namespaces
•! Permite definição de tipos

3

W3C XML Schema
!! Padrão para validação XML, modular, extensível, com
amplo suporte a tipos de dados
!! DTD
!! foco na estrutura
!! poucos recursos para controle de tipos de dados
!! baseado em sintaxe SGML
!! não suporta namespaces

!! XML Schema
!! tudo são tipos de dados; grande controle sobre tipos
!! estruturas são tipos; tipos podem ser estendidos, criados e
redefinidos
!! não 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" />
<xs:element name="imagem" type="imagemType"/>
<xs:attribute
<xs:attribute
<xs:attribute
<xs:attribute

name="href" type="xs:anyURI"/>
name="id" type="xs:ID"/>
name="nome" type="xs:string"/>
name="diametrokm" type="xs:decimal"/>

<xs:complexType name="imagemType">
<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>

Elementos
Atributos
Definição de
tipos de dados

5

Compare com um DTD
Exemplo de documento válido
em relação a este DTD
Modelo de conteúdo
(tipo de dados complexo)

<astro id="p5" nome="Jupiter">
<imagem href="jup31.jpg" />
<imagem href="jup32.jpg" />
</astro>

<!ELEMENT astro (imagem*) >
<!ELEMENT imagem EMPTY
>
<!ATTLIST imagem href
<!ATTLIST astro
<!ATTLIST astro
<!ATTLIST astro

Atributo sempre
associado a elemento

Elementos
Atributos

CDATA

#REQUIRED >

id
ID
#REQUIRED >
nome
CDATA
#REQUIRED >
diametrokm NMTOKEN #IMPLIED >

Tipos de dados simples
(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) é visível
Tipos não 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 básicos
como texto, números, 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 próprio
documento (e não necessitar de prefixo) se definidos
localmente
8

Fundamentos: Modelos de conteúdo
!! Definem a estrutura de tipos complexos
!! Modelos de conteúdo podem ser simples ou
complexos
!! São simples quando elemento é vazio ou quando
contém apenas texto
!! Modelo de conteúdo simples pode conter atributos

!! São complexos quando elemento contém outros
elementos
!! Elementos podem ser definidos localmente
!! Elementos globais podem ser reutilizados

9

Raiz e namespace
!! Um documento XML Schema tem a seguinte
estrutura mínima
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema">
... definições de elementos, atributos, tipos
</xs:schema>

!! Para usá-lo, a sub-árvore a ser validada (instância)
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">

!! Instância
<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
!! É possível gerar um esquema a partir de um DTD
!! Ferramentas criam elementos e atributos

!! Um esquema simples contém definições de
elementos de atributos
!! Elementos típicos 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 definição de um tipo ou
globalmente acessível (para reutilização)
<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
!! É possível criar novos tipos a partir de derivação dos
tipos existentes (globalmente acessíveis)
<xs:simpleType name="astroID">
<xs:restriction base="xs:ID">
<xs:pattern value="\c\d.*"/>
</xs:restriction>
</xs:simpleType>
Expressão regular

15

Tipos simples do XML Schema
anySimpleType
duration

dateTime

base64binary

time

date

hexbinary

NOTATION

gYearMonth

double

gYear

gMonth

anyURI

gDay

QName

float
boolean

string

decimal

normalizedString

nonPositiveInteger

integer

token

negativeInteger

long

language

Name
NCName

NMTOKEN
NMTOKENS

int
short

nonNegativeInteger
positiveInteger
unsignedLong
unsignedInt

byte
ID

IDREF
IDREFS

ENTITY
ENTITIES

unsignedShort
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 conteúdo 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 conteúdo complexo
!! Determina a organização dos elementos filho (se
uma lista de opções, uma seqüência, 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 também ser usados em modelos de conteúdo
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 seqüência de elementos
!! Equivalente ao modelo de conteúdo (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 conteúdo (a | b | c) no DTD
<xs:complexType
<xs:choice>
<xs:element
<xs:element
<xs:element

name="orbitaType">
name="estrela" type="estrelaType"/>
name="planeta" type="sateliteType"/>
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 introdução prática

X100

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

Atualizado em outubro de 2005

1

O que é XPath
!! XPath é uma linguagem usada para localizar
informações em um documento XML
!! Serve para navegar pelos nós e localizar dados
!! É usada por várias 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 não tem entidades (por
exemplo: &atilde;) ou blocos CDATA
!! O processador resolve todas as entidades antes do
processamento com XPath, e todas as entidades e seções
CDATA são convertidas em XML e texto
2

Exemplo de XPath
!! Uma expressão XPath é um caminho na árvore-fonte
que resulta em um
!! valor (número, 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
11
9999 4321

•! Relativos ao contexto !"#$%&%#+:
++'"#()*#+!"#$6!'"#()*#%$
++%,-,.#$,!'%)/#+!"#$6!%,-,.#$,!'%)/#%$
++%,-,.#$,!$01,2#!%,3%45+

!! Expressões XPath são 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 nós (similar, mas não igual, à àrvore DOM)
!! DOM opera sobre o documento XML cru, e pode
representar entidades e blocos CDATA

!! Os nós usados pelo XPath podem ser de sete tipos
!! Raiz (só há um desses)
!! Elemento
!! Atributo
!! Texto
!! Namespace
!! Instrução de processamento
!! Comentário

4

Tipos e valores
!! Cada nó, ao ser processado, produz um valor que
tem um tipo
!! O conteúdo de um nó processado pode ser
representado pelo conteúdo de texto do nó
!! Todos os nós de texto que não estiverem em atributos

!! O valor do nó pode conter um dos quatro* tipos de
conteúdo a seguir
!! uma estrutura de outros nós (node-set)
!! um escalar numérico (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

Expressões XPath 1.0
!! Os tipos de expressão suportadas por XPath são
relacionados aos tipos de dados
!! operações sobre nós da árvore-fonte (caminhos)
!! operações sobre texto
!! operações booleanas
!! operações numéricas

!! E cada tipo de expressão devolve um resultado que
pode ser um dos quatro tipos de dados
!! um conjunto de nós (node-set)
!! um texto (string)
!! um valor booleano (boolean)
!! um número (number)
6

Caminhos (location paths)
!! Um caminho é uma seqüência de passos de navegação na
árvore-fonte (documento-fonte)
!! Todo caminho resulta em um nó (node) ou conjunto de nós (node-set)

!! O resultado de um caminho produz um contexto

!! O nó de contexto: expressões seguintes relativas ao contexto
!! Se for um node-set, o processamento de cada nó do conjunto também
introduz um contexto: o nó corrente
/
!! Todo contexto tem um tamanho e uma posição

!! Caminhos podem ser absolutos ou relativos

elemento

!! absolutos: começam no nó raiz (iniciam com "/")
!! relativos: começam no nó do contexto (context node)

!! Exemplos:
!! !"#$%!&'&(&)*+!,$'-+!)&*+.:
!!

contexto é node-set 'neto',

que tem tamanho 2
//!//!0"$(+123.: caminho relativo a 'neto', nó corrente é
elemento <primo> na posição 3 (node-set tem tamanho 4)

filho
primo

neto
neto

primo
primo
primo

7

Passos
!! Um caminho contém uma seqüência de passos
!! Cada passo pode ter três partes
!! um eixo: descreve a direção 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 nós
!! nome do nó, tipo do nó

!! um predicado opcional: que reduz o conjunto com base
em características dos nós
!! atributos, valores de atributos, posição

!! 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 símbolos em vez dos nomes de alguns
eixos mais comuns
!! !"#$"%!&%'()*(#"+,-!! #"+,-!! .&*"%'-!! &''*/01'"--2
!! $3/+!--

!!"
#"
##"
$"
(ausência 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 comentários, nós de texto e
instruções 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 comentário

!! !"#$%%-.$*!//",01",/&.2*&"$,'()
!! qualquer instrução de processamento

!! !"#$%%-.$*!//",01",/&.2*&"$,'3456$3()
!! instrução <?alvo ... ?>

!! Nem todos os eixos podem ser usados com estes
testes (ex: parent ou attribute não podem)

12

Exemplos de passos simples
!! !"#$%&&'(%)*+
ou '(%)*+,
!! !"#$%&&ou -,
inclui elementos,
!! ./0)'1&&'(%)*+
ou 22, comentários, 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
!! Expressão 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)
!! expressão (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 (restrição do tipo 'and') no segundo passo
!! pai de <livro> precisa estar dentro de um bloco <usados>

14

Exemplos de caminhos equivalentes
(1)

(2)

(3)

(4)

!! !"#$%&''(!)*++*,-%./0-1+-%.''!"#".#")*2
!! 33!)*++*,-%./0-1+-%.''!"#".#")*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
!! 0$+)''$+$?$%&*2@24$05$%4"%&''$+$?$%&*2
!! AA$+$?$%&*22
!! 4$05$%4"%&/*#/0$+)''$+$?$%&*2
!! !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

Expressões booleanas (1)
!! Operadores de comparação
!! !"#"$
!! !"%#"$
!! !"&'()"$
!! !"*"$"ou !"&+()"$
!! !"&'()#"$
!! !"*#"$ ou !"&+()#"$

igualdade
diferença
a menor que b*
a maior que b*
a menor ou igual a b*
a maior ou igual a b*

* Se não forem usadas dentro de um documento XML, as expressões
podem ser escrita sem os escapes: a < b, a > b, a <= b, a >= b

16

Expressões booleanas (2)
!! Operadores booleanos
!! !"#$%&'()&!"#$*
!! !"#$%&&+$&!"#$*
!! (+,&-!"#$!..'+/
!! ,$0!-/ &
!! 1'2.!-/&

E lógico
OU lógico
Negação
verdadeiro
falso

17

Funções de node-set
!! !"#$%!"#$%&'%()*
!! conta o número de elementos de um conjunto
!! exemplos:
!! !"#$%&'()*$%++,!! !"#$%&!./01++,-

retorna 1 (um pai)
retorna no. de filhos

!! 0(2%&-3
!! Retorna o número com a posição do último elemento do
conjunto de nós correntes
!! '"2/%/"$&-3
!! o número com a posição do nó corrente dentro do
conjunto de nós correntes

18

Funções do nó de contexto
!! !"#$!"$%&
!! retorna um identificador unívoco 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

Expressões numéricas
!!
!!
!!
!!
!!
!!
!!
!!
!!

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

soma
subtração
multiplicação
divisão
resto
arredondamento
piso (arr. p/ baixo)
teto (arr. p/ cima)
somatório

20

Expressões de string
!! !"#!$%!"#$%&'"#$(&')))&'"#$*+'
!! concatena vários strings

!! &'(&%)*#+!"#$&',*,-,.&'/,0+'
!! retorna um fragmento do string procurado

!! &'(&%)*#+,$-%.)!"#$&'"#$123"-45.+'
!! começa no fim de str e termina depois de str_buscado

!! &'(&%)*#+,(.-").!"#$&'"#$123"-45.+'
!! começa no início de str e termina antes de str_buscado

21

Expressões de string (2)
!! !"#$%&'()*+,%-)!"#$%&

!! remove espaços em branco desnecessários e remove
espaços 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 máscara (e opcionalmente de acordo com o
locale especificado)
22

Expressões de teste de string
!! Retornam valor booleano
!! !"#$"!%&'"()!"#$%&"#'(#$%")"
!! *+,"#',!)!"#$%&"#'(#$%")"

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

23

XML: uma introdução prática

X100

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

Atualizado em março de 2007

1

Fundamentos de transformação
!  A transformação XSLT é realizada sobre a árvore de um
documento-fonte
!  A localização dos nós é feita com XPath

!  Todos os nós do documento são acessíveis
!  Pode-se transformar qualquer documento-fonte XML em outro
tipo de documento
!  HTML ou texto
!  XML (qualquer formato)

!  XSLT é uma linguagem de programação completa
!  Ou seja, é complexa e não se aprende em um dia
!  Este curso apresentará fundamentos* do XSLT e exemplos

!  A transformação XSLT pode acontecer dinamicamente ao
carregar um documento XML com um XSL vinculado
!  Pode também 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 prática e em mais profundidade com carga-horária de 24 horas)

2

Alternativas para geração de HTML ou SVG
!  Geração prévia no servidor
CSS

Servidor

XML

CSS

HTML

XSL

Cliente
Página

!  Geração durante carga no browser (limitado)
Servidor

CSS

CSS

XML

XML

XSL

XSL

Browser
Página
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

Transformação standalone
!  Para fazer uma transformação 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 programação para processar XML

Fonte XML
Processador

XSLT

Resultado
(XML, HTML, Texto)

Estilo XSLT
5

Transformação 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''

!  Faça a transformação
4;4$5)28"$6.!"#$%&'()='').&#-/0''

!  A árvore DOM resultante está em resDocument
* Veja código completo em exemplos/Java/TransformaXSLT.java

6

Transformação 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 saída
-+.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 transformação
!"#$%&'"()",341$"564+9-'./()$!C&$!..C&+",!)":/&

7

Transformação 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 parâmetros se precisar
!  !"#78*',-9.95','.1;#9.95C;D$;B9+/.;23$
!  !"#78*',-9.95','.1;#9.95E;D$;B9+/.;23$

!  Faça a transformação
!  !."#*&$/('-%$!"#78,.9&*F/.5G/)HI1!(')*+",$22$

!  O documento resultante está em $resultado

8

Transformação 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 transformação
,&)-"#.-*!.#(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
!  Através da ferramenta usada no curso (Eclipse, Oxygen, XML Spy, JEdit)
!  Através 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 execução de aplicações
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 parâmetros
$$!"#"$$%&'$(")*+,-./!"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(

!  Nós para seleção em XPath
!  >"#$%&"'#>C)* ( ( ( ( (
!  >"#$%&"'#>%$)3#4 ( ( ( (
!  >"#$%&"'#>%$)3#4>C5"$6)*" (

(-./01(
(<)%(*#(="&#)$%(
(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. Padrões
!  Templates usam padrões XPath (match) no lugar
de caminhos (select)
!  Caminho:

!"##$%#&

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

!  Padrão:

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

!  Na árvore ao lado, se o nó de
contexto for 34&11#)15(

!"##$%&

!"##$%&

!"##$%&

'$("&

'$("&

'$("&

01.%'$&

)*+,%'$&

-"./,%'$&

!  o caminho devolverá um conjunto vazio
!  o padrão devolverá um conjunto de três nós
14

Exemplos de padrões/caminhos
!  Atributos XSLT match, recebem padrões 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

Cabeçalho e <xsl:stylesheet>
!  Todos os elementos de uma folha de estilos são
definidos dentro de <xsl:stylesheet>
!  O esqueleto básico 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 básica
!  Uma folha de estilos básica possui um ou mais
templates
!  Boa prática é ter um template para cada nó que envolver
transformação: 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=(;&

pessoas

&&&&!#*%<=($@%H=(&$H=3?./@(**,H*/;&
&&&&&&&&!=);!#*%<H@@%>9=($@%H=(*&A;!A=);&
&&&&!A#*%<=($@%H=(;&
&&&&!#*%<=($@%H=(&$H=3?./@(**,H/;&
&&&&&&&&!=4;!#*%<H@@%>9=($@%H=(*&A;!A=4;&
&&&&!A#*%<=($@%H=(;&
!A#*%<*=>%(*?((=;&

/

pessoa

pessoa

17

Outro exemplo
!  O processador irá navegar pela árvore

!  Deve haver um template para cada nó a ser transformado
!  Não é necessário que haja um template para cada nó (se
não houver, ele é executado por default sem transformação)

!"#$%#&'$(#)((&*+(,#-./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!
!!!!"0#$%&'()*%+'(1!
!!!!"#$%&'()*%+'(!)+',-./*(4743/1!
!!!!!!!!"4781"#$%&+**%56'()*%+'($!01"04781!
!!!!"0#$%&'()*%+'(1!
!!!!"#$%&'()*%+'(!)+',-./'3'+%/1!
!!!!!!!!"*193'+%!43!:(4743&!"#$%&8+%;(63<!$(%(,'./=/01"0*1!
!!!!"0#$%&'()*%+'(1*
!7"#$%#&'$(#)((&D*

/
pedido
total

18

Uso do template com <xsl:apply-templates>
!  <xsl:apply-templates /> processa todos os filhos
(inclusive nós de texto)

!  Se algum elemento filho combinar com o match de um
template existente, esse template será processado
!  Se algum template não 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 não
&&&&!#*%<=($@%H=(&$H=3?./A/;&
tem um template
&&&&&&&&!J,4>;!#*%<H@@%>9=($@%H=(*&A;!AJ,4>;& também será
&&&&!A#*%<=($@%H=(;&
processado!
&&&&!#*%<=($@%H=(&$H=3?./@(**,H/;&
&&&&&&&&!@;!#*%<H@@%>9=($@%H=(*&A;!A@;&
&&&&!A#*%<=($@%H=(;&
&&&&!#*%<=($@%H=(&$H=3?./%K5H)/&A;&

pessoa

/
pessoas
lugar

Todo conteúdo da
árvore lugar será
omitido!

19

<xsl:apply-templates> com select
!  O atributo select pode ser usado para o <xsl:applytemplates> pular a outro nó da árvore fonte
!  As expressões XPath dentro dos elementos select são consideradas no
contexto dos nós 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+';&
&&&&!A#*%<=($@%H=(;&

Contexto é "/"

&&&&!#*%<=($@%H=(&$H=3?./@(**,H/;&
&&&&&&&&!@;!#*%<H@@%>9=($@%H=(*&A;!A@;&
&&&&!A#*%<=($@%H=(;&
!A#*%<*=>%(*?((=;&

20

Geração 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 conteúdo para texto
!  Expressão 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

Criação de texto com <xsl:text>
!  <xsl:text> pode ser usado para gerar texto
estático, formatar a saída, etc.
!  Preserva espaços, novas-linhas e tabuações
!  Útil para controlar forma de impressão 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
!  Várias regras de template estão 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 nós 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 dinâmicamente, é possível usar uma
sintaxe especial
!  !"#$%"&&'()*

!  Sintaxe chamada de “atrribute value templates”

!  As chaves consideram o valor da expressão 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 é possível criar atributos, é possível 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>
!  Ordenação

!  Aplica-se a cada nó do conjunto de nós do
contexto. Use dentro de <xsl:apply-templates>
!"#$%&''$()*+,'$&*+#-.
...!"#$%#/0*.#+$+1*2341/567/3.8-.
...!"#$%9&$:+)/;.#+$+1*23<3.8-.
!8"#$%&''$()*+,'$&*+#-.

!  Para ordenar números use o atributo 5&*&)
*('+23=:,>+03.(default é ordem alfabetica)
27

Criação de comentários
!  !"#$%&'(()*+,-+)"+'-!."#$%&'(()*+,-

!  Insere um comentário
!  !"#$%/0'&)##1*231*#+04&+1'*-*5()675$8'7,---&'*+)9:'-!."#$%/0'&)##1*231*#+04&+1'*,-

!  Insere uma instrução de processamento

28

Cópia rasa <xsl:copy>
!  <xsl:copy>
!  Usado para copiar o nó corrente (no contexto do template)
para o documento-resultado
!  Não 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*
************!"#$%=//$'F&(+/$=&(#*0B*
********!0"#$%C4/'B*
****!0"#$%&(+/$=&(B*
!0"#$%#&'$(#)((&B*

Oferece controle sobre o
que deve ser incluído na
cópia (no match do
template)

29

Cópia completa <xsl:copy-of>
!  <xsl:copy-of select=“expressão”>
!  Copia coisas (árvores, texto) para a árvore resultado
!  Se o select identifica um nodeset, todos os nós do nodeset
são copiados para a árvore resultado
!  O nó é copiado por completo (inclusive com atributos,
instruções de processamento, etc.)

!  Exemplo: XSLT que copia a entrada na saída:
!"#$%#&'$(#)((&*"+$,#%"#$-.)&&/%0011121324560788809:;0<5=,#>45+.**
****************?(5#@4,-.72A.B*
****!"#$%&(+/$=&(*+=&C)-.0.B*
********!"#$%C4/'D4>*#($(C&-.2.0B*
****!0"#$%&(+/$=&(B*

Não controla o que deve ser
incluído na cópia (copia o nó
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 conteúdo se a expressão 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'
!  true()

string contendo o texto ‘false’
valor booleano true

!  É fácil cometer erros primários
!"#$%&'()*#)+,!"#$,-.!/"#$%&'-(

!  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' não é vazio
34

Looping com <xsl:for-each>
!  Permite processar um conjunto de nós dentro da mesma regra
de template (sem recursão)
!  !"#$%&'()*+,-.#*$*,/01*"2(*##3'14..
555.!6&'()*+,-4.

!  O atributo select recebe uma expressão XPath que retorna um
node-set.
!  O node-set é a lista de nós correntes
!  O nó sendo processado a cada repetição é o nó corrente
!  O conteúdo de <xsl:for-each> está no contexto do nó corrente

!  Exemplo

Nó de contexto

Node-set com nós correntes
. .!"#$%/*72$+/*.7+/,-01!"#$%14.
.... .&'(!)*%$+,-./0(,!,.123.-4"15!%36.
........ .!"#$%8+$9*)'&.#*$*,/014%("1"%7891.64.
Posição do nó
........ .!"#$%/*"/45.!6"#$%/*"/4.
corrente dentro
da lista de nós
........ .!"#$%8+$9*)'&.#*$*,/011"15!%1.64.
correntes
0000 0&:'(!)*%$+,-./6.
Nó dentro do
contexto do nó
. .!6"#$%/*72$+/*4.
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 expressão que retorna o valor associado ao nó
corrente que será usado como critério de ordenação
!  !"#$%&'()$*&'+(*&,-./!"#!$%/0+
++++!"#$%1234'*,-+#'$',&./&''(")*/0+ Nós correntes
++++++++,-'./'*0)+'%.%$)123#%4%52+67+
++++++++!"#$%5*$6'421+#'$',&./3#%4%5/+70+
++++++++!"#$%&'"&0%+!7"#$%&'"&0+
++++++++!"#$%5*$6'421+#'$',&./8/+70+
assunto
++++!7"#$%1234'*,-0+
!7"#$%&'()$*&'0+

!  Pode haver mais de um <xsl:sort>,
com outro select, para ordenar
por outros campos associados ao
nó corrente
String usado
na ordenação

@dewey

Nó de contexto

indice
assunto
@dewey

texto
005.133

texto
920.4

36

Variáveis <xsl:variable>
!  Podem ser
!  Locais: definidas dentro do escopo de uma uma regra de template,
bloco <xsl:for-each>, etc.
!  Globais: definidas no primeiro nível, 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 contrário, não é possível mudar o valor
de uma variável. Isto não 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 solução é realizar operações 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 não são chamados automaticamente
durante o processamento de nós
!  Templates com name podem ser chamados de dentro de
outros templates, de definições de variáveis, 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

Parâmetros <xsl:param>
!  Parâmetros são quase o mesmo que variáveis
!!"#$%&'&("#$%&'(#)%&*("+&,&-.'(&/01(2"
!!"#$%&'&("#$%&'(#)%&3(2444!5/+,60$1$%2"
444"
!/+,67$,8&9):"+&,&-.'(;#)%&*("52"
!$"#$%&'(<=;#)%&3>(2!5$2"

!  São semelhantes a variáveis, mas diferem um pouco:
!  <xsl:variable> recebe o valor (resultante da expressão XPath) como
constante (não aceita outro valor); o select ausente (e elemento vazio)
equivale a um string vazio.
!  O select de <xsl:param> é opcional pois pode ser atribuído através de
chamadas <xsl:call-template> e <xsl:with-param> ou, se for
global, através de parâmetros passados externamente.

42

<xsl:param> e <xsl:with-param>
!  <xsl:with-param> permite definir parâmetros em um template
que são 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 não 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 execução do processador
!  É uma boa ferramenta para debugging
!  Pode-se usá-la para imprimir valores esperados enquanto se testa a
aplicação

!  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()
!  Função XPath (extensão XSLT): document(uri)
!  carrega um documento XML externo e retorna um node-set contendo a
raiz do documento

!  Seleção 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--

!  Seleção 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

Fusão de documentos-fonte
!  É possível, com document(), gerar um resultado a partir de
02-A%6/*+"#$%&
múltiplos documentos de entrada
!"#$%&%'($)*+,-%#*.&
!"#$%&%'($)*067#*.&
&&/(0121,&3&
&&/(0121,&9&
!4"#$%.&
!4"#$%.&
("#$%&
!"#$%&
!"#$%&%'($)*+,-%#*.&
!"#$%&%'($)*067#*.&
&&/(0121,&5&
&&/(0121,&8&
!4"#$%.&
!4"#$%.&
'"#$%&
)"#$%&

!,6A71B(%.&
&&!"#$%&%'($)*+,-%#*.&
&&&&/(0121,&3&
&&!4"#$%.&
===&
&&!"#$%&%'($)*067#*.&
&&&&/(0121,&8&
&&!4"#$%.&
!4,6A71B(%.&

!:,;#.&
&&!+(-<#6.3=>?-!4+(-<#6.&
&&!+(-<#6.9=>?-!4+(-<#6.&
&&!+(-<#6.5=>?-!4+(-<#6.&
&&!+(-<#6.8=>?-!4+(-<#6.&
!4:,;#.&

8#-%9-6:%2-;226&"""<&
8#-%91/0=/>%2&5/$2?@<(2%@&&
&&&&&&&&&&&&&&-2%2,6?@*+,A$256.4:,;#4+(-<#67@&B<&
&&8#-%962$C%/62&$/6,;?@4@<&
&&&&&8/0DA=1+-<8#-%94+032/,;&-2%2,6?@@<(2%@<&
*+,-"#$%&./01+0234+5627&
&&&&&&&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(expressão)
!  É uma função XPath do XSLT (extensão)
!  Gera um id unívoco para um conjunto de nós.
!  Cada vez que generate-id() for chamado em um nó, gera
sempre o mesmo id.
!  Pode receber como parâmetro a expressão 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

Indexação por chave unívoca <xsl:key>
!  Define um índice com três atributos
!  Sintaxe
!"#$%&'()*+,'-.*/,'.),+012-.3+456/.)7#'-.'"35.8)

!  name: nome do índice
!  match – expressão XPath que descreve os nós a serem
indexados
!  use – expressão 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 unívoca: key()
!  Função XSLT que referencia uma relação 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 contém 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 (códigos) 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 não oferece uma solução simples (existe em XSLT 2.0)
!  Esta é melhor técnica em XSLT 1.0 ("método Münch"):
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 expressão select:
4,-&.01&#&2$)&345657!'!1&#&2$)&3456!8&966()*+&6:!/012370;<!7<!

3.  IDs gerados do mesmo nó são sempre idênticos. A expressão compara o
nó corrente (.) com o primeiro item do grupo, logo a lista de nós
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 pertença ao grupo:
!!!!8&966()*+&6:!/01237!

53

Solução: ordenação 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 introdutório uma abordagem mais
profunda do XSLT
!  Mesmo assim, alguns elementos abaixo são comuns e devem ser
investigados: explore-os e analise os exemplos fornecidos

!  Método de geraçao de saída (muito usado)

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

!  Política de espaços e geração de texto (organiza a saída)
!  !"#$%)4,#,47,8#)9:,*,$,+,3(#/0)4,;*:&.,06!
!  !"#$%#(42)8#)9:,*,$,+,3(#/0<06*
!  atributo .2#9=$,8&'()'(*,#:9)23>*de !"#$%(,"(6*

!  Recursos de extensão e compatibilidade (essencial se você usa
extensões, XSLT 2.0 e ainda quer funcionar em browsers)
!  !"#$%?9$$=9:@6*
!  !"#$%39+,#)9:,89$29#6*

!  Formatação default para números (essencial para trocar ponto
decimal por vírgula)
!  !"#$%.,:2+9$8?&4+9(6*,*?'3AB&*?&4+9(83'+=,4CD*

55

XML: uma introdução prática

X100

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

Atualizado em setembro de 2001

1

XSL Formatting Objects
!! Aplicação XML para descrever o layout preciso de
texto e imagens em uma página
!! Elementos representam
!! Regras para formatação de várias páginas
!! Layout de páginas individuais, margens, rodapés
!! Hifenação, alinhamento, fontes, cores, leading
!! Imagens, gráficos, tabelas, listas, links

!! Isoladamente, XSL-FO não é folha de estilo
!! É formato final, com estrutura que visa a apresentação
(como XHTML) – linguagem de descrição de página
(como PDF ou PostScript)
!! Típicamente, 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/>
Ligação entre as
</fo:simple-page-master>
regras de layout e
</fo:layout-master-set>
o conteúdo 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 típico
!"#$%##&''
()*+,$"#-./&&0$112223243#%516777189:1;#%)<&.='
333'
!1"#$%##&='

!! Normalmente, documentos FO são 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>

!! contém "mestres de layout": templates reutilizáveis para
layout de páginas
!! cada mestre possui um identificador que é usado para
associá-lo a um bloco de conteúdo
!! o tipo de mestre mais simples é <simple-page-master>

!! 2) Pelo menos um <page-sequence>
!! onde fica o conteúdo
!! define uma seqüência de páginas em um documento
!! cada <page-sequence> deve estar associado a um
mestre de layout existente
!! contém objetos <flow> e/ou <static-content>
5

Cabeçalho
!! Cabeçalho mínimo
!"#$%&'($)*+,'-*./+-.*0!
!!!"#$%&'()*+,)-.+,(-&/+0!(-&/+0,1-(+23)435!
!!!!!!!!!"#$%0+.'$1,6$7895!
!!!!!"9#$%&'()*+,)-.+,(-&/+05!
!!!"1#$%&'($)*+,'-*./+-.*0!

!! <simple-page-master> define margens, altura e
largura da página e contém pelo menos uma região
!! master-name do elemento é ID para que elementos de
conteúdo <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 regiões
!! !"#$%&'()&*+,-.,

!! obrigatória
!! área de conteúdo principal da página
!! define um ID implícito (fixo): /01("#$%&'()&*+, para
uso por elementos de conteúdo de fluxo ou estático.

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

!>%2=9#(=8$#(28>-#"4+

28"$%'(-&=+

!! Margens do <simple-page-master>
limitam a área de impressão

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

!"#$%&'(8*-#"+34+

28"$%'("%$<-+

!"#$%&'()&57+34+

!"#$%&'(#'5+34+

!"#$%&'(>-8"-+34+

28"$%'(9#*-+

!! <region-body> ocupa todo o espaço
restante

!! Outras regiões opcionais podem ser
definidas sobre <region-body>
!"#$%&'()#*&"#+#,-#'-./012/34+
!"#$%&'(#'5+#,-#'-./612/34+

!! Margens de <region-body> devem ser
iguais ou maiores que os extent das
regiões marginais

!"#$%&'()&57+28"$%'(9#*-./0:;12/+++++++++++
+++++++++++28"$%'("%$<-./6:012/+++
+++++++++++28"$%'()&--&2./0:612/+
+++++++++++28"$%'(-&=./0:012/+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

Conteúdo
!! O conteúdo do documento pode estar
!! Em seções <flow>, que criam nova página quando o
texto preenche o espaço disponível na atual
!! Em seções <static-content>, que são repetidos em
todas as páginas da seqüência.

!! Regiões
!! Cada bloco de conteúdo deve estar associado a uma
região existente através do atributo flow-name:
!"#$%&'&()*)#+&,+&-!"#$%&'()*+,-"%.)/0#&%-1'.1+.-///!"#$"0#1-!"#$%&'()*+,-"%.)/0#&%2#34+.-///-

!! Blocos
!! Dentro de <flow> ou <static-content>, conteúdo
deve estar em blocos: <block>, <list-block>,
<table>, etc.

10

Blocos de conteúdo
<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"
conteúdo estático está
leader-length="16cm" />
associado com
</fo:block>
<fo:block text-align="end">página
<fo:page-number/>
</fo:block>
</fo:block>
</fo:block>
</fo:static-content>

region-after

Este bloco de
conteúdo de fluxo está
associado com
region-body

<fo:flow flow-name="xsl-region-body">
<fo:block font-family="serif" font-size="11pt">
Texto que pode atravessar páginas.
</fo:block>
</fo:flow>
</fo:page-sequence>

11

Blocos
!! Os elementos <flow> e <static-content> devem
conter elementos de bloco
!! <block>
!! <list-block>
!! <table>

Bloco de propósito geral
Bloco que contém itens de lista
Bloco que contém tabela

!! Blocos podem ter conteúdo misto, contendo texto e
elementos
!! <inline>
Trecho de propósito geral
!! <external-graphic> Imagem ou gráfico externo
!! <page-number>
Número de página
!! <basic-link>
Referência 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 são atributos XML
!! Maior parte das propriedades são iguais e têm 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)

!! Relação com CSS
!! Algumas propriedades CSS são elementos em XSL-FO
!! Alguns seletores CSS são 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">célula 1.1</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-family="monospace">célula 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 página
!! Objeto inline
!! !"#$%&#'()*
****!"#$+,-+./0&12.0345'*6.'789#+:25"8;)*
!;"#$%&#'()**
!! !"#$%&#'()*
****!"#$+,-+./0&12.0345'**
************6.'784--3$;;<<<:,:'#9;9#+:25"8;)*
!;"#$%&#'()*

16

<basic-link>
!! Vínculo de hipertexto
!! Vincula uma referência 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 variável
!! Exemplo (geração 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 página
!"#$%&'()*+,-.#$*+&/'.$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

Visualização
!! XSL-FO é uma linguagem de descrição de página
!! Páginas podem ser geradas por um programa que construa o
documento na memória (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
!! Visualização 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

Sign up to vote on this title
UsefulNot useful