Você está na página 1de 47

XML: uma introduo prtica

<xml:transformao/>
Helder da Rocha
www.argonavis.com.br

Esta aula
Introduo a XSLT
fundamentos: principais elementos
passo-a-passo: como transformar
Fundamentos de XPath
linguagem para manipular rvores
XSLT
outros elementos
Fundamentos de XSL-FO
Exerccios
Gerao de HTML, XHTML, XML, XSL-FO, texto, ...

Por que transformar


Converter para um formato mais til
Atualizar documentos escritos em uma aplicao XML
obsoleta
Devolver resultados adequados para o cliente que ir uslos
Gerar formatos para
exibio
depurao
edio
transmisso

XSLT
XSL Transformations
Linguagem (XML) para criao de documentos que
contm regras de transformao para documentos XML
Documentos escritos em XSLT so chamados de
folhas de estilo e contm
Elementos XSLT: <template>, <if>, <foreach>, ...
Expresses XPath para localizar ns da rvore-fonte
Texto ou XML a ser gerado no documento-resultado

Processador XSLT
fonteToHtml.xslt

Folha de
estilos
fonte.xml

Documento
Fonte

Processador XSLT
Xalan, TrAX, Saxon
Netscape, I. Explorer

Documento
Resultado

Transformao XSL
A transformao XSL pode ocorrer em vrias etapas,

no cliente e/ou no servidor


No servidor, h maior flexibilidade:

Arquivos XML podem ser mesclados


Informaes podem ser extradas de vrios arquivos para

incluso em outro arquivo


Por exemplo: um ndice

Arquivo resultante pode ser XML, HTML, RTF ou

qualquer outro formato


Browser no precisa suportar XML

Transformao XSL no cliente


Em browsers que suportam XML e XSL, a

transformao dos dados pode ser realizada no


cliente
Browser deve ser capaz de entender XML e XSL
O resultado gerado pode ser XML ou HTML 4.0 (para

maior suporte)

Alm da transformao XSL, no servidor ou cliente, a

pgina pode ainda ser formatada com CSS.

Transformao XSLT
No servidor
Servidor
XML

CSS

CSS

Cliente

HTML
Pgina

XSL

No cliente
Servidor CSS

CSS

XML

XML

XSL

XSL

Cliente
Pgina
7

Fundamentos de transformao
A transformao XSLT realizada sobre a rvore de um

documento-fonte
Todos os ns do documento so acessveis. Tipos de n
disponveis:

Elemento
Atributo
Texto
Comentrio
Instruo de processamento
Namespace
Raiz

XSLT: documento-fonte (1)


Considere o seguinte documento-fonte:
<aeronave id="PTGWZ">
<origem partida="08:15">Rio de
Janeiro</origem>
<destino>Itabuna</destino>
</aeronave>
/
<aeronave>
@id

PTGWZ

<origem>

rvore-fonte

Rio de Janeiro
@partida

<destino>

08:15

Itabuna

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)

<xsl:template match="aeronave">
<p>A aeronave de prefixo
documento
<xsl:value-of select="@id" /> decolou
resultado
de <xsl:value-of select="origem" /> s
(em preto)
<xsl:value-of select="origem/@partida" />
tendo como destino o aeroporto de
<xsl:value-of select="destino" />.</p>
</xsl:template>
elementos XSLT
(em vermelho, com prefixo xsl)

Elementos XSLT geralmente so usados com um prefixo

associado ao seu namespace: <xsl:elemento> para evitar


conflitos com o documento-resultado.
10

XSLT: documento-resultado (3)


Aps a transformao, o resultado ser
<p>A aeronave de prefixo
PTGWZ decolou
de Rio de Janeiro s
8:15
tendo como destino o aeroporto de
Itabuna.</p>
Para obter outros resultados e gerar outros formatos

com os mesmos dados, deve-se criar folhas de estilo


adicionais
11

<template>
Bloco para transformao recursiva
Atributo match: contm expresso XPath para
localizao de padro (no caminho)
N de contexto: dentro do <template>, todas as
expresses XPath so relativas ao n corrente e lista de
ns correntes
Padro para combinao

<xsl:template match="elem/filho">
[[[<xsl:value-of select="." />]]]
</xsl:template>
Caminho relativo

12

<value-of>
Imprime o valor do n indicado pelo seu atributo

"select"

Converte todo o contedo para texto


Caminho relativo ao n corrente.

<xsl:template match="contxt">
<xsl:value-of select="elemento" />
</xsl:template>
No exemplo acima, select seleciona qualquer n que
contenha o string contxt/elemento
Use "." para valor de elemento corrente
Use "/" para referir-se a caminhos absolutos
13

