Tópicos de Sistemas
de Informação A
Carlos Oberdan Rolim
Ciência da Computação
XSL
(eXtensible Stylesheet Language)
XSL - Motivação
Vantagens de separar apresentação de conteúdo:
Múltiplos formatos de saída: tamanhos diferentes, mídias diferentes (papel,
online), dispositivos diferentes (PDA, celular, PC)
Interface voltada para usuário (ex.: acessabilidade), cores, fontes, etc.
Uso de estilos padrões
Liberdade do autor não se preocupar com apresentação, que será tratada depois
por um profissional.
Opções para mostrar XML
O que faz uma folha de estilo?
Especifica a apresentação de XML em duas categorias:
Uma transformação opcional do documento de entrada em outra
estrutura
Uma descrição de como apresentar a informação transformada
O que faz um folha de estilo?
geração de texto
supressão de conteúdo
mover texto
duplicar texto
ordenação
transformações mais complexas que computam nova
informação baseada na informação existente.
Revisão de CSS
CSS - Cascade Style Sheet
Define o estilo de um documento para apresentação
Pode ser inline ou externa ao documento
External Style Sheets
External Style Sheets
Contidas num arquivo.css
Único style sheet usado por múltiplas páginas
Usado com o elemento link
Exemplo de um CSS
/* styles.css
*/
/* An external stylesheet */
a { text-decoration: underline;
color: red;
background-color: #ccffcc }
li em
{ color: red;
font-weight: bold}
ul
{ margin-left: 2cm }
<html>
<!-- Linking external style sheets -->
<head>
<title>Exemplo de CSS</title>
<link rel = "stylesheet" type = "text/css”
href = "styles.css">
</head>
XSL - Princípios gerais
Como CSS, funcionamento a base de regras
CSS não modifica a estrutura de um documento, XSL
sim
XSL utiliza a sintaxe XML
XSL - Histórico
XML derivada de SGML
Padronizada pelo W3C
XSL derivada de DSSSL (Document Style Semantics and
Specification Language)
Primeira proposta formal em 1997 pela W3C (já continha
conceitos de XSLT, como uso de templates)
Novembro de 1999 XSLT tornou-se uma recomendação da
W3C
Última versão de XSL: Outubro de 2001 (incluindo XSL-FO)
Componentes de XSL
XSL consiste logicamente de 3 componentes:
XPath: XML Path Language-- linguagem para referenciar
partes específicas de um documento XML
XSLT: XSL Transformations-- linguagem para descrever
como transformar um documento XML (representado como
uma árvore) em outro
XSL-FO: uma descrição de um conjunto de Formatting
Objects e Formatting Properties
XSLT - Características
Linguagem declarativa
Descreve a transformação desejada, ao invés de prover uma sequência
de instruções procedurais
XSLT é essencialmente uma “ferramenta” para transformar
documentos XML
XSLT manipula árvores
Uso de XSL Namespaces - O W3C provê um namespace para
tags XSL
XSLT - Características
Processadores XSLT
Aplicam um stylesheet XSLT a um documento origem XML e produz
um documento resultado.
Tratam árvores
Exemplos de processadores: Saxon, xt, MSXML, Xalan (Apache)
Maioria dos Web browsers já trazem tal processador
XSLT - Estrutura de uma folha XSL
Uma folha XSL é um conjunto de regras
Uma regra associa um seletor a uma forma ou modelo
O seletor define a estrutura a qual pode-se aplicar esta regra
A forma define a estrutura da sub-árvore gerada quando da
ativação da regra
Se várias regras se aplicam a um elemento, a mais
específica é executada
XSLT - Características
Elemento raiz de um documento XSL é <xsl:stylesheet> ou
<xsl:transform>
<xsl:stylesheet version=“1.0”
xmlns:xsl=http://www.w3.org/1999/XSL/Transform>
Documento XSL: Cabeçalho XML + <xsl:stylesheet> ou
<xsl:transform> + Conjunto de regras de template
<?xml version=“1.0” encoding=ISO-8859-1”?>
<xsl:stylesheet version=“1.0” xmlns:xsl=http://www.w3.org/1999/XSL/Transform>
<xsl:template match=“”>
corpo do template
</xsl:template>
…
<xsl:template match=“”>
corpo do template
</xsl:template>
</xsl:stylesheet>
XSLT - Características
O corpo das regras de template é constituído por:
Expressões XPath
Elementos XSLT
Funções XSLT e XPath
Permite manipular partes de um documento
Duas formas de utilizar um arquivo xsl:
Através de uma linha de comando, que referencia os documentos
envolvidos na transformação (p.e, o xml origem, o html resultado e o
xslt)
Incluindo uma referência no próprio arquivo xml
<?xml version=“1.0” encoding=“iso-8859-1”?>
<saudacao>Bem-vindo!</saudacao>
Saudacao.xml
<html>
<head>
<title>Saudação de Hoje</title>
Saudacao.html
</head>
<body>
<p>Bem-vindo!</p>
</body>
</html>
Saudacao.xsl
<?xml version=“1.0” encoding=“iso-8859-1”?>
<xsl:stylesheet version=“1.0” xmlns:xsl=“http://www.w3.org/1999/XSL/Transform”>
<xsl:template match=“/”>
<html>
<head>
<title>Saudação de Hoje</title>
</head>
<body>
<p><xsl:value-of select=“saudacao”/></p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Linha de comando para transformar Saudacao.xml em
Saudacao.html via Saudacao.xsl:
C:>saxon Saudacao.xml Saudacao.xsl > Saudacao.html
Inclusão de uma referência ao arquivo xsl no próprio arquivo xml:
<?xml version=“1.0” encoding=“iso-8859-1”?>
<?xml-stylesheet type=“text/xsl” href=“saudacao.xsl”?>
<saudacao>Bem-vindo!</saudacao>
Saudacao.xml
Exemplo 2
Stylesheet que transforma elementos <para> e <emphasis>
para HTML:
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="para">
<p><xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="emphasis">
<i><xsl:apply-templates/></i>
</xsl:template>
</xsl:stylesheet>
Exemplo 2(cont)
Com a stylesheet anterior, o documento XML:
<?xml version='1.0'?>
<para>Isto é um <emphasis>teste</emphasis>.</para>
seria transformado em:
<?xml version="1.0" encoding="utf-8"?>
<p>Isto é um <i>teste</i>.</p>
Exemplo 3:
XML
<capitulo titulo = introducao>
Texto do capitulo
</capitulo>
XSL
<xsl:template match=“capitulo”>
<H1> <xsl:value-of select=“./@titulo”> </H1>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match=“text()”>
<xsl:value-of select=“.”/>
</xsl:template>
HTML
<H1> Introducao </H1>
Texto do capitulo
Templates
A maioria dos templates têm a seguinte forma:
<xsl:template match="emphasis">
<i><xsl:apply-templates/></i>
</xsl:template>
O elemento <xsl:template> é um template
O match pattern determina onde este template se aplica
Elementos XSLT vêm do XSL namespace
Linguagem XPath
Consiste em uma sintaxe para especificar partes de um
documento XML
Baseada em expressões de caminhos (path expressions)
Percursos no grafo XML
Usada por vários outros padrões XML
XQuery, XSLT, XPointer, etc.
Linguagem XPath
Consiste em uma sintaxe para especificar partes de um
documento XML usando path expressions
Baseada em expressões de caminhos (path expressions)
Percursos no grafo XML
Usada por vários outros padrões XML
XQuery, XSLT, XPointer, etc.
Linguagem XPath
O resultado de uma expressão de caminho é uma sequência
de nós ou valores primitivos
Compilador determina qual é o tipo do resultado
Pesquisa nos diferentes “eixos” de um documento XML
Ascendentes, descendentes, irmãos, etc.
XSLT – Expressões XPath
Uma path expression é uma sequência de passos separados por “/”
Análogo a nomes de arquivos numa hierarquia de diretórios
Resultado de uma path expression: um conjunto de valores que
juntamente com seus elementos/atributos casam com o path
especificado
Ex.
/banco-2/cliente/nomeCliente :
<nomeCliente>José</nomeCliente>
<nomeCliente>Maria</nomeCliente>
Ex2
/banco-2/cliente/nomeCliente/text( )
retorna os
mesmos nomes, mas sem as tags envolventes.
XSLT – Expressões XPath
O “/” inicial denota a raiz do documento (acima da tag do topo )
Path expressions são avaliadas da esquerda para direita
Predicados de seleção podem seguir qualquer passo num path,
usando [ ]
Ex.
/banco-2/conta[saldo > 400]
retorna elementos de conta com saldo > 400
/banco-2/conta[saldo] retorna elementos conta contendo um
sub-elemento saldo
Atributos são acessados usando “@”
Ex /banco-2/conta[saldo > 400]/@numero
retorna os números das contas com saldo>400
XSLT – Funções XPath
XPath provê várias funções
A função count() no final de um path conta o número de
elementos no conjunto gerado pelo path.
Ex /banco-2/conta[cliente/count() > 2]
Retorna contas com > 2 clientes
Conectores Booleanos and e or e a função not() podem ser
usados em predicados
IDREFs podem ser referenciados usando a função id()
E.g. /banco-2/conta/id(@proprietarios)
retorna todos clientes referenciados pelo atributo proprietarios
do elemento conta.
Xpath - Exemplo de patterns (1)
para
associa todos filhos <para> no contexto corrente
para/emphasis
associa com todos elementos <emphasis> que têm um pai <para>
/
associa com a raiz do documento
para//emphasis
associa com todos elementos <emphasis> que têm um ancestral <para>
section/para[1]
associa o primeiro filho <para> de todos os filhos <section> no contexto
corrente
//title
associa todos elementos <title> em qualquer lugar no documento
.//title
associa todos elementos <title> que são descendentes do contexto corrente
XPath- Exemplo de patterns (2)
section/*/note
associa elementos <note> que tenham <section> como avós.
stockquote[@symbol]
associa elementos <stockquote> que têm um atributo "symbol"
stockquote[@symbol="XXXX"]
associa elementos <stockquote> que têm um atributo "symbol" com valor "XXXX"
emphasis|strong
associa elementos <emphasis> ou <strong>
XSLT - Elementos
Elementos XSLT possuem sintaxe e semântica bem definidos
Existem muitos elementos pré-definidos no namespace XSLT
e que são interpretados por processadores XSLT
Nem todos os elementos XSLT estão disponíveis para todos os
processadores XSLT
Forma:
<xsl: element_name>
XSLT - Elementos
Exemplo Base de XML:
<?xml version="1.0" encoding="ISO-8859-1" ?> <catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
...
</catalog>
XSLT - Elementos
<xsl:template>
Contém regras que serão aplicadas a um nó específico
Possui o atributo “match”, que determina à qual elemento XML, a
regra deve ser aplicada.
<xsl:value-of>
É usado para selecionar o valor de um elemento XML e adicioná-lo à
saída da transformação
Possui o atributo “select”, que contém uma expressão Xpath que
calcula o valor a ser adicionado ao documento resultado
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0” xmlns:xsl="http://www.w3.org/1999/XSL/Transform”>
<xsl:template match="/">
<html> <body>
-<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<tr>
<td> <xsl:value-of select="catalog/cd/title" />
<td> <xsl:value-of select="catalog/cd/artist"/> </td>
</tr>
</table>
</body> </html> </xsl:template> </xsl:stylesheet>
</td>-
Resultado
XSLT - Elementos
<xsl:apply-templates>
Aplica um template ao elemento corrente e todos os seus filhos
Se for acrescido o atributo select será processado somente o elemento
filho que corresponde ao valor do atributo.
Usa-se select para especificar a ordem que os filhos serão processados
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0“
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
(CONTINUACAO)
<xsl:template match="title">
<h2>My CD Collection</h2>
Title: <span style="color:#ff0000">
<xsl:apply-templates/>
<xsl:value-of select="."/></span>
</body>
<br />
</html>
</xsl:template>
</xsl:template>
<xsl:template match="artist">
<xsl:template match="cd">
Artist: <span style="color:#00ff00">
<p>
<xsl:value-of select="."/></span>
<xsl:apply-templates select="title"/>
<br />
<xsl:apply-templates select="artist"/>
</xsl:template>
</p>
</xsl:template>
</xsl:stylesheet>
Resultado
My CD Collection
Title: Empire Burlesque
Artist: Bob Dylan
Title: Hide your heart
Artist: Bonnie Tyler
Title: Greatest Hits
Artist: Dolly Parton
Title: Still got the blues
Artist: Gary Moore
Title: Eros
Artist: Eros Ramazzotti
Title: One night only
Artist: Bee Gees
XSLT - Elementos
<xsl:for-each>
Permite a construção de loops
Possui o atributo “select”, que contém uma expressão Xpath que vai
determinar sobre que elemento será realizado o loop
<xsl:sort>
É usado para ordenar a saída
Possui o atributo “select”, que indica qual elemento XML ordenar
Possui o atributo “order”, que indica o tipo da ordenação: ascending
ou descending.
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/">
<html><body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<xsl:sort select="artist" />
<tr>
<td> <xsl:value-of select="title" />
<td> <xsl:value-of select="artist" />
</tr>
</xsl:for-each>
</table>
</body> </html>
</xsl:template> </xsl:stylesheet>
</td>
</td>
Resultado
XSLT - Elementos
<xsl:if>
Aplica um conteúdo apenas se uma condição especificada for
verdadeira
Possui o atributo “test”, que contém a expressão a ser avaliada
<xsl:if test="expression">
...
...some output if the expression is true...
...
</xsl:if>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html><body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
<xsl:if match=".[artist='Bob Dylan']">
</tr>
<xsl:for-each select="catalog/cd">
<xsl:if test="price&gt;'10'">
<tr>
<td> <xsl:value-of select="title" />
<td> <xsl:value-of select="artist" />
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body> </html> </xsl:template> </xsl:stylesheet>
</td>
</td>
XSLT - Elementos
XSLT - Elementos
<xsl:attribute>
É usado para adicionar atributos aos elementos
<picture>
<xsl:attribute name=“source”/>
<picture>
<xsl:element> cria um elemento (node) na saída
<xsl:template match="/">
<xsl:for-each select="catalog/cd">
<xsl:element name="singer">
<xsl:value-of select="artist" />
</xsl:element>
<br />
</xsl:for-each>
</xsl:template>
XSLT - Elementos
<xsl:copy>
Cria uma cópia do nó corrente do documento origem para o
documento destino
<xsl:template match="message">
<xsl:copy>
</xsl:copy>
</xsl:template>
<xsl:copy-of>
–Cria uma cópia do nó corrente (inclusive os nós filhos e atributos)
Exemplo: Seja o DB XML:
<?xml version = "1.0"?>
<!-- Banco de Dados Esporte
-->
<esportes>
<jogo titulo = "cricket">
<id>243</id>
<para>
Mais popular na Inglaterra
</para>
</jogo>
<jogo titulo = ”baseball">
<id>431</id>
<para>
Mais popular nos EUA
</para>
</jogo>
<jogo titulo = ”futebol">
<id>123</id>
<para>
Mais popular no Brasil
</para>
</jogo>
</esportes>
Exemplo (cont): XSL
<?xml version = "1.0"?>
<!-- Usando xsl:element e xsl:attribute -->
<xsl:stylesheet version = "1.0”
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match = ”esportes">
<esportes>
<xsl:apply-templates/>
</esportes>
</xsl:template>
<xsl:template match = ”jogo">
<xsl:element name = "{@titulo}">
<xsl:attribute name = "id">
<xsl:value-of select = "id"/>
</xsl:attribute>
<comment>
<xsl:value-of select = "para"/>
</comment>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Use o atributo match para
selecionar a raiz do
documento XML
match elemento esportes e
aplica os templates aos nodes
filhos esportes
Cria elemento titulo
Cria atributo id para elemento
titulo
Cria comentário com o
conteúdo do elemento
para
Resultado produzido
<?xml version = "1.0" ?>
<esportes>
<cricket id = "243">
<comment>
Mais popular na Inglaterra
</comment>
</cricket>
<baseball id = "432">
<comment>
Mais popular nos EUA
</comment>
</baseball>
<futebol id = ”123">
<comment>
Mais popular no Brasil
</comment>
</futebol>
</esportes>
XSLT - Elementos
<xsl:param>
Elemento que define parâmetros
Possui o atributo “name” para assinalar o nome do parâmetro
Possui o atributo “select”, que armazena o valor do parâmetro
<xsl:call-template>
Elemento que chama um determinado template
Possui o atributo “name” para assinalar o nome do template
XSLT - Elementos
<xsl:with-param>
Elemento que define os valores dos parâmetros quando da chamada de um template
Possui o atributo “name” para assinalar o nome do parâmetro
Possui o atributo “select”, que armazena o valor do parâmetro
<xsl:variable>
Elemento usado para declarar variáveis
Possui o atributo “name” para assinalar o nome da variável
Possui o atributo “select”, que armazena o valor do variável
XSLT - Elementos
<xsl:template name=“parenthsize”>
<xsl:param name=“string”/>
<xsl:value-of select=“concat(‘(‘,$string,’)’)”/>
</xsl:template>
<xsl:variable name=“credit-in-paren”>
<xsl:call-template name=“parenthsize”>
<xsl:with-param name=“string” select=“@credit”/>
</xsl:call-template>
<xsl:variable>
XSLT - Elementos
<xsl:text>
Elemento usado para escrever texto na saída
<xsl:template match="car">
<p>
<xsl:value-of select="@year"/>
<xsl:text>.</xsl:text>
<xsl:value-of select="@color"/>
</p>
</xsl:template>
XSLT - Funções
Juntamente com XPath e os elementos XSLT, formam o core XSLT
Em um stylesheet XSLT podem ser usadas dois tipos de funções builtin:
Funções XPath
Funções XSLT
Existem ainda as funções que podem ser definidas pelo elemento XSLT
<xsl:functions>
<xsl:value-of select=“funcs:f1”>
<xsl:functions ns=“funcs”
type=“text/javascript”>
function f1() {
return “Funcao 1”;
}
</xsl:functions>
XSLT - Funções
format-number()
É usada para converter números em strings de acordo com algum padrão de formato
format-number(value, format) => string
<<format-number(12.5, ‘$#.00’)>> <<$12.50>>
<<format-number(0.25, ‘#00%’)>> <<25%>>
generate-id()
Gera um string, na forma de um nome XML, que unicamente identifica um nó.
generate-id(nó) => string
o código retornado depende do XSLT processor
<<generate-id(book)>> <<N015732>>
XSLT - Funções
current()
Retorna o nó corrente
document()
Retorna o nó raiz de um documento XML externo
document(uri) => nó
<<document(‘data.xml’)>>
XSLT - Funções
id()
Retorna o nó com um determinado valor para seu atributo ID
id(value) => nó
<<id(‘A321-780’)>> <product code=“A321-780”>
element-available()
É usada para testar se um determinada instrução XSLT está disponível para uso.
Element-available(name) => boolean
<<element-available(‘xsl:text’)>>
XSLT - Funções
count(arg1)
retorna o número de nodes presentes no conjunto de nós passados como argumento
sum(arg1)
calcula a soma de um conjunto de valores numéricos contidos nos nodes do conjunto de
nodes passados como argumento
contains(arg1, arg2)
testa se arg1 contém arg2 como substring
é case sensitive
Ex: contains (‘Paris’, ‘A’) retorna false
XSLT - Exemplo Completo (Doc1 – Documento Origem
XML)
<?xml version="1.0" encoding="utf-8" ?>
<customers>
<customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste" ContactName="Maria Anders" ContactTitle="Sales
Representative" Address="Obere Str. 57" City="Berlin" PostalCode="12209" Country="Germany" Phone="030-0074321"
Fax="030-0076545" />
<customer CustomerID="ANATR" CompanyName="Ana Trujillo Emparedados y helados" ContactName="Ana Trujillo"
ContactTitle="Owner" Address="Avda. de la Constitución 2222" City="México D.F." PostalCode="05021" Country="Mexico"
Phone="(5) 555-4729" Fax="(5) 555-3745" />
<customer CustomerID="AROUT" CompanyName="Around the Horn" ContactName="Thomas Hardy" ContactTitle="Sales
Representative" Address="120 Hanover Sq." City="London" PostalCode="WA1 1DP" Country="UK" Phone="(171) 555-7788"
Fax="(171) 555-6750" />
<customer CustomerID="BERGS" CompanyName="Berglunds snabbköp" ContactName="Christina Berglund"
ContactTitle="Order Administrator" Address="Berguvsvägen 8" City="Luleå" PostalCode="S-958 22" Country="Sweden"
Phone="0921-12 34 65" Fax="0921-12 34 67" />
...
</customers>
XSLT - Exemplo Completo (Doc1 – Documento
Resultado XML)
<?xml version="1.0" encoding="UTF-16" ?>
<customers>
<customer CompanyName="Cactus Comidas para llevar" CustomerID="CACTU" Country="Argentina" />
<customer CompanyName="Océano Atlántico Ltda." CustomerID="OCEAN" Country="Argentina" />
<customer CompanyName="Ernst Handel" CustomerID="ERNSH" Country="Austria" />
<customer CompanyName="Piccolo und mehr" CustomerID="PICCO" Country="Austria" />
<customer CompanyName="Maison Dewey" CustomerID="MAISD" Country="Belgium" />
<customer CompanyName="Comércio Mineiro" CustomerID="COMMI" Country="Brazil" />
...
<customer CompanyName="Save-a-lot Markets" CustomerID="SAVEA" Country="USA" />
<customer CompanyName="The Big Cheese" CustomerID="THEBI" Country="USA" />
</customers>
XSLT - Exemplo Completo (Documento XSLT para conversão
Doc1 => Doc2)
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match=“customer">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="customers">
<xsl:for-each select="customer">
<xsl:sort select="@Country" order="ascending" />
<customer>
<xsl:attribute name="CompanyName">
<xsl:value-of select="@CompanyName" />
</xsl:attribute>
<xsl:attribute name="CustomerID">
<xsl:value-of select="@CustomerID" />
</xsl:attribute>
<xsl:attribute name="Country">
<xsl:value-of select="@Country"/>
</xsl:attribute>
</customer>
</xsl:for-each>
</xsl:template> </xsl:stylesheet>
XSL: Extensible Stylesheet Language
Formatting Objects
Formatting objects
Usado para formatar documentos XML para apresentação
Tipicamente usado quando o resultado da transformção é para
mídia impressa
livros, revistas, encartes, etc.
FOP
Ferramenta em Java da Apache
Transforma documentos XSL que contêm formatting objects
Download em xml.apache.org/fop
XSLFO
Exemplos de ferramentas
http://xml.apache.org/fop
- FOP para PDF
http://www.unicorn-enterprises.com/ - TeX para PDF
http://www.jfor.org/ - XSLFO para RTF
http://www.xsmiles.org/ - browser XML que usa FOP
Exercício
Linguagem de
Consulta
X-Query
XQuery
Baseda em Quilt
(que é baseda em XML-QL)
http://www.w3.org/TR/xquery/2/2001
XML Query data model
Utiliza expressões XPath
É uma recomendação W3C
Selecione todos os registros com preço menor que $10 da
coleção de CDs armazenado no documento XML chamado
cd_catalog.xml
The best way to explain XQuery is to say that XQuery
is to XML what SQL is to database tables.
Selecionando nodos
Usar a função doc() para extrair dados do XML
doc("books.xml")
Usa expressões para selecionar os elementos
doc("books.xml")/bookstore/book/title
Predicados são usados para limitar a seleção
doc("books.xml")/bookstore/book[price<30]
ou então
doc("books.xml")/bookstore/book[price>30]/title
FLWR (“Flower”) Expressions
FOR ...
LET...
WHERE...
RETURN...
XQuery
Encontre os títulos dos livros publicados após 1995:
FOR $x IN doc("bib.xml")/bib/book
WHERE $x/year > 1995
RETURN $x/title
Resultado:
<title> abc </title>
<title> def </title>
<title> ghi </title>
XQuery
Para cada autor de um livro publicado pela Morgan Kaufmann, listar
os livros publicados:
FOR $a IN distinct(doc("bib.xml")
/bib/book[publisher=“Morgan Kaufmann”]/author)
RETURN <result>
$a,
FOR $t IN /bib/book[author=$a]/title
RETURN $t
</result>
distinct = elimina duplicatas
XQuery
Resultado:
<result>
<author>Jones</author>
<title> abc </title>
<title> def </title>
</result>
<result>
<author> Smith </author>
<title> ghi </title>
</result>
XQuery
FOR $x in expr -- liga $x a cada valor na lista expr
LET $x = expr -- liga $x à inteira lista expr
Usado para subexpressões comuns e para agregações
XQuery
Sumário:
FOR-LET-WHERE-RETURN = FLWR
FOR/LET Clauses
Lista de tuplas
WHERE Clause
Lista de tuplas
RETURN Clause
Instância do modelo de dados Xquery
FOR versus LET
FOR
liga variáveis nodo  iteration
for $x in (1 to 5) return
<test>{$x}</test>
Resulta:
<test>1</test>
<test>2</test>
<test>3</test>
<test>4</test>
<test>5</test>
LET
liga variáveis coleção  one
value
let $x := (1 to 5) return
<test>{$x}</test>
Resulta:
<test>1 2 3 4 5</test>
FOR versus LET
FOR $x IN doc("bib.xml")/bib/book
RETURN <result> $x </result>
LET $x IN doc("bib.xml")/bib/book
RETURN <result> $x </result>
Retorna:
<result> <book>...</book></result>
<result> <book>...</book></result>
<result> <book>...</book></result>
...
Retorna:
<result> <book>...</book>
<book>...</book>
<book>...</book>
...
</result>
For / Let
<big_publishers>
FOR $p IN distinct(doc("bib.xml")//publisher)
LET $b := doc("bib.xml")/book[publisher = $p]
WHERE count($b) > 100
RETURN $p
</big_publishers>
count = função (aggregate) que retorna o número de elementos
For / Let
Encontre os livros cujos preços são maiores do que a média
de preços:
FOR $b in document("bib.xml")/bib/book
LET $a=avg(document("bib.xml")/bib/book/price)
WHERE $b/price > $a
RETURN $b
Coleções em XQuery
Conjuntos e Bags
/bib/book/author = uma coleção do tipo Bag
Distinct(/bib/book/author) = uma coleção do tipo conjunto (Set)
LET $a = /bib/book  $a é uma coleção
$b/author  uma coleção (vários autores...)
RETURN <result> $b/author </result>
Retorna:
<result> <author>...</author>
<author>...</author>
<author>...</author>
...
</result>
Ordenação em XQuery
<publisher_list>
FOR $b IN doc("bib.xml")//book[publisher = $p]
RETURN <book>
$b/title ,
$b/price
</book> SORTBY(price DESCENDING)
</publisher_list>
Argumentos de sort referem-se ao namespace da cláusula
RETURN e não da cláusula FOR
Ordenação em XQuery
<ul>
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return <li>{$x}</li>
}
</ul>
Resulta em:
<ul>
<li><title lang="en">Everyday Italian</title></li>
<li><title lang="en">Harry Potter</title></li>
<li><title lang="en">Learning XML</title></li>
<li><title lang="en">XQuery Kick Start</title></li>
</ul>
Ordenação em XQuery
Agora retirando o elemento title e mostrando somente seu conteudo
<ul>
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return <li>{data($x)}</li>
}
</ul>
Resulta em:
<ul>
<li>Everyday Italian</li>
<li>Harry Potter</li>
<li>Learning XML</li>
<li>XQuery Kick Start</li>
</ul>
If-Then-Else
for $x in doc("books.xml")/bookstore/book
return
if ($x/@category="CHILDREN")
then <child>{data($x/title)}</child>
else <adult>{data($x/title)}</adult>
* Parenteses na expressao if são requeridos
Resulta em:
<adult>Everyday Italian</adult>
<child>Harry Potter</child>
<adult>Learning XML</adult>
<adult>XQuery Kick Start</adult>
Comparativos
Duas formas de comparar valores:
Comparações gerais: =, !=, <, <=, >, >=
Comparações de valor: eq, ne, lt, le, gt, ge
- $bookstore//book/@q > 10
A expressao retorna true se qualquer atributo possui valores maiores
que 10
- $bookstore//book/@q gt 10
A expressao retorna true se há somente um elemento q retornado pela
expressao e o seu valor é maior que 10. Se mais de um q são
retornados ocorre um erro
Quantificador Existencial
FOR $b IN //book
WHERE SOME $p IN $b//para SATISFIES
contains($p, "sailing")
AND contains($p, "windsurfing")
RETURN $b/title
Quantificador Universal
FOR $b IN //book
WHERE EVERY $p IN $b//para SATISFIES
contains($p, "sailing")
RETURN $b/title
Funções
Diversas funções para string, valores, data, etc...
Podem ser encontradas em:
http://www.w3.org/2005/02/xpath-functions
Como invocar uma função
<name>{uppercase($booktitle)}</name>
ou então
doc("books.xml")/bookstore/book[substring(title,1,5)='Harry']
Funções
Funções declaradas pelo usuário
declare function prefix:function_name($parameter AS datatype)
AS returnDatatype
{
(: ...function code here... :)
};
Exemplo:
declare function local:minPrice(
$price as xs:decimal?,
$discount as xs:decimal?)
AS xs:decimal?
{
let $disc := ($price * $discount) div 100
return ($price - $disc)
};
Invocar da seguinte forma:
<minPrice>{local:minPrice($book/price, $book/discount)}</minPrice>
Download

XSL