Вы находитесь на странице: 1из 82

XSL - eXtensible

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

External Style Sheets


Contidas num arquivo.css
Único style sheet usado por múltiplas páginas
Usado com o elemento link

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

Como CSS, funcionamento a base de regras

CSS não modifica a estrutura de um documento, XSL


sim

XSL utiliza a sintaxe XML

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

10
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

11
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

12
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, MSXML3, Xalan (Apache)


Web browsers já trazem tal processador sobretudo IE 6.0 e Netscape
6.0

13
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

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>

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

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

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

18
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 a Maceió!</saudacao>

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)

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>

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

O match pattern determina onde este template se aplica

Elementos XSLT vêm do XSL namespace

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

atributo proprietarios do elemento conta.

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

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>

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&gt;‘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&gt;'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: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>
40
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)

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

<?xml version = "1.0"?>


<!-- Usando xsl:element e xsl:attribute --> Use o atributo match para
<xsl:stylesheet version = "1.0” selecionar a raiz do
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> documento XML
<xsl:template match = "/">
<xsl:apply-templates/>
</xsl:template> match elemento esportes e
<xsl:template match = ”esportes">
aplica os templates aos nodes
<esportes> filhos esportes
<xsl:apply-templates/>
</esportes>
</xsl:template>

<xsl:template match = ”jogo"> Cria elemento titulo


<xsl:element name = "{@titulo}">
<xsl:attribute name = "id">
<xsl:value-of select = "id"/>
Cria atributo id para elemento
</xsl:attribute> titulo
<comment>
<xsl:value-of select = "para"/> Cria comentário com o
</comment> conteúdo do elemento
</xsl:element>
</xsl:template> para
</xsl:stylesheet>
43
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>

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

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

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

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

Requisitos desejáveis (Maier ’98)


 Expressividade
 linguagem de consulta ao estilo SQL
 possibilitar a restruturação de dados semi-estruturados
 Semântica precisa
 muito importante para XML
 Composição
 o resultado de uma consulta deve poder ser utilizado
dentro de uma outra consulta
 Consulta ao esquema
 visando otimização
 Facilitar a geração automática de consultas

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

 LET $x = expr -- liga $x à inteira


lista expr
 Usado para subexpressões comuns e
para agregações

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

Instância do modelo de dados Xquery


75
FOR versus LET

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>

Argumentos de sort referem-se ao namespace da cláusula


RETURN e não da cláusula FOR
79
If-Then-Else
FOR
FOR$h
$hIN
IN//holding
//holding

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

Вам также может понравиться