<text>
Imprime texto
Preserva espaos, novas-linhas e tabuaes
til para controlar forma de impresso do texto
<xsl:template match="x">
<xsl:text>Quebra linha depois
</xsl:text>
</xsl:template>
<xsl:template match="y">
<xsl:text>No quebra
linha</xsl:text>
</xsl:template>
Atributo disable-output-escaping="yes" evita

substituio de entidades

14

<output>
Para produzir resultados diferentes de XML e definir

formato de dados de sada


texto

<xsl:output method="text" />


html
<xsl:output method="html" />
xml com DTD
<xsl:output method="xml"
doctype-public="-//PID//EN"
doctype-system="arquivo.dtd" />
Formatos diferentes de UTF-8
<xsl:output encoding="iso-8859-1" />
15

<apply-templates>
Faz chamada recursiva a prximo template (se no

tiver argumentos) ou indicado em atributo select

<xsl:template match="elemento">
Item 1: <xsl:apply-templates select="filho1"/>
Item 2: <xsl:apply-templates select="filho2"/>
</xsl:template>
<xsl:template match="filho1">
[<xsl:apply-templates />]
</xsl:template>
<xsl:template match="filho2">
(<xsl:apply-templates />)
</xsl:template>

16

Regras nativas
1. Processamento da raiz
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
2. Processamento de todos os elementos
<xsl:template match="*">
<xsl:apply-templates />
</xsl:template>
3. Processamento de texto
<xsl:template match="text()">
<xsl:value-of select="." />
</xsl:template>
17

Namespace

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
</xsl:stylesheet>

18

XPath
Como selecionar um ou mais ns da rvore-fonte?
Caminhos (location paths)
levam at um n ou um conjunto de ns atravs de passos de

navegao na rvore de um documento.

Padres de combinao (match patterns)


um tipo especial de caminho
levam at um n ou conjunto de ns atravs de combinao
de padres
no permite o uso de eixos ascendentes (..)

19

Expresses XPath
Os tipos de expresso so
operaes sobre ns da rvore-fonte (caminhos)
operaes sobre texto
operaes booleanas
operaes com resultado numrico
Cada tipo de expresso devolve um resultado que

pode ser um tipo de dados

um conjunto de ns (node set)


um texto (string)
um valor booleano (boolean)
um nmero (number)

20

Caminhos
Seqncia de passos at um determinado conjunto

de ns (node set)
Exemplo:

/raiz/elemento/filho/neto
../../primo[3]

Dois tipos
absolutos: comeam no n raiz (iniciam com "/")
relativos: comeam no n do contexto (context node)

21

Padres de combinao
So traduzidos em caminhos
Usados para combinao
Exemplo: <xsl:template match="...">
Resolvidos da direita para a esquerda
No podem conter eixos ascendentes
No pode: ../elemento
Pode: //elemento ou /ancestral//elemento
Devem ser a mais simples expresso que localize

o(s) n(s) desejado(s)

22

Caminhos vs. Padres


A expresso "nome" ter resultados

pessoas

diferentes se a expresso for um


caminho ou um padro

Caminho: [contexto atual]/nome


Padro: [quaisquer ancestrais]/nome

Na rvore ao lado, se o n de

contexto for <pessoas>

o caminho devolver um conjunto vazio


o padro devolver um conjunto de trs ns

pessoa

pessoa

pessoa

nome

nome

nome

Fulano Sicrano Beltrano

23

Onde usar padres/caminhos


Atributos XSLT match, recebem padres para

instanciar templates:

<xsl:template match="autor"> ...


<xsl:template match="livro//pagina[25]"> ...

Atributos XSLT select e test, usados dentro dos

templates, recebem caminhos:


<xsl:value-of select="../livro/titulo" />
<xsl:for-each select="@numero" > ...

24

<if>
Bloco condicional
Executa se expresso XPath passada retornar true
<xsl:if test="/raiz/elemento/filho">
<xsl:value-of select "@atrib_do_filho" />
</xsl:if>
<xsl:if test="(5 &gt; 3) and not(9 &lt; 4))">
....
</xsl:if>
<xsl:if test="starts-with(@nome, 'Sra. ')">
...
</xsl:if>

25

<choose> <when> <otherwise>


Condicional tipo case (if-then-else)
<xsl:choose>

<xsl:when test="../carro[@novo='true']">
...
</xsl:when>
<xsl:when test="../casa">
...
</xsl:when>
<xsl:when test="../salario/text() &gt; 10000">
...
</xsl:when>
<xsl:otherwise>
...
</xsl:otherwise>
</xsl:choose>

26

<sort>
Ordenao
Aplica-se a cada n do conjunto de ns do contexto. Use
dentro de <apply-templates>
<xsl:apply-templates>
<xsl:sort select="@codigo" />
<xsl:value-of select="." />
</xsl:apply-templates>

