Академический Документы
Профессиональный Документы
Культура Документы
Stylesheet Language
1
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.
2
Opções para mostrar XML
3
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
4
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.
5
Revisão de CSS
CSS - Cascade Style Sheet
Define o estilo de um documento
para apresentação
Pode ser inline ou externa ao
documento
Precedência de estilos:
Autor > Usuário > Web Browser
6
External Style Sheets
7
Exemplo de um CSS
/* styles.css */
/* An external stylesheet */ <html>
a { text-decoration: underline; <!-- Linking external style sheets -->
color: red; <head>
background-color: #ccffcc } <title>Exemplo de CSS</title>
<link rel = "stylesheet" type = "text/css”
li em { color: red; href = "styles.css">
font-weight: bold} </head>
ul { margin-left: 2cm }
8
XSL - Princípios gerais
9
XSL - Histórico
10
Componentes de XSL
11
XSLT - Características
Linguagem declarativa
Descreve a transformação desejada, ao invés de prover uma
sequência de instruções procedurais
12
XSLT - Características
Processadores XSLT
Aplicam um stylesheet XSLT a um documento origem XML e
produz um documento resultado.
Tratam árvores
13
XSLT - Estrutura de uma folha XSL
14
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>
16
<?xml version=“1.0” encoding=“iso-8859-1”?> Saudacao.xml
<saudacao>Bem-vindo a Maceió!</saudacao>
<html>
<head>
<title>Saudação de Hoje</title>
</head>
Saudacao.html <body>
<p>Bem-vindo a Maceió!</p>
</body>
</html>
17
Saudacao.xsl
18
Inclusão de uma referência ao arquivo xsl no próprio arquivo xml:
Saudacao.xml
19
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>
20
Exemplo 2(cont)
21
XML
Exemplo 3:
<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=“.”/>
HTML
</xsl:template>
<H1> Introducao </H1>
Texto do capitulo
22
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
23
XSLT – Expressões XPath
XPath é usado para endereçar (select) partes de
documentos XML usando path expressions
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.
24
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
25
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
26
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
27
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>
28
XSLT - Elementos
Forma:
<xsl: element_name>
29
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>
30
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
31
<?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>- <td>
<xsl:value-of select="catalog/cd/artist"/> </td>
</tr>
</table>
</body> </html> </xsl:template> </xsl:stylesheet> 32
Resultado
33
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.
34
<?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>
<td> <xsl:value-of select="artist" />
</td>
</tr>
</xsl:for-each>
</table>
35
</body> </html>
Resultado
36
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=“price>‘10’>
conteúdo ...
</xsl:if>
37
<?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:if test="price>'10'">
<tr>
<td> <xsl:value-of select="title" />
</td>
<td> <xsl:value-of select="artist" />
</td>
</tr>
</xsl:if>
</xsl:for-each> 38
XSLT - Elementos
39
XSLT - Elementos
<xsl:attribute>
É usado para adicionar atributos aos elementos
<picture>
<xsl:attribute name=“source”/>
<picture>
<xsl:copy-of>
–Cria uma cópia do nó corrente (inclusive os nós filhos e atributos)
41
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> 42
Exemplo (cont): XSL
44
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
45
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
46
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>
47
XSLT - Elementos
<xsl:template match="car">
<p>
<xsl:value-of
select="@year"/>
<xsl:text>.</xsl:text>
<xsl:value-of
select="@color"/>
</p>
</xsl:template>
48
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 built-in:
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>
49
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
<<generate-id(book)>> <<N015732>>
50
XSLT - Funções
current()
Retorna o nó corrente
document()
Retorna o nó raiz de um documento XML externo
document(uri) => nó
<<document(‘data.xml’)>>
51
XSLT - Funções
id()
Retorna o nó com um determinado valor para seu
atributo ID
id(value) => nó
element-available()
É usada para testar se um determinada instrução
XSLT está disponível para uso.
Element-available(name) => boolean
<<element-available(‘xsl:text’)>>
52
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
53
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>
54
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>
55
XSLT - Exemplo Completo
(Documento XSLT para conversão
Doc1 =>encoding="utf-8"
<?xml version="1.0" Doc2) ?>
<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>
56
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
57
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
58
Exemplos de XSLT para
Aplicação de Banco
<xsl:template match=“/banco2/cliente”>
<cliente>
<xsl:value-of select=“nomeCliente”/>
</cliente>
</xsl:template>
<xsl:template match=“*”/>
Produz o resultado:
<cliente> José </cliente>
<cliente> Maria </cliente>
59
Exercício 5
Supondo que existem cadastrados os clientes Ana e Mauro, qual
seria a saída produzida pelo XSLT :
<xsl:template match=“/banco”>
<clientes>
<xsl:template apply-templates/>
</clientes >
</xsl:template>
<xsl:template match=“/cliente”>
<cliente>
<xsl:value-of select=“nomeCliente”/>
</cliente>
</xsl:template>
<xsl:template match=“*”/>
60
Exercício 5
Resposta:
<clientes>
<cliente> Ana </cliente>
<cliente> Mauro </cliente>
</clientes>
61
Consulta a dados
semi-estruturados
62
Consulta
63
Expressões de caminho (Path
expressions)
Expressões que permitem navegar no grafo de
dados
Expressões de caminho simples
sequências de labels
exemplos
root.pessoas {&p1,&p2,&p3}
root.pessoas.filhos {&p2,&p3}
semântica
o resultado de uma expressão de caminho r.l1. … .ln, onde
l1,…,ln são os labels e r um objeto, é o conjunto de nodos
do grafo acessíveis de r por um caminho do grafo tal que os
arcos percorridos passam sucessivamente pelos labels l1,
…,ln.
64
Consulta
Expressões de caminho
Expressões de caminho generalizadas
Idéia: além de especificar completamente um caminho,
permite exprimir restrições (constraints) sobre o
caminho
Utilização de expressões regulares
Exemplos
_ é um caracter coringa que designa um label
qualquer
(pessoa|estudante)._.idade
As expressões de caminho definidas até o presente
retornam os conjuntos de objetos e não de dados semi-
estruturados
65
Linguagem de Consulta
X-Query
66
XQuery
Baseda em Quilt
(que é baseda em XML-QL)
http://www.w3.org/TR/xquery/2/20
01
XML Query data model
67
FLWR (“Flower”)
Expressions
FOR ...
LET...
WHERE...
RETURN...
68
XQuery
Encontre os títulos dos livros
publicados após 1995:
FOR
FOR$x
$xIN
IN
document("bib.xml")/bib/book
document("bib.xml")/bib/book
WHERE
WHERE$x/year
$x/year>>1995
1995
RETURN
RETURN$x/title
$x/title
Resultado:
<title> abc </title>
<title> def </title>
<title> ghi </title>
69
XQuery
Para cada autor de um livro publicado pela
Morgan Kaufmann, listar os livros
publicados:
FOR
FOR$a
$aIN
INdistinct(document("bib.xml")
distinct(document("bib.xml")
/bib/book[publisher=“Morgan
/bib/book[publisher=“MorganKaufmann”]/author)
Kaufmann”]/author)
RETURN
RETURN<result>
<result>
$a,
$a,
FOR
FOR$t$tIN
IN/bib/book[author=$a]/title
/bib/book[author=$a]/title
RETURN
RETURN$t$t
</result>
</result>
distinct = elimina duplicatas
70
XQuery
Resultado:
<result>
<author>Jones</author>
<title> abc </title>
<title> def </title>
</result>
<result>
<author> Smith </author>
<title> ghi </title>
</result>
71
XQuery
FOR $x in expr -- liga $x a cada
valor na lista expr
72
XQuery
<big_publishers>
<big_publishers>
FOR
FOR$p
$pIN
IN
distinct(document("bib.xml")//publisher)
distinct(document("bib.xml")//publisher)
LET
LET$b
$b:=
:=document("bib.xml")/book[publisher
document("bib.xml")/book[publisher==
$p]
$p]
WHERE
WHEREcount($b)
count($b)>
>100
100
RETURN
RETURN$p
$p
</big_publishers>
</big_publishers>
count = função (aggregate) que retorna o número de elementos
73
XQuery
Encontre os livros cujos preços são
maiores do que a média de preços:
FOR $binindocument("bib.xml")/bib/book
FOR$b document("bib.xml")/bib/book
LET
LET$a=avg(document("bib.xml")/bib/book/price)
$a=avg(document("bib.xml")/bib/book/price)
WHERE
WHERE$b/price
$b/price>>$a
$a
RETURN
RETURN$b
$b
74
XQuery
Sumário:
FOR-LET-WHERE-RETURN = FLWR
FOR/LET Clauses
Lista de tuplas
WHERE Clause
Lista de tuplas
RETURN Clause
FOR
liga variáveis nodo iteration
LET
liga variáveis coleção one value
76
FOR versus LET
Retorna:
FOR
FOR$x
$xIN
IN <result> <book>...</book></result>
document("bib.xml")/bib/book
document("bib.xml")/bib/book <result> <book>...</book></result>
<result> <book>...</book></result>
RETURN
RETURN<result>
<result>$x
$x</result>
</result>
...
LET Retorna:
LET$x
$xIN
IN
<result> <book>...</book>
document("bib.xml")/bib/book
document("bib.xml")/bib/book <book>...</book>
<book>...</book>
RETURN
RETURN<result>
<result>$x
$x</result>
</result> ...
</result>
77
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:
RETURN <result> $b/author </result> <result> <author>...</author>
<author>...</author>
<author>...</author>
...
</result>
78
Ordenação em XQuery
<publisher_list>
<publisher_list>
FOR
FOR$p$pIN
INdistinct(document("bib.xml")//publisher)
distinct(document("bib.xml")//publisher)
RETURN
RETURN<publisher>
<publisher><name>
<name>$p/text()
$p/text()</name>
</name>, ,
FOR
FOR$b $bIN
INdocument("bib.xml")//book[publisher
document("bib.xml")//book[publisher==$p]
$p]
RETURN
RETURN<book>
<book>
$b/title
$b/title, ,
$b/price
$b/price
</book>
</book>SORTBY(price
SORTBY(priceDESCENDING)
DESCENDING)
</publisher>
</publisher>SORTBY(name)
SORTBY(name)
</publisher_list>
</publisher_list>
RETURN
RETURN<holding>
<holding>
$h/title,
$h/title,
IF
IF$h/@type
$h/@type=="Journal"
"Journal"
THEN
THEN$h/editor
$h/editor
ELSE
ELSE$h/author
$h/author
</holding>
</holding>SORTBY
SORTBY(title)
(title)
80
Quantificador Existencial
FOR
FOR$b
$bIN
IN//book
//book
WHERE
WHERESOME
SOME$p
$pIN
IN$b//para
$b//paraSATISFIES
SATISFIES
contains($p,
contains($p,"sailing")
"sailing")
AND
ANDcontains($p,
contains($p,"windsurfing")
"windsurfing")
RETURN
RETURN$b/title
$b/title
81
Quantificador Universal
FOR
FOR$b
$bIN
IN//book
//book
WHERE
WHEREEVERY
EVERY$p
$pIN
IN$b//para
$b//paraSATISFIES
SATISFIES
contains($p,
contains($p,"sailing")
"sailing")
RETURN
RETURN$b/title
$b/title
82