XML – eXtensible Markup Language Prof. Dr. Cláudio Baptista UFCG/DSC/SINBAD [email protected] http://www.lsi.dsc.ufcg.edu.br InfoView2002 1 Roteiro Introdução a XML XMLSchema DOM e SAX XSL XQuery InfoView2002 2 Introdução Dados semi-estruturados ? Dados semi-estruturados: dados heterogêneos e irregulares, auto-descritivos. Banco de dados: originalmente, sistemas fechados, dedicados a gestão de dados regulares, cuja estrutura pouco evolui no tempo Novas aplicações requerem mais flexibilidade de representação e estão constantemente evoluindo o esquema Os modelos relacional e de objetos chegaram a seus limites InfoView2002 3 Introdução Dados estruturados São dados de um arquivo ou de um banco de dados relacional, em que sua estrutura é conhecida a priori Ex.: Create table empregado ( matricula int, nome varchar(30), salario float, depto int ) InfoView2002 4 Introdução Dados não-estruturados São dados em que não há nenhuma estrutura os definindo. São normalmente armazenados em arquivos ou em colunas do tipo BLOB ou CLOB em SGBDs Ex.: um texto em pdf uma imagem em jpg um video ou áudio InfoView2002 5 Introdução Dados semi-estruturados São dados em que uma parte há estrutura e em outra não há nenhuma estrutura definida. O esquema da parte estruturada está contido junto com o dado, Ex.: Um email (parte estruturada: <to>, <subject>, <date>, etc. Parte não estruturada: o corpo da mensagem) InfoView2002 6 A revolução da Web… 1989 - Primeiro Web Browser 1993 - Mosaic é difundido, há 50 web sites 1994 - Primeiras ferramentas de busca (WWWW, webcrawler) 1996 - US$ 1M gastos em compras na Web, presença em 150 países 1997 - 1 milhão de web sites 1998 - 300.000 web servers 2000 - mais de 1 bilhão de páginas web 2002 – quase 2,5 bilhões de páginas web indexadas (google) InfoView2002 7 A Web hoje… documentos HTML (em sua maioria) voltada para uso humano gerado automaticamente por aplicações fácil de alcançar qualquer Web page, de qualquer server, em qualquer plataforma InfoView2002 8 O Segredo do sucesso de HTML HTML é simples: todo mundo pode escrever HTML HTML é textual: é legível, pode-se usar qualquer editor, ... HTML é transportável em qualquer plataforma (o browser é a aplicação universal) HTML conecta pedaços de informação através de hypertext l InfoView2002 9 HTML <h1> Bibliography </h1> <p> <i> Foundations of Databases </i> Abiteboul, Hull, Vianu <br> Addison Wesley, 1995 <p> <i> Data on the Web </i> Abiteoul, Buneman, Suciu <br> Morgan Kaufmann, 1999 InfoView2002 10 Resultado produzido HTML descreve a apresentação InfoView2002 11 Problemas com HTML Uma vez criado, um documento é ligado a uma norma particular (ex. HTML 3.2 ) É necessário dispor de várias versões do documento em função da mídia em que vai ser apresentado A indexação de documentos só pode ser feita sobre a parte textual. InfoView2002 12 HTML ... Um conjunto pré-definido e limitado de tags, definidas por uma norma (HTML 2.0, 3.2, 4.0). Estas tags possuem semânticas variadas: h1,..,h6, title, address, … dando as indicações estruturais center,hr,b,i,big,small,… servem para descrever a apresentação. InfoView2002 13 Limites da Web … aplicações não devem consumir HTML tecnologia de wrapper HTML é instável (modifica-se a página => modifica-se o wrapper) companhias se fundem, formam parcerias; necessitam de interoperabilidade de forma rápida InfoView2002 14 … estão surgindo ... As novas aplicações Comércio Eletrônico Protocolos "B2B" Bibliotecas digitais sistemas distribuídos … precisamos de um "super HTML" InfoView2002 15 XML ? « Buzz word » eXtensible Markup Language Uma linguagem de descrição de documentos, definida por um organismo internacional W3C Um conjunto de tecnologias derivadas: Xlink, Xpointer, Xschema, DOM, SAX, XSL,… Usados em aplicações como: SVG, SMIL, MathML, MusicML, SOAP O esperanto da Web InfoView2002 16 Web: Mudança de paradigma … Novo padrão Web XML: XML gerado por aplicações XML consumido por aplicações troca de dados entre plataformas: interoperabilidade na empresa entre empresas InfoView2002 17 XML <bibliography> <book> <title> Foundations… </title> <author> Abiteboul </author> <author> Hull </author> <author> Vianu </author> <publisher> Addison Wesley </publisher> <year> 1995 </year> </book> … </bibliography> InfoView2002 XML descreve o conteúdo 18 XML: uma resposta única a necessidades variadas HTML é usada como a lingagem universal de apresentação de documentos na Web, mas não é uma linguagem adaptada para descrever a estrutura destes documentos Os sistemas de bases de dados atuais são muito rígidos para manipular dados cuja estrutura é irregular e evolui com o tempo. InfoView2002 19 Os segredos de XML Como HTML: simples, legível, fácil de aprender universal e transportável suportado pela W3C (indústria absorve!) Mas, Além de HTML flexível : podemos representar qualquer tipo de informação estensível: pode-se representar informação de qualquer forma InfoView2002 20 Noção estrutural Princípio chave de SGML Idéia fundamental: Considere um documento, é desejável separar completamente as informações de estrutura das informações de apresentação. InfoView2002 21 XML: herdeiro de SGML SGML Standard Generalized Markup Language, norma ISO 8879:1986 Muito utilizada na indústria para as grandes técnicas de documentação. Muito complexa para utilização de «público em geral» SGML tem demonstrado as vantagens do formato estrutural para a Gestão Eletrônica de Documentos (GED) XML usa 10% de SGML para representar de forma eficaz 90% dos documentos InfoView2002 22 Dois mundos se juntam na Web Gestão de documentos SGML Documentação hipertexto HTML InfoView2002 Gestão de dados Bases de dados estruturados (relacionais e objeto) Bases de dados semi-estruturadas 23 Comunidade de BD pode ajudar ... • otimização e processamento de consultas • visões, transformações • data warehouses, integração de dados • mediadores, re-escrita de consultas • eficiente armazenamento e indexação InfoView2002 24 Origem de XML 1993: primeiros trabalhos sobre adaptação das técnicas SGML à Web (Sperberg). "HTML to the Max: A Manifesto for Adding SGML Intelligence to the World Wide Web" Junho 1996: criação de um grupo de trabalho no W3C 10 fev. 1998: publicação da recomendação para versão 1.0 da linguagem. http://www.w3.org/TR/REC-xml (2/98) InfoView2002 25 Origem de XML Trabalho cooperativo de um grande número de empresas e de pesquisadores reunidos no World Wide Web Consortium (W3C) 400 colaboradores da indústria, entre os quais Oracle, IBM, Compaq, Xerox, Microsoft, etc.. Laboratórios de pesquisa: MIT - USA, INRIA França, universidade de Keio - Japão Objetivo: definição de um formalismo para facilitar a troca de dados na Web InfoView2002 26 Mandamentos iniciais: XML deverá ser diretamente utilizável na Internet XML deverá suportar uma larga variedade de aplicações XML deverá ser compatível com SGML A criação de páginas XML deverá ser também o mais simples possível InfoView2002 27 Mandamentos iniciais(2) Os documentos XML deverão ser de grande legibilidade A criação de documentos deverá ser rápida A sintaxe deverá ser formal e concisa A concisão do código tem mínima importância InfoView2002 28 Resumindo: XML ... XML é uma linguagem de descrição e de troca de documentos (semi-)estruturados InfoView2002 29 Exemplo de um documento Cabeçalho Objeto Logotipo Bar da Noite Rua das Bodegas, s/n 58106-920 C. Grande Tel: 012133564 Fax: 879765426 Campina GRande, 20 de maio de 2001 Sr. Edilson Silva, Rua das Flores, 12 581293 Caruaru Saudação Data Destinatário Objet: Dívida? Forma Polida Prezado Senhor, Bla bla bli, bli blo bla, kkkk vhlg vckjdhklbg fdskjbvhv feje slc ifehfe fhckh c jeflccj n khef iheznf jùkvbc lkhdklvn v Corpo Aproveito do ensejo para renovar meus protestos de elevada estima e consideração. assinatura Rodapé Assinatura Rodapé Representação XML <carta> . . . </carta> <cabeca> <logotipo loc="logo-graph"/> . . . <endereco> &abrev-endereco; </cabeca> </endereco> <destinatario> <nome> Sr Edilson Silva </nome> <endereco> <rua> rua das Flores </rua> <cidade> Caruaru </cidade> </endereco> </destinatario> <objeto> bla bla </objeto> <data> 20 Maio 2001 </data> <para> <saudacao> Aqui é o primeiro Prezado Senhor, parágrafo </saudacao> </para> <corpo> <para> . . . aqui é o segundo ... </corpo> </para> Pontos importantes A representação desta carta em XML não tem nenhuma indicação sobre a apresentação. As numerosas propriedades gráficas ou tipográficas estão ausentes da fonte XML. Estas propriedades serão definidas por intermédio de uma folha de estilo. Uma folha de estilo é um conjunto de regras para especificar a realização concreta de um documento sobre uma mídia particular. InfoView2002 32 Princípio de funcionamento das folhas de estilos <carta> <cabeca> . . . </cabeca> If carta then ... If cabeca then … If corps then ... If para then <corpo> . . . </corpo> </carta> Police new roman, size 12, skip first line If … then … Bar da Noite Rua das Bodegas, s/n 58106-920 C. Grande Tel: 012133564 Fax: 879765426 Campina GRande, 20 de maio de 2001 Sr. Edilson Silva, Rua das Flores, 12 581293 Caruaru Objeto: Dívida Prezado Senhot, Bla bla bli, bli blo bla, kkkk vhlg vckjdhklbg fdskjbvhv feje slc ifehfe fhckh c jeflccj n khef iheznf jùkvbc lkhdklvn v . sssinatura Rodapé Descoberta de XML Vantagens de XML InfoView2002 34 Vantagens de XML Estensibilidade e estrutura Em XML, um autor ou uma comunidade de autores inventam livremente as tags que lhes pareçam úteis para marcar os componentes de um documento. Exemplo: diversas formas de representar uma data <date> 5 janeiro 2000 </date> <date> <ano> 2000 </ano> <mes> 01 </mes> <dia> 05 </dia> </date> <date format='ISO-8601'> 2000-01-05 </date> Grande liberdade de escolha das estruturas de dados facilita a troca de dados comércio eletrônico, transações financeiras e comerciais, pesquisa e indústria de biotecnologias 35 multimídia Vantagens de XML Interoperabilidade Todos os dados podem ser vistos como documentos XML e não mais como arquivos no formato X ou Y. Consequências: Um servidor de documentos XML pode responder a um conjunto de necessidades de uma organização. Um simples editor de textos pode tratar o conjunto de dados de uma organização. A interoperabilidade dos utilitários está assegurada. InfoView2002 36 Vantagens de XML Modularidade e reutilização Cada usuário é livre para definir suas próprias estruturas de documento Um documento pode também estar conforme as estruturas tipadas, chamadas DTD Cada comunidade pode propor as estruturas normalizadas A validação a um DTD permite a automatização no tratamento dos dados e assegura uma possibilidade de controle de integridade InfoView2002 37 Vantagens de XML Accesso às fontes de informação heterogêneas A consulta e troca de dados entre as base de dados heterogêneas é complexa XML contribui pare minimizar este problema: formato de troca normalizado, genérico, independente de plataforma A indexação e consulta de bases de documentos pode se beneficiar de informações estruturais e textuais. pesquisa por palavras-chaves: Jorge+Amado retorna todos os documentos contendo as palavras Jorge e Amado, então as páginas pessoais de Pedro Amado cujo filho se chama Jorge. pesquisa estrutural: pesquisa os documentos cujo autor é Jorge Amado (ie os documentos contendo um elemento autor, ou escrito-por contendo Jorge e Amado) InfoView2002 38 Descoberta de XML Definição da linguagem XML 1.0 InfoView2002 39 XML 1.0 Exemplos de documentos XML <documento></documento> <documento/> <documento> Bom dia!</documento> <documento> <saudacao> Bom dia! </saudacao> </documento> <?xml version="1.0" standalone="yes" ?> <documento> <saudacao> Bom dia! </saudacao> </documento> InfoView2002 40 XML 1.0 Estrutura de um documento Um documento XML é composto de um prólogo cuja presença é facultativa, mas fortemente aconselhada <?xml version="1.0" standalone="yes" ?> uma árvore de elementos, obrigatória <documento> <saudacao> Bom dia! </saudacao> </documento> InfoView2002 comentários, seção CDATA e de instruções de tratamento, facultativos 41 XML 1.0 O prólogo contém ... Uma declaração XML, facultativa da forma: <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"> indica ao processador que vai tratar o documento: a versão da linguagem XML utilizada o código de caracteres utilizado a existência de declarações exteriores ao documento Uma declaração de tipo de documento, facultativa da forma <!DOCTYPE exemplo SYSTEM "exemplo.dtd" [ declarações ]> indica a estrutura particular a qual deve estar de acordo um documento InfoView2002 42 XML 1.0 Estrutura de um DTD Um DTD pode compreender duas partes uma parte externa a parte externa é definida fora do documento. É referenciada por uma referência DTD, frequentemente uma URL. Este mecanismo permite assegurar uma reutilização de DTDs frequentemente utilizados. uma parte interna InfoView2002 utilizada para especializar um DTD externo genérico ou redefinir certos tipos de elementos 43 XML 1.0 Estrutura de um elemento (1) Um elemento é da forma: <nome attr='valor'> conteúdo </nome> <nome> é a tag de abertura (XML é case sensitive!) </nome> é a tag de fechamento. A presença é obrigatória, a exceção particular dos elementos nulos, denotado por <nome> </nome> ou <nome/> conteúdo é o conteúdo de um elemento . Pode ser: vazio texto outros elementos uma mistura de texto e elementos instruções de tratamento comentários attr='valor' representa um conjunto eventualmente vazio de atributos, ou seja de pares (nome,valor). Os nomes dos atributos são únicos num elemento. InfoView2002 44 XML 1.0 Estrutura de um elemento (2) Um nome de elemento é uma sequência não nula de caracteres que pode conter caracteres alfanuméricos undescore sinal de menos ponto caracter dois-pontos (:) é utilizado, mas com um sentido particular deve satisfazer as seguintes restrições o primeiro caracter deve ser alfabético ou um undescore os três primeiros caracteres não devem formar uma cadeia cuja representação em letras minúsculas seja "xml". InfoView2002 45 XML 1.0 Estrutura de um elemento (2) Exemplos de nomes de elementos corretos _toto Nome_sociedade xsl:rule X.11 InfoView2002 incorretos 1998-catalogo xmlSpecification nome sociedade 46 XML 1.0 Sintaxe dos atributos Um atributo é um par nome='valor' que permite de caracterizar um elemento. Um elemento pode ter vários atributos. Neste caso, os pares nome='valor' serão separados por um espaço. Exemplos <relatorio lingua= ’pt' ult-modif='08/07/99'> <anuario generator='SQL2XML V2.0' update='07.08.99'> O nome de um atributo obedece as mesmas regras que o nome de um elemento O valor de um atributo é uma string entre aspas(") ou apóstrofos simples ('). Um valor de atributo não deve conter os caracteres ^, % e &. InfoView2002 47 Seção CDATA Uma seção CDATA instrui o parser a ignorar os caracteres de markup Exemplo: <![CDATA[ *p = &q; b = (i <= 3); ]]> Entre o início da seção, <![CDATA[ e o fim da seção, ]]>, todos os caracteres são passados diretamente para a aplicação, sem interpretação. A única string que não pode ocorrer numa seção CDATA é ]]>. InfoView2002 48 Comentários Comentários iniciam com ”<!--” e terminam com ”-->”. (só não podem conter o string ”--”). Ex.: <!-- Isto é um comentário --> Comentários podem ser colocados em qualquer linha do documento. InfoView2002 49 XML 1.0 Árvore de elementos Um documento XML contém uma árvore de elementos, com as seguintes restrições: Existe num documento um único elemento pai que contém todos os outros. É a raiz do documento. Todo elemento distinto da raiz é totalmente incluído dentro de seu pai. Assim: <p> <b> bla bla </p> bla </b> não é uma estrutura XML. InfoView2002 50 XML 1.0 Documentos bem formados Um documento é dito bem formado se: está de acordo com as regras sintáticas de XML (tags são aninhadas propriamente e atributos são únicos) <?xml version="1.0" standalone="yes" ?> <documento> <saudacao> Bom dia! </saudacao> </documento> InfoView2002 Ex. de uma documento não bem formado: <documento> <saudacao> Bom dia! </documento> </saudacao> 51 XML 1.0 Documentos válidos Um documento é dito válido se: seu prólogo contém uma declaração de tipo de documento sua árvore de elementos respeita a estrutura definida pelo DTD <?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> <!DOCTYPE documento [ <!ELEMENT documento (saudacao)> <!ELEMENT saudacao (#PCDATA)> ]> <documento> <saudacao> Bom dia! </saudacao> </documento> InfoView2002 52 XML 1.0 Noção de DTD Um documento válido deve conter uma declaração de tipo de documento. Esta declaração pode fazer referência, por intermédio de uma URL a um arquivo externo. Este arquivo é chamado de DTD (Definição de Tipo de Documento). Exemplo <?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> <!DOCTYPE documento SYSTEM "acolhida.dtd"> <documento> <saudacao> Bom dia! </saudacao> </documento> InfoView2002 53 XML 1.0 Noção de DTD <!–- Arquivo acolhida.dtd. Exemplo de DTD simples --> <!–- Autor: Cláudio Baptista --> <!–- Data: 18/setembro/2002--> <!–- a declaração XML não é obrigatória dentro de um DTD --> <!–- permite assegurar que os documentos que a referenciam --> <!–- utilizam a mesma versão de XML --> <?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> <!–- Definição do elemento raiz --> <!ELEMENT documento (saudacao)> <!–- Um elemento saudacao contém texto --> <!ELEMENT saudacao (#PCDATA)> InfoView2002 54 XML 1.0 Conteúdo de um DTD Um DTD pode conter as declarações de de de de de elementos listas de atributos entidades gerais entidades parametrizadas notações como também comentários InfoView2002 55 XML 1.0: elementos Declaração de elemento Uma declaração de elemento é da forma <!ELEMENT nome modelo> ELEMENT é uma palavra-chave e se escreve imperativamente em maiúsculas nome é um nome válido de um elemento modelo é o modelo de conteúdo deste elemento. Distinguimos cinco modelos de conteúdo InfoView2002 elementos dados misto livre vazio 56 Modelo de conteúdo de elementos (1) Sequência de elementos filhos ( .., .., ..) Exemplo <!ELEMENT capitulo (titulo,intro,secao)> Um elemento capitulo cujo conteúdo, imperativamente e nesta ordem, contém sub-elementos titulo, intro e secao. Alternativa ( ..| ..| ..) Exemplo <!ELEMENT capitulo (titulo,intro,(secao|secoes))> Indicadores de ocorrência *,+,? Um nome de elemento pode ter um indicador de orrorrência: p* : p pode ocorrer zero, uma ou várias vezes dentro do conteúdo de um instância p+ : p pode ocorrer uma ou várias vezes p? : p pode ocorrer zero ou uma vez InfoView2002 57 Modelo de conteúdo de elementos (2) Exemplos <!ELEMENT capitulo ( titulo, intro?, secao+ ) > <!ELEMENT secao ( titulo-secao, texto-secao ) > <!ELEMENT texto-secao (p|a)* > InfoView2002 58 Modelo de conteúdo de dados A presença de dados no conteúdo de um elemento é especifidada pela palavra-chave #PCDATA Exemplo <!ELEMENT p (#PCDATA) > InfoView2002 59 Modelo de conteúdo misto Este modelo permite definir os modelos de conteúdo podendo misturar dados e elementos Forma do modelo (#PCDATA | nome1 | …|nomen)* Exemplos de declarações <!ELEMENT p (#PCDATA | negrito | italico | sublinhado)* > <!ELEMENT negrito (#PCDATA|italico|sublinhado)* > <!ELEMENT italico (#PCDATA) > <!ELEMENT sublinhado (#PCDATA) > Exemplo de uso <p> um parágrafo pode conter texto <negrito> em evidência </negrito> ou em <italico> itálico </italico></p> InfoView2002 60 Modelo de conteúdo livre (1) Um elemento pode ser definido como sendo um conteúdo qualquer, desde que este conteúdo respeite as regras gerais da linguagem XML. Exemplo <!ELEMENT qualquer ANY> Para que o conteúdo de um elemento de modelo de conteúdo livre seja válido, é necessário que, se ele contiver elementos, estes sejam declarados num DTD InfoView2002 61 Modelo de conteúdo livre (2) Utilidade: este modelo de conteúdo é particularmente útil quando da criação de um DTD complexo Exemplo InfoView2002 <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT relatorio ANY> capitulo ANY> secao ANY> titulo-secao ANY> ilustracao ANY> bibliografia ANY> indice ANY> p ANY> negrito (#PCDATA)> titulo (#PCDATA)> autor (prenome+,nome)> nome (#PCDATA)> prenome (#PCDATA)> 62 Modelo de conteúdo vazio Um elemento pode ser declarado como obrigatoriamente vazio, usando a palavra-chave EMPTY. Exemplo de declarações <!ELEMENT p (#PCDATA|bibref)* > <!ELEMENT bibref EMPTY> <!ATTLIST bibref ref IDREF #REQUIRED> Exemplo de utilização <p> para uma definição precisa, veja <bibref ref='REC-xml-19980210'/> </p> InfoView2002 63 Modelo de conteúdo vazio Observações: quando o modelo de conteúdo de um elemento é o modelo vazio, deve obrigatoriamente obedecer a sintaxe <nome/> não é possível misturar EMPTY a uma outra construção de modelo de conteúdo InfoView2002 64 XML 1.0: atributos Declaração de atributos Um atributo é um par nome-valor associado a um elemento uma declaração de atributos num DTD permite especificar os atributos que poderão ou deverão estar associados às instâncias dos elementos. Forma da declaração <!ATTLIST nome-elemento nome-atributo tipo-atributo declaração-default> InfoView2002 65 Declaração de atributos Exemplos <!ELEMENT <!ATTLIST <!ATTLIST <!ATTLIST ex1 ex1 ex1 ex1 (#PCDATA)> lang NMTOKEN #IMPLIED > target ID #IMPLIED > nb (1 | 2 | 3) '1'> equivalente a <!ATTLIST ex1 lang NMTOKEN #IMPLIED > target ID #IMPLIED > nb (1 | 2 | 3) '1'> InfoView2002 66 XML 1.0: atributos Tipo de atributo O tipo de atributo pode ser: CDATA: o valor do atributo é uma cadeia de caracteres ID ou IDREF: permite definir um identificador para um documento Uma lista de escolhas num conjunto de tokens, ou identificadores lógicos NMTOKEN ou NMTOKENS: abreviação de Name Token. Permite ao atributo de ter seu valor de um conjunto de nomes simbólicos. ENTITY ou ENTITIES: permite que um atributo tome como valor o nome de uma entidade externa não XML NOTATION: define um atributo de notação InfoView2002 67 XML 1.0: atributos Declaração default Possui quatro formas valor por default do atributo #REQUIRED: cada instância deverá ter um atributo deste nome. Não aceita valor default. #IMPLIED: presença facultativa. Não aceita valor default. #FIXED: fixa o valor deste atributo para toda instância. InfoView2002 68 XML 1.0: atributos Exemplos (1) Atributo CDATA <!ATTLIST f att1 CDATA #FIXED '<toto>' > O atributo att1 dos elementos de tipo f tem um valorr constante: o string <toto>. Atributo enumerado Exemplo 1 <!ELEMENT data (#PCDATA) > <!ATTLIST data formato (ANSI | ISO | BR) #REQUIRED> <data formato= ’BR'> 24 Maio 1998 </data> <data formato='ISO'> 1998-05-24 </data> O atributo formato é obrigatório e deve ter valores do tipo ANSI, ISO ou BR Exemplo 2 <!ELEMENT list (item,item+)> <!ELEMENT item (list|#PCDATA)> <!ATTLIST list type (ord | num | alpha) 'ord'> <list type='alpha'> <item> Maria </item> <item> Pedro </item> <item> José </item> InfoView2002 </list> 69 XML 1.0: atributos Exemplos (2) Atributos ID e IDREF Estes tipos de atributos permitem de criar uma referência a um documento <!–- declaração do element secao --> <!–- o atributo de identificação de secao --> <!–- target é optional --> <!ELEMENT secao (#PCDATA|xref)* > <!ATTLIST secao target ID #IMPLIED > <!–- declaracao do elemento xref --> <!ELEMENT xref EMPTY > <!ATTLIST xref ref IDREF #REQUIRED> <secao target='X321'> conteúdo de uma seção </secao> <secao> outra seção. Faz referência à seção X321 <xref ref='X321'/> </secao> Obs.: nós não referenciamos de fato uma seção, mas um elemento do documento que possui um atributo do tipo ID e cujo valor é X321. InfoView2002 70 XML 1.0: entidades Entidades internas Entidades pré-definidas certos caracteres, como < > & ' " não podem ser utilizados dentro do texto de um documento estes caracteres devem ser representados por seus códigos pré-definidos, chamadas entidades pré-definidas <: < >: > &: & InfoView2002 71 XML 1.0: entidades Entidades internas Entidades definidas pelo usuário é possível declarar as entidades dentro do DTD esta declaração tem a forma <!ENTITY nome-entidade "valor-entidade"> Exemplo a declaração seguinte <!DOCTYPE livro [ <!ENTITY copyright "© Tropical Editition">]> <livro> ©right; </livro> produzirá © Tropical Editions observação: 00A9 é o código Unicode do caracter © InfoView2002 72 Entidades externas endereçadas por URL Exemplo <?xml version='1.0' ?> <!DOCTYPE livro [ <!ENTITY capitulo1 SYSTEM "chap1.xml"> <!ENTITY capitulo2 SYSTEM "chap2.xml"> <!ENTITY autor "Maria Luiza Baptista"> ]> <livro> <titulo> XML para iniciantes </titulo> <autor> &autor; </autor> <intro> Era uma vez uma Web… </intro> &capitulo1; &capitulo2; </livro> Restrição: as entidades externas devem ser documentos bem formados InfoView2002 73 Notações e entidades não XML Exemplo InfoView2002 <!DOCTYPE exemplo [ <!NOTATION jpeg SYSTEM "/usr/local/bin/xview"> <!ENTITY foto-ferias SYSTEM "./fotos/foto1.jpg" NDATA jpeg> <!ELEMENT exemplo (foto)> <!ELEMENT foto EMPTY> <!ATTLIST foto img ENTITY #REQUIRED> ]> <exemplo> <foto img='foto-ferias'/> </exemplo> A declaração de notação associa ao formato jpeg a aplicação xview que poderá ser utilizada em extensão da aplicação XML. A declaração da entidade foto-ferias indica que o conteúdo dos dados está situado no arquivo foto1.jpg A palavra-chave NDATA indica que este arquivo é de um formato não XML 74 XML 1.0: Exemplos Exemplo InfoView2002 <?xml version='1.0' ?> <!DOCTYPE db [ <!ELEMENT db (pessoa*)> <!ELEMENT pessoa (nome, idade, email)> <!ELEMENT nome (#PCDATA)> <!ELEMENT idade (#PCDATA)> <!ELEMENT email (#PCDATA)> ]> <db> <pessoa> <nome> Pedro Maia </nome> <idade> 33 </idade> <email> [email protected] </email> </pessoa> <pessoa> <nome> Ana Maria </nome> <idade> 24 </idade> <email> [email protected] </email> </pessoa> <pessoa> . . . </pessoa> 75 </db> DTDs como esquemas Exemplo Seja o esquema r1(a, b, c) e r2 (c, e) <db> <r1> <a> a1 </a> <b> b1 </b> <c> c1 </c> </r1> <r1> <a> a2 </a> <b> b2 </b> <c> c2 </c> </r1> <r2> <c> c1 </c> <d> d1 </d> </r2> <r2> <c> c2 </c> <d> d3 </d> </r2> </db> <!DOCTYPE db[ <!ELEMENT (r1*|r2*)> <!ELEMENT r1(a,b,c)> <!ELEMENT r2(c,d)> <!ELEMENT a (#PCDATA)> <!ELEMENT b (#PCDATA)> <!ELEMENT c (#PCDATA)> <!ELEMENT d (#PCDATA)> InfoView2002]> 76 XML 1.0 Exemplo de DTD <?xml version="1.0"?> <!ELEMENT EMAIL (TO+, FROM, CC*, BCC*, SUBJECT?, BODY?)> <!ATTLIST EMAIL LANGUAGE (Western|Greek|Latin|Universal) "Western" ENCRYPTED CDATA #IMPLIED PRIORITY (NORMAL|LOW|HIGH) "NORMAL"> <!ELEMENT TO (#PCDATA)> <!ELEMENT FROM (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT BCC (#PCDATA)> <!ATTLIST BCC HIDDEN CDATA #FIXED "TRUE"> <!ELEMENT SUBJECT (#PCDATA)> <!ELEMENT BODY (#PCDATA)> <!ENTITY SIGNATURE "Mattheus Baptista"> InfoView2002 77 Limitações de DTDs como esquemas DTD impõe ordem Não existe a noção de tipos de dados atômicos (int, float, etc) Não podemos especificar uma faixa de valores de domínio IDREF não é relacionado a um tipo. Tipos são associados com tags => elementos com mesmo nome porém pertencendo a diferentes tipos (nome de pessoa e nome de um curso) não podem usar o mesmo elemento nome. Nesta caso ou redefinimos nomePessoa e nomeCurso ou usamo namespaces com os qualificadores, pessoa:nome e curso:nome InfoView2002 78 Namespaces InfoView2002 79 Namespaces XML permite autores de documentos criarem suas próprias tags => pode haver uma mesma tag com semântica diferenciada InfoView2002 Ex.: Documento1: <assunto> Bioinformatica </assunto> Documento2: <assunto> Animais </assunto> Usa PI para associar nomes exclusivos a URI Permitem que seja usado um esquema de atribuição de nomes ao longo de um conjunto de documentos 80 Solução Primeira tentativa <Documento1:assunto> Bioinformatica </Documento1:assunto> Segunda tentativa <www.lsi.dsc.ufcg.edu.br/cursos:assunto> Bioinformatica </www.lsi.dsc.ufcg.edu.br/cursos:assunto> Solução final (uso de namespaces) <curso:curso xmlns:curso=”www.lsi.dsc.ufcg.edu.br/cursos”> <curso:assunto> Bioinformatica </curso:assunto> InfoView2002 81 Examplo de Namespace <html:html xmlns:html=”...” xmlns:math=”...”> <html:title> George Soros </html:title> <html:h2> Counting ... </html:h2> <math:reln> ..... </math:reln> </html:html> InfoView2002 82 Namespace default <html xmlns=”...” xmlns:math=”...”> <title> George Soros </title> <h2> Contabilidade ... </h2> <math:reln> ..... </math:reln> </html> InfoView2002 83 Nome de Atributo com Namespace Atributos podem ter namespace Exemplo: <myLink xmlns:xlink=”...” xlink:type=”simple” ...... </myLink> InfoView2002 84 XML Schema InfoView2002 85 XML Schema Visa remediar as limitações dos DTDs Schemas são documentos XML Por ser mais recente ainda não é suportado por muitos parsers Schemas ainda usam um DTD para ser validado Declaração default: <xsd:schema xmlns:xsd=“http://www.w3.org/2000/10/XMLSchema” InfoView2002 86 Propósito de XML Schemas Especificar: a estrutura de documentos “o elemento estudante contém os elementos matrícula, endereço, curso, nome, ... os tipos de dados de cada elemento/atributo InfoView2002 “o elemento idade deve ser inteiro entre 0 e 130” 87 Motivação para XML Schemas Existe insastifação em usar DTDs: sintaxe diferente você escreve seu documento XML usando uma sintaxe e o DTD usando outra sintaxe capacidade limitada de tipos de dados InfoView2002 DTDs suportam um conjunto muito limitado de tipos de dados. Não podemos dizer “o elemento <salario> deve ser entre 0 e 3000,00” Desejo de se ter um conjunto de tipos de dados compatíveis com aqueles encontrados nos banco de dados 88 Vantagens de XML Schemas XML Schemas são mais poderosos que DTDs: Tipos de dados melhor especificado +41 tipos e a capacidade de se criar tipos de dados definidos pelo usuário Escritos em XML (mesma linguagem dos documentos) Podem expressar conjuntos (sets): um elemento filho pode estar em qualquer ordem Pode especificar unicidade (chaves) Uso de técnicas de orientação a objetos InfoView2002 89 Exemplo: Conversão do DTD CatalogoLivros.dtd para XML Schema <!ELEMENT CatalogoLivros(livro)+> <!ELEMENT livro(titulo, autor, data, isbn, editora) <!ELEMENT titulo (#PCDATA) <!ELEMENT autor (#PCDATA) <!ELEMENT data (#PCDATA) <!ELEMENT isbn (#PCDATA) <!ELEMENT editora (#PCDATA) InfoView2002 90 <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org"> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”livro" minOccurs=”1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”livro"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”data" minOccurs="1" maxOccurs="1"/> <xsd:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name=“editora" type="xsd:string"/> </xsd:schema> InfoView2002 91 <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <!ELEMENT CatalogoLivros (livro)+> <xsd:element ref=”livro" minOccurs=”1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”livro"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <!ELEMENT livro (titulo, autor, data, <xsd:element ref=”autor" minOccurs="1" maxOccurs="1"/> ISBN, editora)> <xsd:element ref=”data" minOccurs="1" maxOccurs="1"/> <xsd:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”titulo" type="xsd:string"/> <!ELEMENT titulo (#PCDATA)> <xsd:element name=”autor" type="xsd:string"/> <!ELEMENT autor (#PCDATA)> <xsd:element name=”data" type="xsd:string"/> <!ELEMENT data (#PCDATA)> <xsd:element name="ISBN" type="xsd:string"/> <!ELEMENT ISBN (#PCDATA)> <xsd:element name=”editora" type="xsd:string"/> <!ELEMENT editora (#PCDATA)> </xsd:schema> InfoView2002 92 <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”livro" minOccurs=”1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”livro"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”data" minOccurs="1" maxOccurs="1"/> <xsd:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name="editora" type="xsd:string"/> </xsd:schema> InfoView2002 Todos XML Schemas têm "schema" como elemento raiz.. 93 <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”livro" minOccurs=”1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”livro"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”data" minOccurs="1" maxOccurs="1"/> <xsd:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name="editora" type="xsd:string"/> </xsd:schema> InfoView2002 Os elementos que são usados para criar um XML Schema vêm do XMLSchema namespace 94 <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org” xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”livro" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”livro"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”data" minOccurs="1" maxOccurs="1"/> <xsd:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name="editora" type="xsd:string"/> </xsd:schema> InfoView2002 indica que os elementos declarados neste schema (CatalogoLivros, livro, titulo, autor, data, ISBN, editora) vão para este namespace 95 <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org” xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”livro" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”livro"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”data" minOccurs="1" maxOccurs="1"/> <xsd:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name="editora" type="xsd:string"/> </xsd:schema> InfoView2002 O namespace default é http://www.publishing.org que é o targetNamespace! Este está referenciando uma declaração de um elemento livro. livro em qual namespace? Uma vez que não há um qualificador de namespace, é uma referência ao elemento livro no namespace default, que é o targetNamespace! 96 Referenciando um schema numa instância de um documento XML <?xml version="1.0"?> <CatalogoLivros xmlns ="http://www.publishing.org" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xsi:schemaLocation="http://www.publishing.org CatalogoLivros.xsd"> <livro> <titulo>Meninos de Rua</titulo> <autor>Jorge Amado</autor> <data>julho,1976 </data> <ISBN>94303-12021-43892</ISBN> <editora>Nossos Livros</editora> </livro> ... </CatalogoLivros> 1. O uso de um namespace default, diz ao schema-validator que todos os elementos usados neste document vêm do publishing namespace. 2. schemaLocation indica para o schema-validator que o namespace http://www.publishing.org está definido em CAtalogoLivros.xsd. 3. Diz ao schema-validator que o atributo schemaLocation usado pertence ao the namespace schema instance namespace. InfoView2002 97 Referenciando um schema num documento XML schemaLocation="A CatalogoLivros.xsd" CatalogoLivros.xml - usa elementos do namespace A InfoView2002 targetNamespace="A" CatalogoLivros.xsd - define elementos no namespace A 98 Há multiplos níveis de verificação CatalogoLivros.xml CatalogoLivros.xsd Valida se o documento xml está conforme as regras descritas em CatalogLivros.xsd InfoView2002 XMLSchema.xsd (schema-for-schemas) Valida se CatalogoLivros.xsd é um documento schema válido, i.e., está conforme com as regras descritas no schema-for-schemas 99 Valores Default para minOccurs e maxOccurs O valor default para minOccurs é "1" O valor default para maxOccurs é "1" <element ref=”titulo" minOccurs="1" maxOccurs="1"/> Equivalentes! <element ref=”titulo"/> InfoView2002 100 Esquema alternativo ... <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> InfoView2002 <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element name=”livro" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name=”editora" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> 101 Um tipo pode ser nomeado <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element name=”livro" type="CardCatalogueEntry" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="CardCatalogueEntry"> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name=”editora" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema> Tipo nomeado 102 Observação <xsd:element name="A" type=”ttt"/> <xsd:complexType name=”ttt"> <xsd:sequence> <xsd:element name="B" …/> <xsd:element name="C" …/> </xsd:sequence> </xsd:complexType> Elemento A referencia o complexType ttt. é equivalente a <xsd:element name="A"> <xsd:complexType> <xsd:sequence> <xsd:element name="B" …/> <xsd:element name="C" …/> </xsd:sequence> </xsd:complexType> </xsd:element> InfoView2002 Elemento A tem a definição complexType embutida na delcaração do elemento. 103 Observação 2 Uma declaração de elemento pode ter um atributo type, ou um complexType elemento filho, mas não pode ter ambos. <xsd:element name="A" type=”ttt"> <xsd:complexType> … </xsd:complexType> </xsd:element> InfoView2002 104 Sumário de declaração de Elementos (2 formas) 1 <xsd:element name="nome" type="type" minOccurs="int" maxOccurs="int"/> Um tipos simples Um inteiro Um inteiro não (ex.., xsd:string) não negativo negativo ou "unbounded" ou o nome de um complexType Obs: minOccurs e maxOccurs podem ser usados apenas em declaração de elementos. 2 <xsd:element name="nome" minOccurs="int" maxOccurs="int"> <xsd:complexType> … </xsd:complexType> </xsd:element> InfoView2002 105 Problema: Como restringir os tipos? Suponha que queremos restringir o elemento ISBN da seguinte forma: ddddd-ddddd-ddddd ou d-ddd-ddddd-d ou d-dd-dddddd-d, onde 'd' significa 'digit' <xsd:simpleType name="ISBNType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{5}-\d{5}-\d{5}"/> <xsd:pattern value="\d{1}-\d{3}-\d{5}-\d{1}"/> <xsd:pattern value="\d{1}-\d{2}-\d{6}-\d{1}"/> </xsd:restriction> </xsd:simpleType> InfoView2002 106 <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org” xmlns="http://www.publishing.org”> <xsd:simpleType name="ISBNType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{5}-\d{5}-\d{5}"/> <xsd:pattern value="\d{1}-\d{3}-\d{5}-\d{1}"/> <xsd:pattern value="\d{1}-\d{2}-\d{6}-\d{1}"/> </xsd:restriction> </xsd:simpleType> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element name=”livro" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:date"/> <xsd:element name="ISBN" type="ISBNType"/> <xsd:element name=”editora" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> 107 <xsd:complexType> ou <xsd:simpleType>? Use o elemento complexType quando quiser definir elementos filhos e/ou atributos de um elemento Use o elemento simpleType quando precisar criar um novo tipo que é um refinamento de um tipo embutido (string, integer, etc) InfoView2002 108 Criando seus próprios Datatypes Um novo datatype pode ser definido de um datatype existente (chamado tipo "base" ) através da especificação de valores para uma ou mais das facetas opcionais para o tipo base. Exemplo. O tipo primitivo string tem seis facetas opcionais: pattern enumeration length minLength maxlength whitespace (valores: preserve, replace, collapse) InfoView2002 109 Exemplo de criação de um novo Datatype através da especificação de valores de facetas <xsd:simpleType name=”NumTelefone"> <xsd:restriction base="xsd:string"> <xsd:length value="8"/> <xsd:pattern value="\d{3}-\d{4}"/> </xsd:restriction> </xsd:simpleType> InfoView2002 110 Outro Exemplo <xsd:simpleType name=”Cores-Brasil"> <xsd:restriction base="xsd:string"> <xsd:enumeration value=”verde"/> <xsd:enumeration value=”amarelo"/> <xsd:enumeration value=”azul"/> <xsd:enumeration value=”branco"/> </xsd:restriction> </xsd:simpleType> Cria um novo tipo chamado Cores-Brasil. Um elemento declarado deste tipo deve ter o valor verde, amarelo, azul ou branco. InfoView2002 111 Facetas do tipo Integer Facets: pattern enumeration whitespace maxInclusive maxExclusive minInclusive minExclusive precision InfoView2002 112 Exemplo <xsd:simpleType name= "EarthSurfaceElevation"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="-1290"/> <xsd:maxInclusive value="29035"/> </xsd:restriction> </xsd:simpleType> <xsd:element name="elevation" type="EarthSurfaceElevation"/> Exemplo. Definindo um elemento elevation: <elevation>5240</elevation> InfoView2002 113 Tipos Derivados Podemos ter uma forma de especializar definições complexType. Conhecido como "tipos derivados" derivar por extensão: estender o complexType pai com mais elementos derivar por restrição: restringir o complexType pai através da restrição de alguns elementos para ter uma faixa de valores mais restrita, ou um número de ocorrências mais restrito. InfoView2002 114 <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org” xmlns="http://www.publishing.org”> <xsd:complexType name="Publicacoes"> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”autor" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”data" type="xsd:date"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name=”livro"> <xsd:complexContent> <xsd:extension base=”Publicacoes" > <xsd:sequence> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name=”editora" type="xsd:string"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element name=”livro" type=”livro" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> InfoView2002 115 Derivação por Restrição <xsd:complexType name="Publicacao"> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”autor" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”date" type="xsd:year"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name= "PublicacaoUnicoAutor"> <xsd:complexContent> <xsd:restriction base="Publicacao"> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:year"/> </xsd:sequence> </xsd:restriction> </xsd:complexContent> </xsd:complexType> InfoView2002 116 Proibindo Derivações <xsd:complexType name="Publicacao" final="#all" …> Publicação não pode ser estendida or restringida <xsd:complexType name="Publicacao" final="restriction" …> Publicacao não pode ser restringida <xsd:complexType name="Publicação" final="extension" …> Publicação não pode ser estendida InfoView2002 117 Atributos Seja o DTD <!ELEMENT CatalogoLivros (livro)+> <!ELEMENT livro (titulo, autor+, data, ISBN, editora)> <!ATTLIST livro Categoria (autobiografia | nao-ficcao | ficcao) #REQUIRED EmEstoque (true | false) "false" Revisor CDATA " "> <!ELEMENT titulo (#PCDATA)> <!ELEMENT autor (#PCDATA)> <!ELEMENT data (#PCDATA)> <!ELEMENT ISBN (#PCDATA)> <!ELEMENT editora (#PCDATA)> InfoView2002 118 <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element name=”livro" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name=”editora" type="xsd:string"/> </xsd:sequence> <xsd:attributeGroup ref="AtributosLivro"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:attributeGroup name="AtributosLivro"> <xsd:attribute name="Categoria" use="required"> Categoria (autobiography | non-fiction | fiction) #REQUIRED <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="autobiografia"/> <xsd:enumeration value="nao-ficcao"/> <xsd:enumeration value="ficcao"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> EmEstoque (true | false) "false" <xsd:attribute name=”EmEstoque" type="xsd:boolean" use="default" value="false"/> <xsd:attribute name="Revisor" type="xsd:string" use="default" value=" "/> Revisor CDATA " " </xsd:attributeGroup> InfoView2002 119 Alternativamente ... <xsd:element name=”livro" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name="editora" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="Categoria" use="required"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="autobiografia"/> <xsd:enumeration value="nao-ficcao"/> <xsd:enumeration value="ficcao"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> <xsd:attribute name=”EmEstoque" type="xsd:boolean" use="default" value="false"/> <xsd:attribute name="Revisor" type="xsd:string" use="default" value=" "/> </xsd:complexType> </xsd:element> InfoView2002 120 Sumário de Declaração de Atributos (2 formas) 1 <xsd:attribute name="nome" type=”tipo-simples" use=”como-usado" value="valor"/> xsd:string xsd:integer xsd:boolean ... 2 required default fixed optional prohibited <xsd:attribute name="nome" use=”como-usad" value="valor"> <xsd:simpleType> <xsd:restriction base=”tipo-simples"> <xsd:facet value="valor"/> … </xsd:restriction> </xsd:simpleType> </xsd:attribute> This attribute is only used with use="default" and use="fixed" 121 Observação sobre Atributos A declaração de atributos sempre vem após as declarações de elementos. Os atributos estão sempre com relação ao elemento que eles estão definidos (nested).<xsd:element name=”A"> ”aa e ab são atributos de A" InfoView2002 <xsd:complexType> <xsd:sequence> … </xsd:sequence> <xsd:attribute name=”aa" …/> <xsd:attribute name=”ab" …/> </xsd:complexType> </xsd:element> 122 Elementos com Simple Content e Atributos Exemplo. Considere: <elevation units=“metros">5440</elevation> O elemento elevation tem duas restrições: - um simples (integer) conteúdo - um atributo chamado units Como declarar elevation? InfoView2002 123 Solução <xsd:element name="elevation"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:integer"> <xsd:attribute name="units" type="xsd:string" use="required"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> InfoView2002 124 Solução mais completa (constraints) <xsd:simpleType name="elevationType"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="0"/> <xsd:maxInclusive value="12000"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="unitsType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="feet"/> <xsd:enumeration value="meters"/> </xsd:restriction> </xsd:simpleType> <xsd:element name="elevation"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="elevationType"> <xsd:attribute name="units" type="unitsType" use="required"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> 125 Expressando Alternativas DTD: XML Schema: InfoView2002 <!ELEMENT transporte (trem | aviao | carro)> <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.travel.org" xmlns="http://www.travel.org”> <xsd:element name="transporte"> <xsd:complexType> <xsd:choice> <xsd:element name="trem" type="xsd:string"/> <xsd:element name=”aviao" type="xsd:string"/> <xsd:element name=”carro" type="xsd:string"/> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> 126 Expressando Repetições DTD: XML Schema: InfoView2002 <!ELEMENT binary-string (zero | one)*> <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.binary.org" xmlns="http://www.binary.org”> <xsd:element name="binary-string"> <xsd:complexType> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element name="zero" type="xsd:unsignedByte" fixed="0"/> <xsd:element name="one" type="xsd:unsignedByte" fixed="1"/> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> 127 Expressando Ordem Qualquer <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> XML Schema: <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element name=”livro" maxOccurs="unbounded"> <xsd:complexType> Problema: criar um <xsd:all> elemento livro, que <xsd:element name=”titulo" type="xsd:string"/> contenha autor, titulo, data, <xsd:element name=”autor" type="xsd:string"/> ISBN, e editora, <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> em qualquer ordem. <xsd:element name="editora" type="xsd:string"/> </xsd:all> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> InfoView2002 128 Elemento Vazio <!ELEMENT imagem EMPTY> DTD: <!ATTLIST imagem href CDATA #REQUIRED> Schema: <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.photography.org" xmlns="http://www.photography.org”> <xsd:element name="galeria"> <xsd:complexType> <xsd:sequence> <xsd:element name="imagem" maxOccurs="unbounded"> <xsd:complexType> <xsd:attribute name="href" type="xsd:uriReference" use="required"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> InfoView2002 129 XML API: DOM e SAX Prof. Dr. Cláudio Baptista [email protected] http://www.lsi.dsc.ufcg.edu.br InfoView2002 130 DOM - Introdução XML Document Object Model (DOM) W3C standard recommendation Constrói árvore na memória para documentos XML Um DOM Document é uma coleção de nodes organizada numa hierarquia DOM provê uma API que permite o programador adicionar, editar, mover, ou remover nodes em qualquer ponto da árvore DOM-based parsers fazem o “parsing” destas estruturas. Existe em várias linguagens (Java, C, C++, Python, Perl, etc.) InfoView2002 131 DOM Roadmap Um Parser analiza um arquivo XML para criar um DOM document que é composto de nodes que podem ser elementos, atributos, textos,ou outros tipos de node que fazem parte de um (ou mais) Namespace(s) que podem ser acessados via métodos da DOM API InfoView2002 132 Evolução do DOM Level 0 - Foi a primeira recomendação que permitia Web browsers identificar e manipular elementos numa página Level 1- inclui suporte a XML e HTML Level 2- permite o uso de Namespaces, provê API mais sofisticada com eventos e CSS Level 3- suporte avançado a Namespaces, eventos de User interface, DTD, XML Schema, Xpath, XSLT InfoView2002 133 Exemplo InfoView2002 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ORDERS SYSTEM "orders.dtd"> <orders> <order> <customerid limit="1000">12341</customerid> <status>pending</status> <item instock="Y" itemid="SA15"> <name>Silver Show Saddle, 16 inch</name> <price>825.00</price> <qty>1</qty> </item> <item instock="N" itemid="C49"> <name>Premium Cinch</name> <price>49.00</price> <qty>1</qty> </item> </order> <order> <customerid limit="150">251222</customerid> <status>pending</status> <item instock="Y" itemid="WB78"> <name>Winter Blanket (78 inch)</name> <price>20</price> 134 <qty>10</qty> Exemplo (cont) InfoView2002 135 Tipos básicos de nodes Document Element Attribute Text InfoView2002 136 DOM Introdução DOM tree Cada node representa um elemento, atributo, etc. <?xml version = "1.0"?> <message from = ”Ana" to = ”Marta"> <body>Oi Marta!</body> </message> Node criado para elemento message Elemento message tem element child node: elemento body Elemento body tem text child node: “Oi Marta!" Atributos from e to também têm nodes na InfoView2002 árvore 137 Implementações de DOM DOM-based parsers Microsoft msxml Sun Microsystem JAXP InfoView2002 Parser Descrição JAXP Sun Microsystem Java API para XML Parsing (JAXP) é livremente disponível em java.sun.com/xml. XML4J IBM XML Parser for Java (XML4J) é livremente disponível em www.alphaworks.ibm.com/tech/xml4j. Xerces Apache Xerces Java Parser é livremente disponível em xml.apache.org/xerces. msxml Microsoft XML parser (msxml) version 2.0 é embutido no Internet Explorer 5.5. Version 3.0 está livremente disponível em msdn.microsoft.com/xml. 4DOM 4DOM é um parser para linguagem Python, disponível livremente em fourthought.com/4Suite/4DOM. XML::DOM XML::DOM é um módulo Perl que permite manipular documentos XML usando Perl. Visite www4.ibm.com/software/developer/library/xm l-perl2. 138 DOM: classes e interfaces. Class/Interface Descrição Document interface Representa o top-level node do documento XML, que provê acesso a todos os demais nodes—incluindo o elemento root. Representa um XML document node. Representa uma lista de Node objects. Representa um elemento node. Deriva de Node. Representa um atributo node. Deriva de Node. Representa character data. Deriva de Node. Node interface NodeList interface Element interface Attr interface CharacterData interface Text interface Comment interface Representa um text node. Deriva de CharacterData. Representa um node comentário. Deriva de CharacterData. ProcessingInstruction Representa um processing instruction node. Deriva de Node. interface CDATASection interface Representa um CDATA section. Deriva de Text. InfoView2002 139 Alguns métodos de Document Método Descrição createElement createAttribute createTextNode createComment createProcessingInstruction createCDATASection getDocumentElement appendChild getChildNodes Cria um element node. Crira um attribute node. Cria um text node. Cria um comment node. Cria um processing instruction node. Cria um CDATA section node. Retorna to elemento root Concatena um child node. Retorna os child nodes. InfoView2002 140 Métodos Node Método Descrição appendChild cloneNode getAttributes getChildNodes getNodeName getNodeType Concatena um child node. Duplica o node. Retorna os atributos do node Retorna os nodes filhos do node. Retorna o nome do node Retorna o tipo do node (ex.. elemento, atributo, text, etc.). getNodeValue Retorna o valor do node. getParentNode Retorna o pai do node hasChildNodes Retorna true se o node tem nodes filhos removeChild Remova um node filho do node. replaceChild Troca um node filho com outro node. setNodeValue Coloca o valor do node insertBefore Concatena um node filho na frente de um node filho.. InfoView2002 141 Alguns tipos de node Tipo de Node Descrição Node.ELEMENT_NODE Representa um element node. Node.ATTRIBUTE_NODE Representa um attribute node. Node.TEXT_NODE Representa um text node. Node.COMMENT_NODE Representa um comment node. Node.PROCESSING_INSTRUCTION_ Representa um processing instruction NODE node. Node.CDATA_SECTION_NODE Representa um CDATA section node. InfoView2002 142 Métodos de Element Método Descrição getAttribute getTagName removeAttribute setAttribute Retorna um valor de atributo. Retorna um nome de elemento Remove um atributo de um elemento Coloca um valor de atributo InfoView2002 143 Parsing um arquivo XML num documento Processo em 3 passos 1. Criar o DocumentBuilderFactory. Este objeto criará o DocumentBuilder. 2. Criar o DocumentBuilder. O DocumentBuilder fará o atual parsing criar o objeto Document. 3. Fazer o parsing do arquivo para criar o objeto Document. InfoView2002 144 Exemplo de aplicação básica import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; import org.w3c.dom.Document; public class OrderProcessor { public static void main (String args[]) { File docFile = new File("orders.xml"); Document doc = null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(docFile); } catch (Exception e) { System.out.print("Problem parsing the file."); } InfoView2002 } 145 Ex de aplicação básica import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; import org.w3c.dom.Document; import org.w3c.dom.Element; public class OrderProcessor { ... System.exit(1); } //Passo 1: obtém o elemento raiz (root) Element root = doc.getDocumentElement(); System.out.println("The root element is " + root.getNodeName() } } InfoView2002 146 Ex de aplicação básica Obtendo um node filho ... import org.w3c.dom.NodeList; ... //PASSO 1: obtém o elemento raiz(root) Element root = doc.getDocumentElement(); System.out.println("The root element is "+root.getNodeName()); //PASSO 2: obtém os filhos (children) NodeList children = root.getChildNodes(); System.out.println("There are "+children.getLength()+" nodes in this document."); } } InfoView2002 147 Usando getFirstChild() e getNextSibling() ... import org.w3c.dom.Node; ... //PASSO 3: processando os filhos (children) for (Node child = root.getFirstChild(); child != null; child = child.getNextSibl { System.out.println(child.getNodeName()+" = "+child.getNodeValue()); } } } ... InfoView2002 148 Múltiplos filhos ... public class OrderProcessor { private static void stepThrough (Node start) { System.out.println(start.getNodeName()+" = "+start.getNodeValue()); for (Node child = start.getFirstChild(); child != null;child = child.getNextSibling()) { stepThrough(child); } } public static void main (String args[]) { File docFile = new File("orders.xml"); ... System.out.println("There are "+children.getLength() +" nodes in this document."); //PASSO 4: fazendo recursividade stepThrough(root); InfoView2002 } 149 Resultado: InfoView2002 150 Manipulando Atributos ... import org.w3c.dom.NamedNodeMap; ... private static void stepThroughAll (Node start) { System.out.println(start.getNodeName()+" = "+start.getNodeValue()); if (start.getNodeType() == start.ELEMENT_NODE) { NamedNodeMap startAttr = start.getAttributes(); for (int i = 0; i < startAttr.getLength(); i++) { Node attr = startAttr.item(i); System.out.println(" Attribute: "+ attr.getNodeName() +" = "+attr.getNodeValue()); } } for (Node child = start.getFirstChild(); child != null; child = child.getNextSibl { stepThroughAll(child); } 151 } InfoView2002 Manipulando Atributos InfoView2002 152 Edição de documentos XML Existem métodos para adicionar nodes, remover nodes, mudar valores de nodes Consulte a API! InfoView2002 153 SAX SAX Simple API for XML Outro método para acessar o conteúdo de documentos XML. Desenvolvido por membros da XML-DEV mailing-list (não é da W3C) Usa um modelo baseado em eventos Notificações (eventos) ocorrem à medida em que o documento é analizado (“parsed”) InfoView2002 154 SAX-based Parsers SAX-based parsers Disponível em várias LPs: e.g., Java, Python, C++, etc. Produto Descrição Sun JAXP é disponível em java.sun.com/xml. JAXP suporta SAX e DOM. Apache Xerces parser é disponível em Xerces www.apache.org. Xerces suporta SAX e DOM. MSXML 3.0 Microsoft msxml parser disponível em msdn.microsoft.com/xml e suporta SAX e DOM. JAXP InfoView2002 155 Eventos SAX parser Invoca certos métodos quando eventos ocorrem Programadores devem fazer overriding destes métodos para processar os dados InfoView2002 156 Métodos invocados pelo SAX parser Método Descrição setDocumentLocator startDocument Invocado no início do parsing. Invocado quando o parser encontra o início de um documento XML endDocument Invocado quando o parser encontra o fim de um documento XML startElement Invocado quando a tag de inicio de um elemento é encontrada endElement Invocado quando a tag de fim de um elemento é encontrada. characters Invocado quando text characters são encontrados. ignorableWhitespace Invocado quando whitespace que pode ser ignorado é encontrado. processingInstruction Invocado quando um PI é encontrada. InfoView2002 157 Como SAX funciona? Dado o documento XML abaixo: <?xml version="1.0"?> <samples> <server>UNIX</server> <monitor>color</monitor> </samples> InfoView2002 SAX gera os seguintes EVENTOS: Start document Start element (samples) Characters (white space) Start element (server) Characters (UNIX) End element (server) Characters (white space) Start element (monitor) Characters (color) End element (monitor) Characters (white space) 158 End element (samples) Como SAX funciona? Processamento em SAX involve os seguintes passos 1. Criar um event handler 2. Criar o SAX parser 3. Associar o event handler ao parser criado 4. Fazer o parsing do documento, enviando cada evento ao event handler. InfoView2002 159 Exemplo: Uma pesquisa de opinião InfoView2002 <?xml version="1.0"?> <surveys> <response username="bob"> <question subject="appearance">A</question> <question subject="communication">B</question> <question subject="ship">A</question> <question subject="inside">D</question> <question subject="implant">B</question> </response> <response username="sue"> <question subject="appearance">C</question> <question subject="communication">A</question> <question subject="ship">A</question> <question subject="inside">D</question> <question subject="implant">A</question> </response> <response username="carol"> <question subject="appearance">A</question> <question subject="communication">C</question> <question subject="ship">A</question> <question subject="inside">D</question> <question subject="implant">C</question> </response> 160 </surveys> Criando um event handler import org.xml.sax.helpers.DefaultHandler; public class SurveyReader extends DefaultHandler { public SurveyReader() { System.out.println("Object Created."); } public void showEvent(String name) { System.out.println("Hello, "+name+"!"); } public static void main (String args[]) { SurveyReader reader = new SurveyReader(); reader.showEvent(”Nick"); } InfoView2002 161 } // Exemplo usando JAXP import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.XMLReader; public class SurveyReader extends DefaultHandler { public SurveyReader() { } Criando o public static void main (String args[]) { SAX XMLReader xmlReader = null; parser try { SAXParserFactory spfactory = SAXParserFactory.newInstance() SAXParser saxParser = spfactory.newSAXParser(); xmlReader = saxParser.getXMLReader(); } catch (Exception e) { System.err.println(e); System.exit(1); } } InfoView2002 162 } Associando o event handler ao parser ... xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler(new SurveyReader()); } catch (Exception e) { ... InfoView2002 163 Parsing os dados ... import org.xml.sax.InputSource; ... xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler(new SurveyReader()); InputSource source = new InputSource("surveys.xml"); xmlReader.parse(source); } catch (Exception e) { ... Pronto! Falta apenas definir os eventos ... InfoView2002 164 Criando um ErrorHandler ... import org.xml.sax.SAXParseException; public class SurveyReader extends DefaultHandler { public SurveyReader() { } public void error (SAXParseException e) { System.out.println("Error parsing the file: "+e.getMessage()); } public void warning (SAXParseException e) { System.out.println("Problem parsing the file: "+e.getMessage() } public void fatalError (SAXParseException e) { System.out.println("Error parsing the file: "+e.getMessage()); System.out.println("Cannot continue."); System.exit(1); } public static void main (String args[]) { ... InfoView2002 165 Associando o ErrorHandler ... xmlReader.setContentHandler(new SurveyReader()); xmlReader.setErrorHandler(new SurveyReader()); InputSource source = new InputSource("surveys.xml"); ... InfoView2002 166 Eventos: startDocument() ... import org.xml.sax.SAXException; public class SurveyReader extends DefaultHandler { ... public void fatalError (SAXParseException e) { System.out.println("Error parsing " + "the file: "+e.getMessage()); System.out.println("Cannot continue."); System.exit(1); } public void startDocument() throws SAXException { System.out.println("Tallying survey results..."); } public static void main (String args[]) { ... InfoView2002 167 Eventos: startElement() ... import org.xml.sax.Attributes; public class SurveyReader extends DefaultHandler { ... public void startDocument() throws SAXException { System.out.println("Tallying survey results..."); } public void startElement( String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { System.out.print("Start element: "); System.out.println(localName); } public static void main (String args[]) { … InfoView2002 } 168 startElement(): pegando atributos ... public void startElement( String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { System.out.print("Start element: "); System.out.println(localName); for (int att = 0; att < atts.getLength(); att++) { String attName = atts.getLocalName(att); System.out.println(" " + attName + ": " + atts.getValue(attName)); } } InfoView2002 ... 169 Obtendo Dados: characters() … // ch inclui o documento inteiro public void characters(char[] ch, int start, int length) throws SAXException { if (thisElement == "question") { printIndent(4); System.out.print(thisQuestion + ": "); System.out.println(new String(ch, start, length)); } } ... InfoView2002 170 Obtendo Dados: characters() InfoView2002 171 Obtendo Dados: characters() (completo) public void endElement( String namespaceURI, public void printIndent(int indentSize) { String localName, for (int s = 0; s < indentSize; s++) { String qName) System.out.print(" "); throws SAXException { } thisQuestion = ""; } thisElement = ""; String thisQuestion = ""; } String thisElement = ""; public void characters(char[] ch, public void startElement( int start, String namespaceURI, int length) String localName, throws SAXException { String qName, if (thisElement == "question") { Attributes atts) printIndent(4); throws SAXException { System.out.print(thisQuestion + ": "); if (localName == "response") { System.out.println(new String(ch, System.out.println("User: " start, length)); + atts.getValue("username")); } } else if (localName == "question") { } thisQuestion = atts.getValue("subject"); ... } thisElement = localName; InfoView2002 172 } ... SAX versus DOM DOM Modelo baseado em árvore armazena o documento inteiro numa hierarquia de document nodes Dados são acessados rapidamente Provê facilidades para adicionar e remover nodes SAX Invoca métodos quando markup (tag) é encontrada Melhor performance do que DOM Menos overhead de memória do que DOM Tipicamente usado para ler documentos (não para modificá-los) InfoView2002 173 XSL - eXtensible Stylesheet Language InfoView2002 174 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. InfoView2002 175 Opções para mostrar XML InfoView2002 176 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 InfoView2002 177 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. InfoView2002 178 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 InfoView2002 179 External Style Sheets External Style Sheets Contidas num arquivo.css Único style sheet usado por múltiplas páginas Usado com o elemento link InfoView2002 180 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 } InfoView2002 <html> <!-- Linking external style sheets --> <head> <title>Exemplo de CSS</title> <link rel = "stylesheet" type = "text/css” href = "styles.css"> </head> 181 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 InfoView2002 182 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) InfoView2002 183 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 InfoView2002 184 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 InfoView2002 185 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 InfoView2002 186 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 InfoView2002 187 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> 188 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 InfoView2002 189 <?xml version=“1.0” encoding=“iso-8859-1”?> <saudacao>Bem-vindo ao InfoView 2002!</saudacao> Saudacao.xml <html> <head> <title>Saudação de Hoje</title> Saudacao.html </head> <body> <p>Bem-vindo ao InfoView 2002!</p> </body> </html> InfoView2002 190 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 InfoView2002 191 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 ao InfoView 2002!</saudacao> Saudacao.xml InfoView2002 192 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> InfoView2002 193 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> InfoView2002 194 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 InfoView2002 195 Templates A maioria dos templates têm a seguinte forma: <xsl:template match="emphasis"> <i><xsl:apply-templates/></i> </xsl:template> The elemento <xsl:template> é um template O match pattern determina onde este template se aplica Elementos XSLT vêm do XSL namespace InfoView2002 196 XSLT – Expressões XPath Contrutores sintáticos Chamadas de função - pode-se chamar funções embutidas ou definidas em XSLT concat() calculaDesconto() count(@*) not(isbn) $ - referencia uma variável ou um parâmetro $X $ALPHA or, and representa expressões booleanas or e and, respectivamente $x = 5 or $x = 10 $x > 3 and $x < 8 InfoView2002 197 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 InfoView2002 198 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> InfoView2002 199 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> InfoView2002 200 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> InfoView2002 201 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 InfoView2002 202 <?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> InfoView2002 203 Resultado InfoView2002 204 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. InfoView2002 205 <?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" /> </td> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> InfoView2002 206 Resultado InfoView2002 207 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> InfoView2002 208 <?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> <xsl:value-of select="artist" /> </td> </td> </tr> </xsl:if> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> InfoView2002 209 XSLT - Elementos InfoView2002 210 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> InfoView2002 211 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) InfoView2002 212 Exemplo: Seja o DB XML: InfoView2002 <?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> 213 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> InfoView2002 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 214 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> InfoView2002 215 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 InfoView2002 216 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 InfoView2002 217 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> InfoView2002 218 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> InfoView2002 219 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> InfoView2002 220 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>> InfoView2002 221 XSLT - Funções current() Retorna o nó corrente current() => conjunto de nós <<generate-id(current())>> document() Retorna o nó raiz de um documento XML externo document(uri) => nó <<document(‘data.xml’)>> InfoView2002 222 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’)>> InfoView2002 223 XSLT - Funções count(arg1) sum(arg1) retorna o número de nodes presentes no conjunto de nós passados como argumento 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 InfoView2002 Ex: contains (‘Paris’, ‘A’) retorna false 224 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> InfoView2002 225 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> InfoView2002 226 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> InfoView2002 227 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 InfoView2002 228 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 InfoView2002 229 Exemplo <?xml version="1.0" encoding="utf-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> ... <fo:page-sequence> <fo:flow> <fo:block font-size="18pt" font-weight="bold" text-align="centered"> Prefácio </fo:block> <fo:block font-size="12pt" space-before="1pc" text-align="justified"> Este é um documento simples de teste. Ele mostra uma <fo:inline font-style="italic">árvore</fo:inline> fo-result parcial (sem usar page layout). </fo:block> </fo:flow> </fo:page-sequence> ... </fo:root> InfoView2002 230 Exemplo <xsl:template match="chapter"> <fo:flow> <xsl:apply-templates/> </fo:flow> </xsl:template> <xsl:template match="chapter/title"> <fo:block font-size="18pt" font-weight="bold" text-align="centered"> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="para"> <fo:block font-size="12pt" space-before="1pc" text-align="justified"> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="emphasis"> <fo:inline font-style="italic"> <xsl:apply-templates/> </fo:inline> </xsl:template> InfoView2002 231 Alguns Formatting Objects (FO) page-sequence-- a parte maior (tal como body) na qual o layout de página pode diferir de outras partes flow-- um capítulo ou divisão de seção dentro de uma page-sequence block-- um parágrafo (ou title ou block quote, etc.) inline-- uma mudança de fonte dentro de um parágrafo list FOs--list-block, list-item, list-item-label, list-item-body graphic--referencia um objeto gráfico externo table FOs--análogo a table model em HTML InfoView2002 232 Propriedades básicas fonte margens e espaçamento bordas alinhamento horizontal/justification endentação dentre outros ... InfoView2002 233 Exemplo Final <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:template match="article"> <fo:page-sequence font-family="serif" font-size="12pt"> <xsl:apply-templates/> </fo:page-sequence> </xsl:template> <xsl:template match="chapter"> <fo:flow> <xsl:apply-templates/> </fo:flow> </xsl:template> <xsl:template match="para"> <fo:block space-before="6pt"> <xsl:apply-templates/> </fo:block> </xsl:template> <!--(continua no próximo slide) --> InfoView2002 234 Exemplo (cont) <xsl:template match="chapter/title"> <fo:block font-family="sans-serif" color="blue" font-weight="bold" font-size="18pt" space-after="0.5em"> <xsl:number level="multiple" count="chapter"/> <xsl:text> </xsl:text> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="section/title"> <fo:block font-family="sans-serif" font-weight="bold" font-size="16pt" space-after="0.5em"> <xsl:number level="multiple" count="chapter|section"/> <xsl:text> </xsl:text> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="article/title"> <fo:block font-family="sans-serif" font-size="24pt" space-after="2pc"> <xsl:apply-templates/> </fo:block> </xsl:template> </xsl:stylesheet> InfoView2002 235 Consulta a dados semi-estruturados InfoView2002 236 Consulta Requisitos desejáveis (Maier ’98) Expressividade Semântica precisa o resultado de uma consulta deve poder ser utilizado dentro de uma outra consulta Consulta ao esquema muito importante para XML Composição linguagem de consulta ao estilo SQL possibilitar a restruturação de dados semi-estruturados visando otimização Facilitar a geração automática de consultas InfoView2002 237 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 root.pessoas.filhos {&p1,&p2,&p3} {&p2,&p3} semântica InfoView2002 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. 238 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 InfoView2002 239 Linguagem de Consulta X-Query InfoView2002 240 XQuery Baseda em Quilt (que é baseda em XML-QL) http://www.w3.org/TR/xquery/2/2001 XML Query data model InfoView2002 241 FLWR (“Flower”) Expressions FOR ... LET... WHERE... RETURN... InfoView2002 242 XQuery Encontre os títulos dos livros publicados após 1995: FOR $x IN document("bib.xml")/bib/book WHERE $x/year > 1995 RETURN $x/title Resultado: <title> abc </title> <title> def </title> <title> ghi </title> InfoView2002 243 XQuery Para cada autor de um livro publicado pela Morgan Kaufmann, listar os livros publicados: FOR $a IN distinct(document("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 InfoView2002 244 XQuery Resultado: <result> <author>Jones</author> <title> abc </title> <title> def </title> </result> <result> <author> Smith </author> <title> ghi </title> </result> InfoView2002 245 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 InfoView2002 246 XQuery <big_publishers> FOR $p IN distinct(document("bib.xml")//publisher) LET $b := document("bib.xml")/book[publisher = $p] WHERE count($b) > 100 RETURN $p </big_publishers> count = função (aggregate) que retorna o número de elementos InfoView2002 247 XQuery 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 InfoView2002 248 XQuery Sumário: FOR-LET-WHERE-RETURN = FLWR FOR/LET Clauses Lista de tuplas WHERE Clause Lista de tuplas RETURN Clause InfoView2002 Instância do modelo de dados Xquery 249 FOR versus LET FOR liga variáveis nodo iteration LET liga variáveis coleção one value InfoView2002 250 FOR versus LET FOR $x IN document("bib.xml")/bib/book RETURN <result> $x </result> LET $x IN document("bib.xml")/bib/book RETURN <result> $x </result> InfoView2002 Retorna: <result> <book>...</book></result> <result> <book>...</book></result> <result> <book>...</book></result> ... Retorna: <result> <book>...</book> <book>...</book> <book>...</book> ... </result> 251 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> InfoView2002 Retorna: <result> <author>...</author> <author>...</author> <author>...</author> ... </result> 252 Ordenação em XQuery <publisher_list> FOR $p IN distinct(document("bib.xml")//publisher) RETURN <publisher> <name> $p/text() </name> , FOR $b IN document("bib.xml")//book[publisher = $p] RETURN <book> $b/title , $b/price </book> SORTBY(price DESCENDING) </publisher> SORTBY(name) </publisher_list> Argumentos de sort referem-se ao namespace da cláusula RETURN e não da cláusula FOR InfoView2002 253 If-Then-Else FOR $h IN //holding RETURN <holding> $h/title, IF $h/@type = "Journal" THEN $h/editor ELSE $h/author </holding> SORTBY (title) InfoView2002 254 Quantificador Existencial FOR $b IN //book WHERE SOME $p IN $b//para SATISFIES contains($p, "sailing") AND contains($p, "windsurfing") RETURN $b/title InfoView2002 255 Quantificador Universal FOR $b IN //book WHERE EVERY $p IN $b//para SATISFIES contains($p, "sailing") RETURN $b/title InfoView2002 256