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