27

Looping com <for-each>


Permite processar um conjunto de ns dentro da

mesma regra de template (sem usar recurso)


<xsl:template match="livro">

<xsl:for-each select="capitulo">
<xsl:value-of select="position()" />
<xsl:text>. </xsl:text>
<xsl:value-of select="titulo" />
</xsl:for-each>
</xsl:template>

28

<for-each> e <sort>
<sort> pode ser usado dentro de <for-each> para

ordenar os elementos

<xsl:template match="indice">

<xsl:for-each select="assunto">
<xsl:sort select="@codigo_dewey" />
<xsl:value-of select="@codigo_dewey" />
<xsl:text>: </xsl:text>
<xsl:value-of select="." />
</xsl:for-each>
</xsl:template>

29

XSL Formatting Objects


Aplicao XML para descrever o layout preciso de

texto e imagens em uma pgina


Elementos representam

Regras para formatao de vrias pginas


Layout de pginas individuais, margens, rodaps
Hifenao, alinhamento, fontes, cores, leading
imagens, grficos, tabelas, listas, links

Isoladamente, XSL-FO no folha de estilo


formato final, com estrutura que visa a apresentao
(como XHTML)
Tpicamente, se cria um XSLT que gera FO a partir de
uma fonte XML
30

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/>
Ligao entre as
</fo:simple-page-master>
regras de layout e
</fo:layout-master-set>
o contedo afetado

<fo:page-sequence master-name="p1">
<fo:flow flow-name="xsl-region-body">
<fo:block color="blue" font-size="20pt">Hello!</fo:block>
<fo:flow>
</fo:page-sequence>
Este o "<body>"
do XSL-FO

</fo:root>

31

<root>
Raiz do documento XSL-FO
Define o namespace

http://www.w3.org/1999/XSL/Format

Uso tpico

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
...
</fo:root>

Normalmente, documentos FO so gerados com XSLT

<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:apply-templates />
</fo:root>
</xsl:template>

32

Estrutura do documento
O elemento <root> deve conter
Um <layout-master-set> que contm "mestres de
layout"
definem templates reutilizveis para layout de pginas
cada mestre possui um identificador que usado para

associ-lo a um bloco de contedo


o tipo de mestre mais simples (e o nico atualmente
suportado pelos processadores) <simple-page-master>

Pelo menos um <page-sequence>, onde fica o contedo


define uma seqncia de pginas em um documento
cada <page-sequence> deve estar associado a um mestre de
layout existente
contm objetos <flow> e/ou <static-content>
33

Cabealho
Cabealho mnimo

<fo:layout-master-set>
<fo:simple-page-master master-name="p1">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>

<simple-page-master> define margens, altura e largura da

pgina e contm pelo menos uma regio

master-name do elemento ID para que elementos de contedo

<page-sequence> possam referenci-lo


Atributos tpicos (ID e dimenses da pgina)
<fo:simple-page-master master-name="p1"
margin-top="1.5cm" margin-bottom="2cm"
margin-left="2.5cm" margin-right="1.5cm"
page-width="21cm" pageheight="29.7cm">
... regies afetadas ...
</fo:simple-page-master>
34

Regies
H cinco regies
<region-body />

obrigatria
rea de contedo principal da pgina
define um ID implcito (fixo): xsl-region-body, para uso por

elementos de contedo de fluxo ou esttico.

<region-start /> e <region-end />


Em documentos de linguagem ocidental, start a margem
esquerda e end margem direita.
IDs: xsl-region-start e xsl-region-end
<region-before /> e <region-after />
before a margem superior, after a margem inferior.
IDs: xsl-region-before e xsl-region-after.
35

Margens e regies

<simple-page-master>

margin-top

<region-after />
margin-bottom

margin-right

<region-body />

<region-end />

<region-start />

margin-left

<region-before />

Margens do <simple-page-master>
limitam a rea de impresso
<region-body> ocupa todo o espao
restante
Outras regies opcionais podem ser
definidas sobre <region-body>
<region-before extent="2cm"/>
<region-end extent="1cm"/>

Margens de <region-body> devem ser


iguais ou maiores que os extent das
regies marginais
<region-body margin-left="2.7cm"
margin-right="1.2cm"
margin-bottom="2.1cm"
margin-top="2.2cm" />

36

XSLT
Layout geralmente permanece fixo em folha XSLT+FO
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="p1">
<fo:region-before extent="2cm"/>
<fo:region-end extent="1cm"/>
<fo:region-after extent="1.9cm"/>
<fo:region-start extent="2.5cm"/>
<fo:region-body margin-left="2.7cm"
margin-right="1.2cm"
margin-bottom="2.1cm"
margin-top="2.2cm" />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-name="p1">
<xsl:apply-templates />
</fo:page-sequence>
</fo:root>
</xsl:template>

