47
1 Helder da Rocha www.argonavis.com.br <xml:transformação/> XML: uma introdução prática

xml100_6

Embed Size (px)

DESCRIPTION

xml100_6

Citation preview

1

Helder da Rochawww.argonavis.com.br

<xml:transformação/>

XML: uma introdução prática

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 &gt; 3) and not(9 &lt; 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() &gt; 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">

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

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