XML: uma introdução prática <xml:introdução /> Helder da Rocha www.argonavis.com.br 1 Objetivos § Oferecer uma visão geral da tecnologia XML § Responder às questões § Como implementar soluções de gestão de informações usando XML? § Quando e como usar as tecnologias e linguagens que viabilizam o compartilhamento de informações? § Apresentar § Breve introdução ao XML e tecnologias relacionadas. § Recursos para manipular informações representadas em XML: ferramentas, linguagens e tecnologias 2 Assuntos abordados Por que XML? Onde usar XML? Como produzir documentos XML Documentos válidos: DTD e XML Schema Manipulação via programação em DOM e SAX Transformação: XSLT e XPath Localização e extração: XLink, XQuery e XPointer Visualização: XSL-FO e SVG Demonstração: geração de HTML, RTF e PDF Ferramentas e Conclusões 3 O que é XML? § eXtensible Markup Language: padrão W3C § Uma maneira de representar informação § não é uma linguagem específica § não define vocabulário de comandos § não define uma gramática, apenas regras mínimas § Exemplo: documento XML usuario_33.xml <contato codigo="33"> <nome>Severino Severovitch</nome> <email>[email protected]</email> <telefone tipo="celular"> <area>11</area> <numero>9999 4321</numero> </telefone> </contato> elemento atributo "nó" de texto 4 XML versus HTML HTML mostra como apresentar XML mostra o que significa <h1>Severino Severovitch</h1> <h2>[email protected]</h2> <p> <b>11</b> <i>9999 4321</i> </p> <nome>Severino Severovitch</nome> <email>[email protected]</email> <telefone> <ddd>11</ddd> <numero>9999 4321</numero> </telefone> 5 Anatomia de um documento XML § Documentos XML são documentos de texto Unicode § É uma hierarquia de elementos a partir de uma raiz § Menor documento tem um elemento (vazio ou não): <nome> Ñåâåðèíî Ñåâåðîâè÷ </nome> § Menor documento contendo elemento vazio <nome></nome> = Elemento raiz <nome/> § Menor documento contendo elemento e conteúdo texto <nome> Ñåâåðèíî Ñåâåðîâè÷ </nome> Etiqueta inicial Conteúdo do Elemento Etiqueta final 6 Partes de um documento elemento raiz declaração XML nó raiz ( / ) <?xml version="1.0" encoding="iso-8859-1" ?> atributos <cartao-simples> <logotipo href="/imagens/logo14bis.gif" /> <nome>Alberto Santos Dumont</nome> <endereco>Rua do Encanto, 22 - 2o. andar Centro - 25600-000 - Petrópolis - RJ</endereco> <email>[email protected]</email> <telefone tipo="residencial" > <ddd>21</ddd> elementos <numero>2313011</numero> </telefone> </cartao-simples> 7 nó raiz / Árvore XML elemento raiz cartao-simples cartao-simples email email [email protected] nome nome endereco endereco Alberto Santos Dumont logotipo logotipo numero numero ddd ddd tipo tipo 21 2313011 residencial href href /imagens/logo14bis.gif LEGENDA telefone telefone Rua do Encanto, 22 2o. andar - Centro - 25600-000 Petrópolis - RJ nó de elemento nó de atributo nó de texto 8 XML Namespaces § Limita o escopo de elementos § Evita conflitos quando duas linguagens se cruzam no mesmo documento § Consiste da associação de um identificador a cada elemento/atributo da linguagem, que pode ser § herdado através do escopo de uma sub-árvore § atribuído explicitamente através de um prefixo § Exemplo prefixo identificador <cadastro xmlns:firma="01.234.567/0001-99"> <nome>Severino Severovitch</nome> <firma:nome>Sibéria Informática Ltda.</firma:nome> <email>[email protected]</email> </cadastro> Este elemento <nome> pertence a outro namespace 9 Por que usar XML para compartilhar dados? § Porque é um padrão aberto § Facilidade para converter para formatos proprietários § Porque é texto § Fácil de ler, fácil de processar, menos incompatibilidades § Porque promove a separação entre estrutura, conteúdo e apresentação § Facilita geração de dados para visualização dinâmica § Evita repetição de informação / simplifica manutenção § Porque permitirá semântica na Web § Elementos HTML não carregam significado, apenas dicas de formatação: mecanismos de busca ficam prejudicados § Solução com XML dependerá de suporte dos clientes 10 Onde usar XML? § Dados armazenados em XML podem ser facilmente transformados em outros formatos texto "custom" <xml> XML <xml> <xml> <xml> <xml> WML VoiceXML Web HTML CSS JavaScript VRML XSLT W DOM SAX SGBD Gráficos SVG Imagens JPG e PNG XSL-FO 2000 2001 PDF PDF PDF RTF TeX SGML PDF e PostScript 11 Como produzir XML § Criando um documento de texto Unicode a partir de qualquer editor de textos <contato codigo="33"> <nome>Severino Severovitch</nome> <email>[email protected]</email> <telefone tipo="celular"> <area>11</area> <numero>9999 4321</numero> </telefone> </contato> § Gerando um documento a partir de uma árvore montada dinamicamente 33 Severino Severovitch [email protected] celular 11 9999 4321 <contato codigo="33"> <nome>Severino Severovitch</nome> <email>[email protected]</email> <telefone tipo="celular"> <area>11</area> <numero>9999 4321</numero> </telefone> </contato> 12 Documentos XML bem formados § Para que possa ser manipulado como uma árvore, um documento XML precisa ser bem formado § Documentos que não são bem formados não são documentos XML § Documentos bem-formados obedecem as regras de construção de documentos XML genéricos § Regras incluem § § § § § Ter um, e apenas um, elemento raiz Valores dos atributos estarem entre aspas ou apóstrofes Atributos não se repetirem Todos os elementos terem etiqueta de fechamento Elementos estarem corretamente aninhados 13 XML válido § Um XML bem construído pode não ser válido em determinada aplicação § Aplicação típica pode esperar que § elementos façam parte de um vocabulário limitado, § certos atributos tenham valores e tipos definidos, § elementos sejam organizados de acordo com uma determinada estrutura hierárquica, etc. § É preciso especificar a linguagem! § Esquema: modelo que descreve todos os elementos, atributos, entidades, suas relações e tipos de dados § Um documento XML é considerado válido em relação a um esquema se obedecer todas as suas regras 14 Esquema Documentos que aderem à especificação (válidos) Documento fora da especificação § O esquema representa uma classe § Os documentos são instâncias Esquema (universo de documentos válidos) Como definir esquemas: DTD - Document Type Definition W3C XML Schema 15 DTD vs. XML Schema § Um esquema é essencial para que haja comunicação usando XML § Pode ser estabelecido "informalmente" (via software) § Uso formal permite validação usando ferramentas genéricas de manipulação de XML § Soluções DTD <!ELEMENT contato (nome, email, telefone)> <!ATTLIST contato codigo NMTOKEN #REQUIRED> • Simples mas não é XML • Não suporta namespaces • Limitado quando a tipos de dados XSchema <xsd:schema xmlns:xsd=".../XMLSchema"> <xsd:element name="contato"> <xsd:complexType> <xsd:attribute name="codigo" use="required"> • É XML, porém mais complexo • Suporta namespaces • Permite definição de tipos 16 Visualização em um browser § Folha de estilo: conjunto de regras para formatar ou transformar as informações de um documento XML § CSS - Cascading Style Sheets § Transformação visando apresentação visual § Aplicação do estilo em tempo de execução no cliente § XSLT - eXtensible Stylesheet Language § Transformação em texto, HTML ou outro formato § Aplicação em tempo real ou prévia (no servidor) § Se não estiver associado a uma folha de estilo, o documento XML não tem uma "aparência" definida § Internet Explorer e outros mostram a árvore-fonte XML § Netscape mostra apenas os nós de texto 17 Como manipular XML? § Há duas APIs padrão para manipular (interpretar, gerar, extrair dados e tratar eventos) arquivos XML: § W3C Document Object Model (W3C DOM) § Simple API for XML (SAX) § Servem a finalidades diferentes § Implementações disponíveis em várias linguagens § SAX oferece métodos que respondem a eventos produzidos durante a leitura do documento § notifica quando um elemento abre, quando fecha, etc. § DOM monta uma árvore, que permite a navegação na estrutura do documento § propriedades dos objetos podem ser manipuladas 18 Leitura de XML com SAX § Se um processador SAX receber o documento ... <carta> <mensagem id="1">Bom dia!</mensagem> </carta> § ... ele irá disparar a seguinte seqüência de eventos: startDocument() startElement("carta", []) startElement("mensagem", [Attribute("id","1")]) characters("Bom dia!") endElement("mensagem") endElement("carta") endDocument() § Programador deve implementar um objeto "ouvinte" para capturar os eventos e extrair as informações desejadas 19 Criação de documentos com DOM (1) § Criação dos elementos / Document <carta> Obter objeto do tipo Document (raiz) (dependente de processador): doc Element <mensagem> Bom dia! Element String carta = doc.createElement("carta") mens = doc.createElement("mensagem") texto = doc.createTextNode("Bom dia!") § Atributos <mensagem id="1"> mens.setAttribute("id", "1") 20 Criação de documentos com DOM (2) Montagem da árvore passo-a-passo 1. Sub-árvore <mensagem> 3. Árvore completa <mensagem id="1"> mens.appendChild(texto) / Bom dia! <carta> 2. Sub-árvore <carta> <mensagem id="1"> <carta> carta.appendChild(mens) Bom dia! <mensagem id="1"> doc.appendChild(carta) Bom dia! 21 XPath § Linguagem usada para navegar na árvore XML § Uma expressão XPath é um caminho* na árvore que resulta em um valor (número, texto, booleano), objeto (elemento, atributo, nó de texto) ou conjunto de objetos • Caminhos absolutos 33 Severino Severovitch [email protected] celular 11 9999 4321 /contato/@codigo /contato/telefone/@tipo /contato/telefone/numero/text() • Relativos ao contexto /contato: @codigo (ou ./@codigo) telefone/@tipo (ou ./telefone/@tipo) telefone/numero/text() § Expressões XPath são usadas dentro de atributos XML § Usadas em XSLT, XLink, XQuery e XPointer * pode também ser padrão de busca 22 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="livro/titulo"> <td><xsl:value-of select="." /></td> XSLT § XSL Transformations § Linguagem (XML) para criação de documentos que contêm regras de transformação para documentos XML § Documentos escritos em XSLT são chamados de folhas de estilo e contêm § Elementos XSLT: <template>, <if>, <foreach>, ... § Expressões XPath para localizar nós da árvore-fonte § Texto ou XML a ser gerado no documento-resultado § Processador XSLT fonteToHtml.xslt Folha de estilos fonte.xml Documento Fonte Processador XSLT Xalan, TrAX, Saxon Netscape, I. Explorer Documento Resultado 23 XSLT: documento-fonte (1) § Considere o seguinte documento-fonte: <aeronave id="PTGWZ"> <origem partida="08:15">Rio de Janeiro</origem> <destino>Itabuna</destino> </aeronave> / <aeronave> @id PTGWZ <origem> § Árvore-fonte Rio de Janeiro @partida <destino> 08:15 Itabuna 24 XSLT: folha de estilos (2) § O seguinte template (parte de uma folha de estilos XSLT) pode extrair os dados do documento-fonte documento-fonte (em azul - XPath) <xsl:template match="aeronave"> <p>A aeronave de prefixo documento <xsl:value-of select="@id" /> decolou resultado de <xsl:value-of select="origem" /> às (em preto) <xsl:value-of select="origem/@partida" /> tendo como destino o aeroporto de <xsl:value-of select="destino" />.</p> </xsl:template> elementos XSLT (em vermelho, com prefixo xsl) § Elementos XSLT geralmente são usados com um prefixo associado ao seu namespace: <xsl:elemento> para evitar conflitos com o documento-resultado. 25 XSLT: documento-resultado (3) § Após a transformação, o resultado será <p>A aeronave de prefixo PTGWZ decolou de Rio de Janeiro às 8:15 tendo como destino o aeroporto de Itabuna.</p> § Para obter outros resultados e gerar outros formatos com os mesmos dados, deve-se criar folhas de estilo adicionais 26 XLink, XPointer e XQuery § XLink: é uma especificação W3C que permite definir vínculos entre documentos XML § Funcionalidade mínima é igual ao <a href> do HTML § Funcionalidade estendida permite vínculos bidirecionais, arcos, vários níveis de semântica, etc. § É uma coleção de atributos, com namespace próprio, que podem ser usados em elementos de qualquer linguagem XML. § XPointer: aponta para partes de documentos XML § Identificador (ID) colocado no destino, accessível através de fragmento de URL: xlink:href="#identificador" § Caminho resultante de expressão XPath: xpointer(/livro/id) § XQuery: linguagem para pesquisar documentos XML § Exemplo: FOR $b IN document("usuario_33.xml")/contato WHERE nome="Severino Severovitch" RETURN $b 27 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="p1"> <fo:region-body/> XSL-FO § XSL Formatting Objects § Linguagem XML de descrição de página com os mesmos recursos que PostScript ou PDF § Descreve o layout preciso de texto e imagens § Possui centenas de elementos, atributos e propriedades (que são semelhantes às propriedades do CSS) § Páginas são facilmente convertidas para PDF e PostScript § Ideal para gerar documentos para impressão (livros, etc.) § Normalmente gerada via XSLT XML XSLT XML Fonte Processador XSLT XML Documento XSLFO FOP Documento PDF 28 XSL-FO: menor documento <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> Este é o "<head>" <fo:layout-master-set> do XSL-FO <fo:simple-page-master master-name="p1"> <fo:region-body/> Ligação entre as </fo:simple-page-master> regras de layout e </fo:layout-master-set> o conteúdo afetado <fo:page-sequence master-name="p1"> <fo:flow flow-name="xsl-region-body"> <fo:block color="blue" font-size="20pt"> Hello PDF! </fo:block> </fo:flow> Este é o "<body>" </fo:page-sequence> do XSL-FO </fo:root> 29 <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Página XHTML</title></head> <body> <h1>Página XHTML</h1> XHTML § eXtensible HTML § Linguagem XML de descrição de página Web § Mesmos elementos do HTML 4.0 Strict § Elementos descrevem somente a estrutura dos componentes da página. § A forma precisa ser especificada usando CSS: não há elementos/atributos para mudar cor, alinhamento, etc. § Pode ser misturada (estendida) com outras linguagens XML (MathML, SVG, linguagens proprietárias) § Normalmente gerada via XSLT XML XSLT XML Documento Fonte XML Processador XSLT Documento XHTML 30 <svg> <circle style="fill: red" cx="3cm" cy="3cm" r="2.5cm" /> <rect style="fill: blue" x="6cm" y="6cm" height="2.5cm" width="1.5cm" /> SVG § W3C Scalable Vector Graphics § Gráficos vetoriais em XML § Plug-ins para principais browsers: concorre com Flash § Suporta animações, links, JavaScript, CSS § Produzido por ferramentas como Adobe Ilustrator § Pode ser embutido no código XHTML e XSL-FO Zoom + Zoom + 31 Exemplo de SVG JavaScript <svg width="10cm" height="10cm"> <g onclick="alert('Clicou no grupo 1!')"> CSS <circle style="fill: red" cx="3cm" cy="3cm" r="2.5cm" /> <rect style="fill: blue" x="6cm" y="6cm" height="2.5cm" width="1.5cm" /></g> <g onclick="alert('Clicou no grupo 2!')"> <circle style="fill: green; opacity: 0.5" cx="5cm" cy="5cm" r="2cm" /></g> <a xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/Graphics/SVG"> <text style="color: black; font-family: tahoma; font-size: 12pt" x="3cm" y="8cm"> SVG é XML</text></a> </svg> XLink 32 Algumas outras linguagens XML Classe oper(): void oper2(): int MathML WML VoiceXML 1 XMI * Classe2 oper(): void oper2(): int Classe3 oper(): void oper2(): int Web Services SOAP WSDL UDDI XML-RPC CML ebXML 33 Demonstração § Exemplo de transformação XML PDF FOP <xslt> FO (1) <xml> (1.b) Xalan <xslt> Texto <xsl:fo> (1.a) (3) <xslt> SVG JFOR W (4) (2) Texto texto texto texto texto texto texto texto texto <xslt> HTML HTML 2000 2001 SVG 34 Ferramentas § Para programação § Parsers-validadores: Xerces, Crimson, MSXML 4.0 § Validadores: MSV (Sun) § Transformadores XSL: TrAX, Xalan, Xt, Saxon § APIs: JDOM, JAX (P, B, M, R, RPC), SAX e DOM § Veja mais em xml.apache.org e www.alphaworks.ibm.com § Para edição (de XML genérico) § XML Spy Suite § Framemaker / ArborText § JEdit com plug-ins para XML, XSLT e XPath § Veja mais em www.w3.org/XML/ 35 Conclusões § XML é uma ótima solução para compartilhar dados § Para implementar soluções em gestão de informações usando XML, pode-se usar § DTD ou XSchema para especificar o modelo de dados e validar § § § § § as informações As APIs DOM ou SAX para extrair dados dos documentos, gerar documentos, ler e gravar em bancos de dados XSLT e XPath para transformar os dados em outros formatos XLink, XPointer e XQuery para criar vínculos lógicos entre os documentos e localizar seus componentes XSL-FO ou XHTML para formatar os dados para impressão ou visualização na tela (PDF, Word ou Web) SVG para gerar informações em forma de gráfico vetorial 36 Fontes [1] World Wide Web Consortium (W3C). eXtensible Markup Language. http://www.w3.org/XML/. Ponto de partida e principal fonte sobre XML e suas tecnologias "satélite". Contém últimas especificações de XML, XPath, XSchema, XSLT, XSL-FO, XQuery, XLink, XPointer, SVG, XHTML, CSS. [2] Eric Armstrong et al. Working with XML. Aborda DOM, SAX e XML com Java. http://java.sun.com/xml/jaxp/dist/1.1/docs/tutorial/index.html. [3] Adobe. SVG Tutorial. http://www.adobe.com/svg/. Contém tutorial sobre SVG e links para o plug-in SVG da Adobe (Win/Mac). [4] IBM Developerworks. http://www-106.ibm.com/developerworks/. Diversos tutoriais e artigos sobre XML, XSLT, DOM e SAX usando geralmente Java. [5] Doug Tidwell. XSLT. O’Reilly & Associates, 2001. Explora XSLT com aplicações práticas em Java. [6] Elliotte Rusty Harold. XML Bible, Second Edition, 2001. Aborda todas as principais tecnologias W3C. 5 capítulos em http://cafeconleche.org/books/bible2/ [7] Erik T. Ray. Learning XML. O’Reilly & Associates, 2001. Introdução ao XML e DTD, XSLT, XLink e XPointer (os dois últimos baseados em especificações draft). 37 [email protected] www.argonavis.com.br 38 XML: uma introdução prática <xml:fundamentos /> Helder da Rocha www.argonavis.com.br 1 Como criar um documento XML § XML não estabelece nenhum vocabulário mas apenas regras mínimas de estrutura § Para criar o menor arquivo XML possível: § Abra um editor de textos § Salve o arquivo com extensão .xml § Escreva um elemento raiz vazio <x/> § Salve o arquivo § Abra no Internet Explorer 2 Um dos menores documentos XML <nome> Fulano de Tal </nome> Elemento raiz § Um elemento <nome> Fulano de Tal </nome> Etiqueta inicial Conteúdo do Elemento Etiqueta final 3 Elemento vazio <nome></nome> <nome/> 4 Elementos podem conter elementos fulano_de_tal.xml <contato> <nome>Fulano de Tal</nome> <email>[email protected]</email> <telefone> <ddd>11</ddd> <numero>8765 4321</numero> </telefone> </contato> 5 Componentes de um documento § Árvore XML § nós, § raiz, § galhos e § folhas § Prólogo § Comentários § Instruções de processamento § Elementos § Atributos § Nós de texto § Entidades 6 Estrutura XML § Um documento XML pode ser representado como uma árvore. A estrutura é formada por vários nós. <?xml version="1.0" encoding="iso-8859-1" ?> <!-- Isto é um comentário --> informações usadas pelo processador XML <cartao-simples> <logotipo href="/imagens/logo14bis.gif" /> <nome>Alberto Santos Dumont</nome> <endereco>Rua do Encanto, 22 - 2o. andar Centro - 25600-000 - Petrópolis - RJ</endereco> <email>[email protected]</email> um "nó" pode ser ... <telefone tipo="residencial" > • um elemento, <ddd>21</ddd> • um atributo, • um bloco de texto, <numero>2313011</numero> • um comentário, </telefone> • uma instrução, </cartao-simples> • uma declaração, • uma entidade, ... 7 Prólogo Declaração XML Comentário Instrução de processamento Declaração de tipo de documento <?xml version="1.0" encoding="iso-8859-1" ?> <!-- Isto é um comentário --> <?comando tipo="simples" parametro ?> <!DOCTYPE cartao-simples SYSTEM "cartoes.dtd"> <cartao-simples> <logotipo href="/imagens/logo14bis.gif" /> <nome>Alberto Santos Dumont</nome> <endereco>Rua do Encanto, 22 - 2o. andar Centro - 25600-000 - Petrópolis - RJ</endereco> <email>[email protected]</email> <telefone tipo="residencial" > <ddd>21</ddd> <numero>2313011</numero> </telefone> </cartao-simples> 8 Nó raiz e elementos elemento raiz nó raiz ( / ) <?xml version="1.0" encoding="iso-8859-1" ?> <cartao-simples> <logotipo href="/imagens/logo14bis.gif" /> <nome>Alberto Santos Dumont</nome> <endereco>Rua do Encanto, 22 - 2o. andar Centro - 25600-000 - Petrópolis - RJ</endereco> <email>[email protected]</email> <telefone tipo="residencial" > <ddd>21</ddd> elementos elementos <numero>2313011</numero> </telefone> </cartao-simples> 9 Atributos § Só podem conter um descendente (só texto) <?xml version="1.0" encoding="iso-8859-1" ?> <cartao-simples> <logotipo href="/imagens/logo14bis.gif" /> <nome>Alberto Santos Dumont</nome> <endereco>Rua do Encanto, 22 - 2o. andar Centro - 25600-000 - Petrópolis - RJ</endereco> <email>[email protected]</email> <telefone tipo="residencial" > <ddd>21</ddd> <numero>2313011</numero> </telefone> atributos </cartao-simples> 10 Nós de texto § Não podem ter descendentes (são as folhas da árvore) <?xml version="1.0" encoding="iso-8859-1" ?> <cartao-simples> <logotipo href="/imagens/logo14bis.gif" /> <nome>Alberto Santos Dumont</nome> <endereco>Rua do Encanto, 22 - 2o. andar Centro - 25600-000 - Petrópolis - RJ</endereco> <email>[email protected]</email> <telefone tipo="residencial" > <ddd>21</ddd> <numero>2313011</numero> nós de </telefone> texto </cartao-simples> 11 Entidades § São constantes associadas a um valor de texto § Podem aparecer em qualquer lugar do documento § Substituídas durante o processamento do documento § Sintaxe: § &ENTIDADE; § Exemplo: § &data_de_hoje; § Entidades pré-definidas: § < que corresponde a < § > que corresponde a > § & que corresponde a & § " que corresponde a " § ' que corresponde a ' 12 Entidades de caracteres § Substituídas durante o processamento do documento § Sintaxe: § &#CÓDIGO_16b_decimal; § ÓDIGO_16b_hexadecimal; § Exemplo: §   ou   § Um espaço em Unicode § Veja em www.unicode.org/charts/ 13 Elementos e atributos § Regras básicas § Etiqueta inicial e final têm que ter o mesmo nome (considerando diferença de maiúscula e minúscula) § Não pode haver espaço depois do < nas etiquetas iniciais nem depois do </ nas finais § Atributos têm sempre a forma nome="valor" ou nome = 'valor': § aspas podem ser usadas entre apóstrofes e apóstrofes podem ser usados entre aspas § aspas e apóstrofes não podem ser neutralizados mas sempre podem ser representados pelas entidades ' e " § Não pode haver atributos na etiqueta final 14 Elementos e atributos (2) § Elementos mal formados <Profissão>Arquiteto</profissão> <TR><TD>item um</td></tr> <ÄÅÍÃÈÉ>139.00</äåíãèé> § Há várias maneiras de representar a mesma informação em XML <data>23/02/1998</data> <data dia="23" mes="02" ano="1998" /> <data> <dia>23</dia> <mes>02</mes> <ano>1998</ano> </data> 15 Quando usar elementos/atributos § Questão de design § Elementos geralmente referem-se a coisas que têm atributos § Atributos geralmente são características dessas coisas que podem ser descritas com poucas palavras § Questão de suporte tecnológico § Atributos não podem conter subelementos § Atributos são mais fáceis de serem validados num DTD 16 Identificadores § Nomes de atributos e elementos § Podem conter § qualquer caractere alfanumérico ou ideograma § . (ponto) § - (hífen) § _ (sublinhado) § Não podem começar com § ponto, § hífen ou § número 17 Identificadores § Elementos bem formados <α ρ ι σ τ ο τ ε λ ε σ > π ε ρ ι π ο ι η τ ι κ η σ </ α ρ ι σ τ ο τ ε λ ε σ > <êíèãà xml:lang='ru'> <íàçâàíèå>Åâãåíèé Îíåãèí</íàçâàíèå> <àâòîð ðîæäåíèå="1799" ñìåðòü="1837">Àëåêñàíäð Ñåðãååâè÷ Ïóæêèí</àâòîð> </êíèãà> <_1_/> <cdd:gen.inf cdd:cod="005">Introdução a XML</cdd:gen.inf> § Elementos mal formados <3-intro>Fundamentos</3-intro> <cartão de crédito>1234567887654321</cartão de crédito> 18 Conteúdo misto <trecho> <secao>2</secao> <paragrafo>A unidade de informação dentro de um documento XML é o <definicao>elemento</definicao>. Um elemento é formado por duas <definicao>etiquetas</definicao> que atribuem algum significado ao conteúdo. </paragrafo> </trecho> 19 Seção CDATA § Ignora efeitos especiais dos caracteres <titulo>Curso de XML</titulo> <exemplo>Considere o seguinte trecho de XML: <![CDATA[ <empresa> <nome>João & Maria S/A</nome> </empresa> ]]> </exemplo> 20 Instruções de processamento § Instruções dependentes do processador § Funcionam como comentários para os processadores que não a conhecem <?nome-do-alvo área de dados ?> <?query-sql select nome, email from agenda where id=25 ?> 21 Comentários § Iguais aos comentários HTML <!-- Isto é um comentário --> <!-- isto é um erro -- sério! --> 22 Declaração XML § Opcional (exceto queno conjunto de caracteres usado for diferente de UTF-8 <?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?> 23 Documento bem formado § ter um único elemento raiz § etiquetas iniciais e finais combinam (levando em conta que § § § § § § caracteres maiúsculos e minúsculos são diferentes) elementos bem aninhados valores de atributos entre aspas ou apóstrofes atributos não repetidos identificadores válidos para elementos e atributos comentários não devem aparecer dentro das etiquetas sinais < ou & nunca devem ocorrer dentro dos valores dos atributos ou nos nós de texto do documento. 24 XML Namespaces § Permite que elementos de mesmo nome de diferentes aplicações sejam misturados sem que haja conflitos § Um namespace (universo de nomes) é declarado usando atributos reservados § xmlns="identificador" (namespace default) § associa o identificador com todos os elementos que não possuem prefixo. Ex: <nome> § xmlns:prefixo="identificador" § associa o identificador com os elementos e atributos cujo nome local é precedido do prefixo. Ex <prefixo:nome> § O prefixo é arbitrário e só existe dentro do documento § O identificador (geralmente uma URI) deve ser reconhecido pela aplicação 25 Exemplo Vale para todo o elemento <cartao> Esta URI está associada a este prefixo <ct:cartao xmlns:ct="01.234.567/0001-89/cartoes"> <ct:nome>Alberto Santos Dumont</ct:nome> <ct:endereco>Rua do Encanto, 22 - Centro 25600-000 - Petrópolis - RJ</ct:endereco> <ct:email>[email protected]</ct:email> <ct:telefone tipo="residencial"> <ct:ddd>21</ct:ddd> <ct:numero>2313011</ct:numero> </ct:telefone> </ct:cartao> 26 Exemplo com 3 namespaces <departamento <departamento Namespace xmlns:ct="01.234.567/0001-89/cartoes" xmlns:ct="01.234.567/0001-89/cartoes" default xmlns="01.234.567/0001-89/empresa" xmlns="01.234.567/0001-89/empresa" xmlns:html="http://www.w3.org/1999/xhtml"> xmlns:html="http://www.w3.org/1999/xhtml"> URI padrão <ct:nome>Fulano <ct:nome>Fulano de de Tal</ct:nome> Tal</ct:nome> XHTML <nome>Contabilidade</nome> <nome>Contabilidade</nome> <endereco>Rua <endereco>Rua Projetada, Projetada, 33</endereco> 33</endereco> <html:a <html:a href="web.html"> href="web.html"> <html:strong>link <html:strong>link negrito negrito HTML</html:strong> HTML</html:strong> </html:a> </html:a> <urgencia><ct:numero>2313011</ct:numero></urgencia> <urgencia><ct:numero>2313011</ct:numero></urgencia> </departamento> </departamento> 27 XML: uma introdução prática <xml:links /> Helder da Rocha www.argonavis.com.br 1 XLink é uma coleção de atributos § Namespace: http://www.w3.org/1999/xlink § Sete atributos: § type = simple | extended | locator | arc | title | resource § href = a URI destino do vínculo § show = new | replace | embed | other | none § actuate = onLoad | onRequest | other | none § title = descrição detalhada § role = papel / contexto do vínculo § label = descrição sucinta (para exibição) § Exemplo de uso típico <elemento xlink:href="http://lugar.com" /> 2 Exemplos: link "tipo <a href>" e "<img>" <p xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" Conteúdo será substituído... xlink:href="#end" .. quando o xlink:show="replace" usuário solicitar. xlink:actuate="onRequest">link</p> <img xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" Conteúdo será embutido no documento... xlink:href="12345.jpg" .. quando o xlink:show="embed" documento for carregado. xlink:actuate="onLoad" /> 3 XPointer § Função que recebe uma expressão XPath § Serve para apontar para um recurso ou parte do documento § Para apontar para um recurso descoberto por uma expressão XPath xpointer(expressão) § Quando há campos marcados com ID no documento destino, pode-se usar um ponteiro #ponteiro xpointer(expressão)#ponteiro 4 XML: uma introdução prática <xml:transformação/> Helder da Rocha www.argonavis.com.br 1 Esta aula § Introdução a XSLT § fundamentos: principais elementos § passo-a-passo: como transformar § Fundamentos de XPath § linguagem para manipular árvores § XSLT § outros elementos § Fundamentos de XSL-FO § Exercícios § Geração de HTML, XHTML, XML, XSL-FO, texto, ... 2 Por que transformar § Converter para um formato mais útil § Atualizar documentos escritos em uma aplicação XML obsoleta § Devolver resultados adequados para o cliente que irá usálos § Gerar formatos para § exibição § depuração § edição § transmissão 3 XSLT § XSL Transformations § Linguagem (XML) para criação de documentos que contêm regras de transformação para documentos XML § Documentos escritos em XSLT são chamados de folhas de estilo e contêm § Elementos XSLT: <template>, <if>, <foreach>, ... § Expressões XPath para localizar nós da árvore-fonte § Texto ou XML a ser gerado no documento-resultado § Processador XSLT fonteToHtml.xslt Folha de estilos fonte.xml Documento Fonte Processador XSLT Xalan, TrAX, Saxon Netscape, I. Explorer Documento Resultado 4 Transformação XSL § A transformação XSL pode ocorrer em várias etapas, no cliente e/ou no servidor § No servidor, há maior flexibilidade: § Arquivos XML podem ser mesclados § Informações podem ser extraídas de vários arquivos para inclusão em outro arquivo § Por exemplo: um índice § Arquivo resultante pode ser XML, HTML, RTF ou qualquer outro formato § Browser não precisa suportar XML 5 Transformação XSL no cliente § Em browsers que suportam XML e XSL, a transformação dos dados pode ser realizada no cliente § Browser deve ser capaz de entender XML e XSL § O resultado gerado pode ser XML ou HTML 4.0 (para maior suporte) § Além da transformação XSL, no servidor ou cliente, a página pode ainda ser formatada com CSS. 6 Transformação XSLT § No servidor Servidor XML CSS CSS Cliente HTML Página XSL § No cliente Servidor CSS CSS XML XML XSL XSL Cliente Página 7 Fundamentos de transformação § A transformação XSLT é realizada sobre a árvore de um documento-fonte § Todos os nós do documento são acessíveis. Tipos de nó disponíveis: § § § § § § § Elemento Atributo Texto Comentário Instrução de processamento Namespace Raiz 8 XSLT: documento-fonte (1) § Considere o seguinte documento-fonte: <aeronave id="PTGWZ"> <origem partida="08:15">Rio de Janeiro</origem> <destino>Itabuna</destino> </aeronave> / <aeronave> @id PTGWZ <origem> § Árvore-fonte Rio de Janeiro @partida <destino> 08:15 Itabuna 9 XSLT: folha de estilos (2) § O seguinte template (parte de uma folha de estilos XSLT) pode extrair os dados do documento-fonte documento-fonte (em azul - XPath) <xsl:template match="aeronave"> <p>A aeronave de prefixo documento <xsl:value-of select="@id" /> decolou resultado de <xsl:value-of select="origem" /> às (em preto) <xsl:value-of select="origem/@partida" /> tendo como destino o aeroporto de <xsl:value-of select="destino" />.</p> </xsl:template> elementos XSLT (em vermelho, com prefixo xsl) § Elementos XSLT geralmente são usados com um prefixo associado ao seu namespace: <xsl:elemento> para evitar conflitos com o documento-resultado. 10 XSLT: documento-resultado (3) § Após a transformação, o resultado será <p>A aeronave de prefixo PTGWZ decolou de Rio de Janeiro às 8:15 tendo como destino o aeroporto de Itabuna.</p> § Para obter outros resultados e gerar outros formatos com os mesmos dados, deve-se criar folhas de estilo adicionais 11 <template> § Bloco para transformação recursiva § Atributo match: contém expressão XPath para localização de padrão (não é caminho) § Nó de contexto: dentro do <template>, todas as expressões XPath são relativas ao nó corrente e lista de nós correntes Padrão para combinação <xsl:template match="elem/filho"> [[[<xsl:value-of select="." />]]] </xsl:template> Caminho relativo 12 <value-of> § Imprime o valor do nó indicado pelo seu atributo "select" § Converte todo o conteúdo para texto § Caminho relativo ao nó corrente. <xsl:template match="contxt"> <xsl:value-of select="elemento" /> </xsl:template> § No exemplo acima, select seleciona qualquer nó que contenha o string contxt/elemento § Use "." para valor de elemento corrente § Use "/" para referir-se a caminhos absolutos 13 <text> § Imprime texto § Preserva espaços, novas-linhas e tabuações § Útil para controlar forma de impressão do texto <xsl:template match="x"> <xsl:text>Quebra linha depois </xsl:text> </xsl:template> <xsl:template match="y"> <xsl:text>Não quebra linha</xsl:text> </xsl:template> § Atributo disable-output-escaping="yes" evita substituição de entidades 14 <output> § Para produzir resultados diferentes de XML e definir formato de dados de saída § texto <xsl:output method="text" /> § html <xsl:output method="html" /> § xml com DTD <xsl:output method="xml" doctype-public="-//PID//EN" doctype-system="arquivo.dtd" /> § Formatos diferentes de UTF-8 <xsl:output encoding="iso-8859-1" /> 15 <apply-templates> § Faz chamada recursiva a próximo template (se não tiver argumentos) ou indicado em atributo select <xsl:template match="elemento"> Item 1: <xsl:apply-templates select="filho1"/> Item 2: <xsl:apply-templates select="filho2"/> </xsl:template> <xsl:template match="filho1"> [<xsl:apply-templates />] </xsl:template> <xsl:template match="filho2"> (<xsl:apply-templates />) </xsl:template> 16 Regras nativas § 1. Processamento da raiz § <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> § 2. Processamento de todos os elementos § <xsl:template match="*"> <xsl:apply-templates /> </xsl:template> § 3. Processamento de texto § <xsl:template match="text()"> <xsl:value-of select="." /> </xsl:template> 17 Namespace <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> </xsl:stylesheet> 18 XPath § Como selecionar um ou mais nós da árvore-fonte? § Caminhos (location paths) § levam até um nó ou um conjunto de nós através de passos de navegação na árvore de um documento. § Padrões de combinação (match patterns) § um tipo especial de caminho § levam até um nó ou conjunto de nós através de combinação de padrões § não permite o uso de eixos ascendentes (..) 19 Expressões XPath § Os tipos de expressão são § operações sobre nós da árvore-fonte (caminhos) § operações sobre texto § operações booleanas § operações com resultado numérico § Cada tipo de expressão devolve um resultado que pode ser um tipo de dados § § § § um conjunto de nós (node set) um texto (string) um valor booleano (boolean) um número (number) 20 Caminhos § Seqüência de passos até um determinado conjunto de nós (node set) § Exemplo: § /raiz/elemento/filho/neto § ../../primo[3] § Dois tipos § absolutos: começam no nó raiz (iniciam com "/") § relativos: começam no nó do contexto (context node) 21 Padrões de combinação § São traduzidos em caminhos § Usados para combinação § Exemplo: <xsl:template match="..."> § Resolvidos da direita para a esquerda § Não podem conter eixos ascendentes § Não pode: ../elemento § Pode: //elemento ou /ancestral//elemento § Devem ser a mais simples expressão que localize o(s) nó(s) desejado(s) 22 Caminhos vs. Padrões § A expressão "nome" terá resultados pessoas diferentes se a expressão for um caminho ou um padrão § Caminho: [contexto atual]/nome § Padrão: [quaisquer ancestrais]/nome § Na árvore ao lado, se o nó de contexto for <pessoas> § o caminho devolverá um conjunto vazio § o padrão devolverá um conjunto de três nós pessoa pessoa pessoa nome nome nome Fulano Sicrano Beltrano 23 Onde usar padrões/caminhos § Atributos XSLT match, recebem padrões para instanciar templates: § <xsl:template match="autor"> ... § <xsl:template match="livro//pagina[25]"> ... § Atributos XSLT select e test, usados dentro dos templates, recebem caminhos: § <xsl:value-of select="../livro/titulo" /> § <xsl:for-each select="@numero" > ... 24 <if> § Bloco condicional § Executa se expressão XPath passada retornar true § <xsl:if test="/raiz/elemento/filho"> <xsl:value-of select "@atrib_do_filho" /> </xsl:if> § <xsl:if test="(5 > 3) and not(9 < 4))"> .... </xsl:if> § <xsl:if test="starts-with(@nome, 'Sra. ')"> ... § </xsl:if> 25 <choose> <when> <otherwise> § Condicional tipo case (if-then-else) § <xsl:choose> <xsl:when test="../carro[@novo='true']"> ... </xsl:when> <xsl:when test="../casa"> ... </xsl:when> <xsl:when test="../salario/text() > 10000"> ... </xsl:when> <xsl:otherwise> ... </xsl:otherwise> </xsl:choose> 26 <sort> § Ordenação § Aplica-se a cada nó do conjunto de nós do contexto. Use dentro de <apply-templates> § <xsl:apply-templates> <xsl:sort select="@codigo" /> <xsl:value-of select="." /> </xsl:apply-templates> 27 Looping com <for-each> § Permite processar um conjunto de nós dentro da mesma regra de template (sem usar recursão) § <xsl:template match="livro"> <xsl:for-each select="capitulo"> <xsl:value-of select="position()" /> <xsl:text>. </xsl:text> <xsl:value-of select="titulo" /> </xsl:for-each> </xsl:template> 28 <for-each> e <sort> § <sort> pode ser usado dentro de <for-each> para ordenar os elementos § <xsl:template match="indice"> <xsl:for-each select="assunto"> <xsl:sort select="@codigo_dewey" /> <xsl:value-of select="@codigo_dewey" /> <xsl:text>: </xsl:text> <xsl:value-of select="." /> </xsl:for-each> </xsl:template> 29 XSL Formatting Objects § Aplicação XML para descrever o layout preciso de texto e imagens em uma página § Elementos representam § § § § Regras para formatação de várias páginas Layout de páginas individuais, margens, rodapés Hifenação, alinhamento, fontes, cores, leading imagens, gráficos, tabelas, listas, links § Isoladamente, XSL-FO não é folha de estilo § É formato final, com estrutura que visa a apresentação (como XHTML) § Típicamente, se cria um XSLT que gera FO a partir de uma fonte XML 30 Hello World <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> Este é o "<head>" do XSL-FO <fo:layout-master-set> <fo:simple-page-master master-name="p1"> <fo:region-body/> Ligação entre as </fo:simple-page-master> regras de layout e </fo:layout-master-set> o conteúdo afetado <fo:page-sequence master-name="p1"> <fo:flow flow-name="xsl-region-body"> <fo:block color="blue" font-size="20pt">Hello!</fo:block> <fo:flow> </fo:page-sequence> Este é o "<body>" do XSL-FO </fo:root> 31 <root> § Raiz do documento XSL-FO § Define o namespace § http://www.w3.org/1999/XSL/Format § Uso típico <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> ... </fo:root> § Normalmente, documentos FO são gerados com XSLT <xsl:template match="/"> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:apply-templates /> </fo:root> </xsl:template> 32 Estrutura do documento § O elemento <root> deve conter § Um <layout-master-set> que contém "mestres de layout" § definem templates reutilizáveis para layout de páginas § cada mestre possui um identificador que é usado para associá-lo a um bloco de conteúdo § o tipo de mestre mais simples (e o único atualmente suportado pelos processadores) é <simple-page-master> § Pelo menos um <page-sequence>, onde fica o conteúdo § define uma seqüência de páginas em um documento § cada <page-sequence> deve estar associado a um mestre de layout existente § contém objetos <flow> e/ou <static-content> 33 Cabeçalho § Cabeçalho mínimo <fo:layout-master-set> <fo:simple-page-master master-name="p1"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> § <simple-page-master> define margens, altura e largura da página e contém pelo menos uma região § master-name do elemento é ID para que elementos de conteúdo <page-sequence> possam referenciá-lo § Atributos típicos (ID e dimensões da página) <fo:simple-page-master master-name="p1" margin-top="1.5cm" margin-bottom="2cm" margin-left="2.5cm" margin-right="1.5cm" page-width="21cm" pageheight="29.7cm"> ... regiões afetadas ... </fo:simple-page-master> 34 Regiões § Há cinco regiões § <region-body /> § obrigatória § área de conteúdo principal da página § define um ID implícito (fixo): xsl-region-body, para uso por elementos de conteúdo de fluxo ou estático. § <region-start /> e <region-end /> § Em documentos de linguagem ocidental, start é a margem esquerda e end é margem direita. § IDs: xsl-region-start e xsl-region-end § <region-before /> e <region-after /> § before é a margem superior, after é a margem inferior. § IDs: xsl-region-before e xsl-region-after. 35 Margens e regiões <simple-page-master> margin-top <region-after /> margin-bottom margin-right <region-body /> <region-end /> <region-start /> margin-left <region-before /> • Margens do <simple-page-master> limitam a área de impressão • <region-body> ocupa todo o espaço restante • Outras regiões opcionais podem ser definidas sobre <region-body> <region-before extent="2cm"/> <region-end extent="1cm"/> • Margens de <region-body> devem ser iguais ou maiores que os extent das regiões marginais <region-body margin-left="2.7cm" margin-right="1.2cm" margin-bottom="2.1cm" margin-top="2.2cm" /> 36 XSLT § Layout geralmente permanece fixo em folha XSLT+FO <xsl:template match="/"> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="p1"> <fo:region-before extent="2cm"/> <fo:region-end extent="1cm"/> <fo:region-after extent="1.9cm"/> <fo:region-start extent="2.5cm"/> <fo:region-body margin-left="2.7cm" margin-right="1.2cm" margin-bottom="2.1cm" margin-top="2.2cm" /> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-name="p1"> <xsl:apply-templates /> </fo:page-sequence> </fo:root> </xsl:template> 37 Conteúdo § O conteúdo do documento pode estar § Em blocos <flow>, que criam nova página quando o texto preenche o espaço disponível na atual § Em blocos <static-content>, que são repetidos em todas as páginas da seqüência. § Regiões § Cada bloco de conteúdo deve estar associado a uma região existente através do atributo flow-name: § <fo:static-content flow-name="xsl-region-start"> ... § <fo:flow flow-name="xsl-region-body"> ... § Blocos § Dentro de <flow> ou <static-content>, conteúdo deve estar em blocos: <block>, <list-block>, <table>, etc. 38 Blocos de conteúdo <fo:page-sequence master-name="p1" font-size="8pt"> <fo:static-content flow-name="xsl-region-after"> <fo:block> Este bloco de <fo:leader leader-pattern="rule" conteúdo estático está leader-length="16cm" /> associado com region-after </fo:block> <fo:block text-align="end">página <fo:page-number/> </fo:block> </fo:block> </fo:block> </fo:static-content> Este bloco de conteúdo de fluxo está associado com region-body <fo:flow flow-name="xsl-region-body"> <fo:block font-family="serif" font-size="11pt"> Texto que pode atravessar páginas. </fo:block> </fo:flow> </fo:page-sequence> 39 Blocos § Os elementos <flow> e <static-content> devem conter elementos de bloco § <block> Bloco de propósito geral § <list-block> Bloco que contém itens de lista § <table> Bloco que contém tabela § Blocos podem ter conteúdo misto, contendo texto e elementos <inline> Trecho de propósito geral <external-graphic> Imagem ou gráfico externo <page-number> Número de página <basic-link> Referência de hipertexto <instream-foreign-object> Código XML embutido (SVG, por exemplo) § <leader> Linhas e outros decoradores § § § § § 40 Propriedades § Propriedades de estilo podem ser aplicadas em <flow>, <static-content> e em quaisquer elementos descendentes § Propriedades são atributos § Maior parte das propriedades são iguais e têm mesma sintaxe que as propriedades do CSS § <fo:block font-family="tahoma, sans-serif" font-size="12pt" color="rgb(255, 45, 45)" margin-top="1cm" font-weight="bold" text-align="center"> Uma <fo:inline color="blue">linha</fo:inline> de texto </fo:block> § Algumas propriedades CSS são elementos em XSL-FO § Alguns seletores CSS são atributos em XSL-FO § Suporte às propriedades depende do processador 41 <table> <fo:table> <fo:table-header> <fo:table-cell> <fo:block font-family="tahoma, sans" font-weight="bold">Coluna 1</fo:block> </fo:table-cell> <fo:table-cell> <fo:block font-family="tahoma, sans" font-weight="bold">Coluna 2</fo:block> </fo:table-cell> </fo:table-header> <fo:table-body> <fo:table-row> <fo:table-cell> <fo:block font-family="monospace">célula 1.1</fo:block> </fo:table-cell> <fo:table-cell> <fo:block font-family="monospace">célula 1.2</fo:block> </fo:table-cell> </fo:table-row> ... <fo:table-row> ... </fo:table-row> </fo:table-body> </fo:table> 42 <list-block> <fo:list-block> <fo:list-item> <fo:list-item-label> <fo:block font-size="20pt" color="red"> • </fo:block> </fo:list-item-label> <fo:list-item-body start-indent="70pt"> <fo:block> Item um </fo:block> </fo:list-item-body> </fo:list-item> <fo:list-item> ... </fo:list-item> ... </fo:list-block> 43 <external-graphic> § Permite incluir uma imagem na página § Objeto inline § <fo:block> <fo:external-graphic src="moe.gif"/> </fo:block> § <fo:block> <fo:external-graphic src="http://www.x.com/moe.gif"/> </fo:block> 44 <basic-link> § Vínculo de hipertexto § Vincula uma referência de ID a um ID § Geralmente, quando o documento é gerado via XSLT, o ID é obtido do elemento ao qual se quer vincular ou via alguma variável § Exemplo: <fo:basic-link internal-destination="{@id}" text-decoration="underline" color="blue"> <xsl:value-of select="@codigo"/> </fo:basic-link> 45 <instream-foreign-object> § Permite embutir outra linguagem XML na página <fo:instream-foreign-object> <svg:svg xmlns:svg="http://www.w3.org/2000/svg" width="300" height="300" viewbox="0 0 300 300"> <svg:circle style="fill: green" r="50" cx="150" cy="150" /> </svg:svg> </fo:instream-foreign-object> 46 Visualização § XSL-FO é uma linguagem de descrição de página § Páginas podem ser geradas por um programa que construa o documento na memória (como faz o browser com HTML e CSS) ou que gere um arquivo § PostScript, PDF: Apache FOP, RenderX XEP, REXP § RTF (MS-Word): JFOR, RenderX § Visualização em browser: IBM XFC § Ferramentas para desenvolver FO § HP FOA § Para rodar o FOP (arquivo .bat em c:\xml) § fop arquivo.fo arquivo.pdf § Para rodar o JFOR (arquivo .bat em c:\xml) § jfor arquivo.fo arquivo.doc 47 XML: uma introdução prática <xml:sax.dom /> Helder da Rocha www.argonavis.com.br 1 Programação com XML § Há duas APIs padrão para manipular (interpretar, gerar, extrair dados e tratar eventos) arquivos XML: § Document Object Model (DOM) § Simple API for XML (SAX) § As duas APIs servem a finalidades diferentes. § SAX é mais simples. Oferece métodos que respondem a eventos produzidos durante a leitura do documento § Notifica quando um elemento abre, quando fecha, etc. § DOM vai além e monta uma estrutura hierárquica de objetos, em forma de árvore, que permite a navegação na estrutura do documento § Propriedades dos objetos podem ser manipuladas 2 SAX ou DOM? § SAX § Gasta menos memória § Mais simples – menos recursos disponíveis § Ideal para aplicações simples que não precisam manipular com toda a árvore de objetos § DOM § Em grandes documentos e hierarquias profundas exige mais recursos § Fornece funções que permitem ter muito controle sobre os dados § É a única opção para manipulação no cliente § APIs disponíveis em várias linguagens § Java, VB, C, JavaScript (apenas DOM) 3 DOM § Document Object Model § Objetivo: oferecer uma interface de programação uniforme, independente de plataforma e linguagem, para aplicações que manipulam XML § OMG IDL § Serve para § criar um novo documento XML § navegar na árvore XML § modificar, remover ou adicionar nós (elementos, atributos, texto, comentários, PIs, etc.) 4 SAX § Simple API for XML § Baseada em eventos § Dispara eventos durante processamento do documento § eventos podem ser capturados por ouvintes cadastrados § ações podem ser tomadas em cada situação § Exemplos de eventos § inicio e fim do documento § início e fim do elemento (pode-se descobrir qual) § nó de caractere § nó de comentário § ... 5 SAX vs. DOM § Não são concorrentes § DOM é ideal para manipular a árvore XML recursivamente § SAX é ideal para ler o documento seqüencialmente § DOM requer carga de todo o documento: consome mais memória § SAX não "lembra" de tarefas realizadas: não serve para validar referências cruzadas § Nos processadores Crimson e Xerces, SAX é usada para montar a árvore DOM 6 SAX: operações § Se um processador SAX receber o documento ... <carta> <mensagem id="1">Bom dia!</mensagem> </carta> § ... ele irá disparar a seguinte seqüência de eventos: startDocument() startElement("carta", []) startElement("mensagem", [Attribute("id","1")]) characters("Bom dia!") endElement("mensagem") endElement("carta") endDocument() § Programador deve implementar um objeto "ouvinte" para capturar os eventos e extrair as informações desejadas 7 SAX: exemplo em Java (trecho) public void characters(char[] ch, int start, int length) { for (int i = start; i < length; i++) { System.out.println(ch[i]); } } public void startElement(String uri, String localName, String qName, Attributes att) { System.out.print("<" + qName); for (int i = 0; i < att.getLength(); i++) { System.out.print(" " + att.getQName(i) + "='" + att.getValue(i) + "'"); } System.out.println(">"); } public void endElement(String uri, String localName, String qName) { System.out.println("</" + qName + ">"); } 8 DOM: operações § Leitura § Passo 1: carregar o documento e identificar os tokens § Passo 2: identificar elementos e outros nós (pode usar SAX) § Passo 3: montar a árvore (pode ser feito durante o passo 2) § Alteração § Localiza o nó de referência § Remove, altera, muda posição, cria nó antes ou depois. § Criação § Cria raiz; cria elemento raiz; cria elementos filho e atributos; cria nós de texto § Monta árvore: coloca atributos em elementos, coloca nós de texto em elementos, coloca elementos filho em elementos pai, coloca elemento raiz na raiz 9 DOM: tipos de dados § Coleções: NodeList, NamedNodeMap § Raiz da hierarquia de nós: Node. Subclasses: § Attr (atributo) § CharacterData (classe abstrata) § Text (nó de texto) § CDATASection (seção CDATA) § Comment (comentário) § Document (documento inteiro) § DocumentFragment (sub-árvore) § DocumentType <!DOCTYPE> § Element (elemento) § Entity (valor da entidade - conteúdo) § EntityReference (nome da variável) § Notation (valor de uma notação) § ProcessingInstruction (instrução de processamento) 10 DOM: Hierarquia DocumentFragment Document Text CDATASection CharacterData Attr Comment Element Node DocumentType NodeList Notation NamedNodeMap Entity EntityReference ProcessingInstruction 11 DOM: navegação § DOM usa constantes para identificar tipos de nó (nodeType) § Constante (opcional) Tipo valor ELEMENT_NODE Element ATTRIBUTE_NODE Attr TEXT_NODE Text CDATA_SECTION_NODE CDATASection ENTITY_REFERENCE_NODE EntityReference ENTITY_NODE Entity PROCESSING_INSTRUCTION_NODE ProcessingInstruction COMMENT_NODE Comment DOCUMENT_NODE Document DOCUMENT_TYPE_NODE DocumentType DOCUMENT_FRAGMENT_NODE DocumentFragment NOTATION_NODE Notation 1 2 3 4 5 6 7 8 9 10 11 12 12 Para usar DOM § É preciso obter uma instância do documento (forma de fazer isto depende de processador) § Internet Explorer ≠ Netscape § Xerces ≠ JAXP ≠ JDOM ≠ IBM Parser ≠ MSXML § IE (data island): <xml id="xdoc"></xml> Código pode manipular referência xdoc e obter raiz xdoc.async = false; // desabilita threads xdoc.load("arquivo.xml"); document = xdoc; // Este é o elemento raiz ou var xdoc = new ActiveXObject("Microsoft.XMLDOM"); xdoc.load("arquivo.xml") § Java JAXP § Criar uma instância a patir de DocumentBuilderFactory 13 Ilhas de dados XML (só MSXML) § Elemento HTML (Internet Explorer) que possibilita a integração HTML-XML § Permite embutir em uma página HTML (gerada ou não dinamicamente) um arquivo XML § Arquivo pode ainda ser transformado por XSLT no momento da inclusão e receber formatação CSS § Sintaxe: <xml id="identificador"> ... código XML .. </xml> § O identificador é necessário para possibilitar a manipulação dos dados na página § O arquivo também pode ser importado <xml id="identificador" href="arquivo.xml"></xml> 14 Ilhas de dados (exemplo) (1) § Pode-se inserir XML em HTML da seguinte forma <xml id="note"> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> </xml> § Ou importando de um arquivo externo <xml id="note" src="note.xml"> </xml> Fonte: www.xml101.com 15 Ilhas de dados (2) - só MSXML § Dados em XML podem ser vinculados a valores em tabelas, por exemplo, ou manipulados via JavaScript/VBScript <?xml version="1.0" ?> <CATALOG> <CD> <TITLE>Empire Burlesque</TITLE> <ARTIST>Bob Dylan</ARTIST> </CD> <CD> <TITLE>Hide your heart</TITLE> <ARTIST>Bonnie Tyler</ARTIST> </CD> </CATALOG> <html> <body> <xml id="cdcat" src="cd_catalog.xml"></xml> <table border="1" datasrc="#cdcat"> <tr> <td><span datafld="ARTIST"></span></td> <td><span datafld="TITLE"></span></td> </tr> </table> </body> </html> Fonte: www.xml101.com cd_catalog.xml 16