37

Contedo
O contedo do documento pode estar
Em blocos <flow>, que criam nova pgina quando o
texto preenche o espao disponvel na atual
Em blocos <static-content>, que so repetidos em todas
as pginas da seqncia.
Regies
Cada bloco de contedo deve estar associado a uma
regio existente atravs do atributo flow-name:
<fo:static-content flow-name="xsl-region-start"> ...
<fo:flow flow-name="xsl-region-body"> ...

Blocos
Dentro de <flow> ou <static-content>, contedo deve
estar em blocos: <block>, <list-block>, <table>, etc.
38

Blocos de contedo
<fo:page-sequence master-name="p1" font-size="8pt">
<fo:static-content flow-name="xsl-region-after">
<fo:block>
Este bloco de
<fo:leader leader-pattern="rule"
contedo esttico est
leader-length="16cm" />
associado com
region-after

</fo:block>
<fo:block text-align="end">pgina
<fo:page-number/>
</fo:block>
</fo:block>
</fo:block>
</fo:static-content>

Este bloco de
contedo 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 pginas.
</fo:block>
</fo:flow>
</fo:page-sequence>

39

Blocos
Os elementos <flow> e <static-content> devem conter

elementos de bloco

<block> Bloco de propsito geral


<list-block> Bloco que contm itens de lista
<table> Bloco que contm tabela

Blocos podem ter contedo misto, contendo texto e

elementos

<inline> Trecho de propsito geral


<external-graphic> Imagem ou grfico externo
<page-number> Nmero de pgina
<basic-link> Referncia de hipertexto
<instream-foreign-object> Cdigo XML embutido (SVG, por
exemplo)
<leader> Linhas e outros decoradores

40

Propriedades
Propriedades de estilo podem ser aplicadas em <flow>,

<static-content> e em quaisquer elementos descendentes


Propriedades so atributos
Maior parte das propriedades so iguais e tm mesma
sintaxe que as propriedades do CSS
<fo:block font-family="tahoma, sans-serif" font-size="12pt"

color="rgb(255, 45, 45)" margin-top="1cm"


font-weight="bold" text-align="center">
Uma <fo:inline color="blue">linha</fo:inline> de texto
</fo:block>
Algumas propriedades CSS so elementos em XSL-FO
Alguns seletores CSS so atributos em XSL-FO

Suporte s propriedades depende do processador


41

<table>
<fo:table>
<fo:table-header>
<fo:table-cell>
<fo:block font-family="tahoma, sans"
font-weight="bold">Coluna 1</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-family="tahoma, sans"
font-weight="bold">Coluna 2</fo:block>
</fo:table-cell>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block font-family="monospace">clula 1.1</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-family="monospace">clula 1.2</fo:block>
</fo:table-cell>
</fo:table-row>
...
<fo:table-row> ... </fo:table-row>
</fo:table-body>
</fo:table>

42

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

43

<external-graphic>

Permite incluir uma imagem na pgina


Objeto inline
<fo:block>

<fo:external-graphic src="moe.gif"/>
</fo:block>
<fo:block>
<fo:external-graphic
src="http://www.x.com/moe.gif"/>
</fo:block>

44

<basic-link>
Vnculo de hipertexto
Vincula uma referncia de ID a um ID
Geralmente, quando o documento gerado via XSLT, o
ID obtido do elemento ao qual se quer vincular ou via
alguma varivel
Exemplo:
<fo:basic-link internal-destination="{@id}"
text-decoration="underline"
color="blue">
<xsl:value-of select="@codigo"/>
</fo:basic-link>

45

<instream-foreign-object>

Permite embutir outra linguagem XML na pgina


<fo:instream-foreign-object>
<svg:svg
xmlns:svg="http://www.w3.org/2000/svg"
width="300" height="300"
viewbox="0 0 300 300">
<svg:circle style="fill: green"
r="50" cx="150" cy="150" />
</svg:svg>
</fo:instream-foreign-object>

46

Visualizao
XSL-FO uma linguagem de descrio de pgina
Pginas podem ser geradas por um programa que construa o

documento na memria (como faz o browser com HTML e


CSS) ou que gere um arquivo
PostScript, PDF: Apache FOP, RenderX XEP, REXP
RTF (MS-Word): JFOR, RenderX
Visualizao em browser: IBM XFC

Ferramentas para desenvolver FO


HP FOA

Para rodar o FOP (arquivo .bat em c:\xml)


fop arquivo.fo arquivo.pdf

Para rodar o JFOR (arquivo .bat em c:\xml)


jfor arquivo.fo arquivo.doc

47