Upload
robson-mamede
View
220
Download
2
Embed Size (px)
DESCRIPTION
xml100_6
Citation preview
2
Esta aula
§ Introdução a XSLT§ fundamentos: principais elementos§ passo-a-passo: como transformar
§ Fundamentos de XPath§ linguagem para manipular árvores
§ XSLT§ outros elementos
§ Fundamentos de XSL-FO§ Exercícios§ Geração de HTML, XHTML, XML, XSL-FO, texto, ...
3
Por que transformar
§ Converter para um formato mais útil§ Atualizar documentos escritos em uma aplicação XML
obsoleta§ Devolver resultados adequados para o cliente que irá usá-
los§ Gerar formatos para § exibição§ depuração§ edição§ transmissão
4
XSLT
§ XSL Transformations§ 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 e contêm§ Elementos XSLT: <template>, <if>, <foreach>, ...§ Expressões XPath para localizar nós da árvore-fonte§ Texto ou XML a ser gerado no documento-resultado
§ Processador XSLT
Processador XSLTXalan, TrAX, Saxon
Netscape, I. Explorer
Folha deestilos
DocumentoResultado
DocumentoFonte
fonteToHtml.xslt
fonte.xml
5
Transformação XSL
§ A transformação XSL pode ocorrer em várias etapas, no cliente e/ou no servidor§ No servidor, há maior flexibilidade:§ Arquivos XML podem ser mesclados§ Informações podem ser extraídas de vários arquivos para
inclusão em outro arquivo§ Por exemplo: um índice
§ Arquivo resultante pode ser XML, HTML, RTF ou qualquer outro formato§ Browser não precisa suportar XML
6
Transformação XSL no cliente
§ Em browsers que suportam XML e XSL, a transformação 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)§ Além da transformação XSL, no servidor ou cliente, a
página pode ainda ser formatada com CSS.
7
Transformação XSLT
§ No servidor
§ No cliente
Servidor Cliente
XML
XSL
HTML
CSS
PáginaCSS
Servidor Cliente
XML
XSL
XML
XSL
CSS
Página
CSS
8
Fundamentos de transformação
§ A transformação XSLT é realizada sobre a árvore de um documento-fonte
§ Todos os nós do documento são acessíveis. Tipos de nódisponíveis: § Elemento§ Atributo§ Texto§ Comentário§ Instrução de processamento§ Namespace§ Raiz
9
Rio de Janeiro
08:15
XSLT: documento-fonte (1)
§ Considere o seguinte documento-fonte:
<aeronave id="PTGWZ"><origem partida="08:15">Rio de
Janeiro</origem><destino>Itabuna</destino>
</aeronave>
§ Árvore-fonte
/
@id
@partida
<aeronave>
<origem>
<destino>
PTGWZ
Itabuna
10
XSLT: folha de estilos (2)
§ O seguinte template (parte de uma folha de estilos XSLT) pode extrair os dados do documento-fonte
<xsl:template match="aeronave"><p>A aeronave de prefixo <xsl:value-of select="@id" /> decoloude <xsl:value-of select="origem" /> às <xsl:value-of select="origem/@partida" />tendo como destino o aeroporto de <xsl:value-of select="destino" />.</p>
</xsl:template>
§ Elementos XSLT geralmente são usados com um prefixoassociado ao seu namespace: <xsl:elemento> para evitar conflitos com o documento-resultado.
documento-fonte(em azul - XPath)
documentoresultado
(em preto)
elementos XSLT(em vermelho, com prefixo xsl)
11
XSLT: documento-resultado (3)
§ Após a transformação, o resultado será<p>A aeronave de prefixo PTGWZ decoloude Rio de Janeiro às 8:15tendo como destino o aeroporto deItabuna.</p>
§ Para obter outros resultados e gerar outros formatos com os mesmos dados, deve-se criar folhas de estilo adicionais
12
<template>
§ Bloco para transformação recursiva§ Atributo match: contém expressão XPath para
localização de padrão (não é caminho)§ Nó de contexto: dentro do <template>, todas as
expressões XPath são relativas ao nó corrente e lista de nós correntes
<xsl:template match="elem/filho">[[[<xsl:value-of select="." />]]]
</xsl:template>
Padrão para combinação
Caminho relativo
13
<value-of>
§ Imprime o valor do nó indicado pelo seu atributo "select"§ Converte todo o conteúdo 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
14
<text>
§ Imprime texto§ Preserva espaços, novas-linhas e tabuações§ Útil para controlar forma de impressão do texto<xsl:template match="x">
<xsl:text>Quebra linha depois</xsl:text>
</xsl:template><xsl:template match="y">
<xsl:text>Não quebra linha</xsl:text></xsl:template>
§ Atributo disable-output-escaping="yes" evita substituição de entidades
15
<output>
§ Para produzir resultados diferentes de XML e definir formato de dados de saída§ 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" />
16
<apply-templates>
§ Faz chamada recursiva a próximo template (se não 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>
17
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>
18
Namespace
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
</xsl:stylesheet>
19
XPath
§ Como selecionar um ou mais nós da árvore-fonte?§ Caminhos (location paths)§ levam até um nó ou um conjunto de nós através de passos de
navegação na árvore de um documento.§ Padrões de combinação (match patterns)§ um tipo especial de caminho§ levam até um nó ou conjunto de nós através de combinação
de padrões§ não permite o uso de eixos ascendentes (..)
20
Expressões XPath
§ Os tipos de expressão são§ operações sobre nós da árvore-fonte (caminhos)§ operações sobre texto§ operações booleanas§ operações com resultado numérico
§ Cada tipo de expressão devolve um resultado que pode ser um tipo de dados§ um conjunto de nós (node set)§ um texto (string)§ um valor booleano (boolean)§ um número (number)
21
Caminhos
§ Seqüência de passos até um determinado conjunto de nós (node set)§ Exemplo: § /raiz/elemento/filho/neto§ ../../primo[3]
§ Dois tipos§ absolutos: começam no nó raiz (iniciam com "/")§ relativos: começam no nó do contexto (context node)
22
Padrões de combinação
§ São traduzidos em caminhos§ Usados para combinação§ Exemplo: <xsl:template match="...">
§ Resolvidos da direita para a esquerda§ Não podem conter eixos ascendentes§ Não pode: ../elemento§ Pode: //elemento ou /ancestral//elemento
§ Devem ser a mais simples expressão que localize o(s) nó(s) desejado(s)
23
Caminhos vs. Padrões
§ A expressão "nome" terá resultados diferentes se a expressão for um caminho ou um padrão§ Caminho: [contexto atual]/nome§ Padrão: [quaisquer ancestrais]/nome
§ Na árvore ao lado, se o nó de contexto for <pessoas>§ o caminho devolverá um conjunto vazio § o padrão devolverá um conjunto de três nós
pessoas
pessoa
nome
pessoa
nome
pessoa
nome
Sicrano BeltranoFulano
24
Onde usar padrões/caminhos
§ Atributos XSLT match, recebem padrões 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" > ...
25
<if>
§ Bloco condicional§ Executa se expressão XPath passada retornar true§ <xsl:if test="/raiz/elemento/filho">
<xsl:value-of select "@atrib_do_filho" /></xsl:if>§ <xsl:if test="(5 > 3) and not(9 < 4))">
....</xsl:if>§ <xsl:if test="starts-with(@nome, 'Sra. ')">
...§ </xsl:if>
26
<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() > 10000">
...</xsl:when><xsl:otherwise>
...</xsl:otherwise>
</xsl:choose>
27
<sort>
§ Ordenação§ Aplica-se a cada nó do conjunto de nós do contexto. Use
dentro de <apply-templates>§ <xsl:apply-templates>
<xsl:sort select="@codigo" /><xsl:value-of select="." />
</xsl:apply-templates>
28
Looping com <for-each>
§ Permite processar um conjunto de nós dentro da mesma regra de template (sem usar recursão)§ <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>
29
<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>
30
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)§ Típicamente, se cria um XSLT que gera FO a partir de
uma fonte XML
31
Hello World
<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/></fo:simple-page-master>
</fo:layout-master-set>
<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>
</fo:root>
Este é o "<body>" do XSL-FO
Este é o "<head>" do XSL-FO
Ligação entre asregras de layout e
o conteúdo afetado
32
<root>
§ Raiz do documento XSL-FO§ Define o namespace§ http://www.w3.org/1999/XSL/Format
§ Uso típico<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
...</fo:root>
§ Normalmente, documentos FO são gerados com XSLT<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"><xsl:apply-templates />
</fo:root></xsl:template>
33
Estrutura do documento
§ O elemento <root> deve conter§ Um <layout-master-set> que contém "mestres de
layout"§ definem 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 (e o único atualmente
suportado pelos processadores) é <simple-page-master>§ 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>
34
Cabeçalho
§ Cabeçalho mínimo<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 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§ Atributos típicos (ID e dimensões da página)
<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" page-
height="29.7cm">... regiões afetadas ...
</fo:simple-page-master>
35
Regiões
§ Há cinco regiões§ <region-body />§ obrigatória§ área de conteúdo principal da página§ define um ID implícito (fixo): xsl-region-body, para uso por
elementos de conteúdo de fluxo ou estático.§ <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.
36
Margens e regiões
• Margens do <simple-page-master> limitam a área de impressão
• <region-body> ocupa todo o espaço restante
• Outras regiões 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 regiões marginais<region-body margin-left="2.7cm"
margin-right="1.2cm" margin-bottom="2.1cm"margin-top="2.2cm" />
<region-body />
<region-after />
<region-before />
<region-end />
<region-start />
margin-top
margin-bottom
mar
gin
-rig
ht
mar
gin
-lef
t<simple-page-master>
37
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>
38
Conteúdo
§ O conteúdo do documento pode estar§ Em blocos <flow>, que criam nova página quando o
texto preenche o espaço disponível na atual§ Em blocos <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:§ <fo:static-content flow-name="xsl-region-start"> ...§ <fo:flow flow-name="xsl-region-body"> ...
§ Blocos§ Dentro de <flow> ou <static-content>, conteúdo deve
estar em blocos: <block>, <list-block>, <table>, etc.
39
Blocos de conteúdo<fo:page-sequence master-name="p1" font-size="8pt">
<fo:static-content flow-name="xsl-region-after"><fo:block>
<fo:leader leader-pattern="rule"leader-length="16cm" />
</fo:block><fo:block text-align="end">página
<fo:page-number/></fo:block>
</fo:block></fo:block>
</fo:static-content>
<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>
Este bloco deconteúdo estático está
associado com region-after
Este bloco deconteúdo de fluxo está
associado com region-body
40
Blocos
§ Os elementos <flow> e <static-content> devem conter elementos de bloco§ <block> Bloco de propósito geral§ <list-block> Bloco que contém itens de lista§ <table> 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> Código XML embutido (SVG, por
exemplo)§ <leader> Linhas e outros decoradores
41
Propriedades
§ Propriedades de estilo podem ser aplicadas em <flow>, <static-content> e em quaisquer elementos descendentes
§ Propriedades são atributos§ Maior parte das propriedades são iguais e têm 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 são elementos em XSL-FO§ Alguns seletores CSS são atributos em XSL-FO
§ Suporte às propriedades depende do processador
42
<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>
43
<list-block>
<fo:list-block>
<fo:list-item>
<fo:list-item-label>
<fo:block font-size="20pt" color="red">
•
</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="70pt">
<fo:block>
Item um
</fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item> ... </fo:list-item>
...
</fo:list-block>
44
<external-graphic>
§ Permite incluir uma imagem na página§ 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>
45
<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:<fo:basic-link internal-destination="{@id}"
text-decoration="underline"color="blue">
<xsl:value-of select="@codigo"/></fo:basic-link>
46
<instream-foreign-object>
§ Permite embutir outra linguagem XML na página<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>
47
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
§ 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