PREFÁCIO Um utilizador de XML, normalmente, quer fazer alguma coisa com os documentos que vai criando.

Para isso, é necessário transformar os documentos XML. PARTE I XML CAP.1 INTRODUÇÃO 1.1. Motivação 90% da informação correspondem a textos que são produzidos e circulam dentro da instituição ou entre instituições. Então temos de estruturar esses textos. Documentos estruturados são documentos que têm uma estrutura explícita, as suas componentes estão identificadas. A estrutura é definida formalmente através de regras. Este probelam, de tentar manter viva a informação correspondente aos 90% do património de uma instituição, fornece a primeira motivação para a utilização da tecnologia de anotação (XML, XSL). O segundo mote vem de uma área relacionada: a publicação electrónica. Acrescenta também metainformação aos documentos, que é uma espécie de registo bibliográfico que se agrega a um documento de modo a disponibilizar facilmente informação como a data da sua criação, autores, memória descritiva. Recentemente, uma das áreas que tem registado significativos contributos e que tem evoluído muito é a da representação abstracta de documentos ou de objectos com a forma de documento. Aqui os problemas começam logo pela definição de documento (texto a ser vivo). 1.2. Estrutura do Livro No cap. 2 expõem-se os conceitos subjacentes aos documentos estruturados: conteúdo e anotação, linguagem de anotação. No cap. 3 apresenta-se o XML, a norma para definição de linguagens de anotação e criação de documentos estruturados. No cap. 7 apresenta-se um cap. inteiramente dedicado a uma das mais recentes normas, o XML Schema. Serão abordados os temas da esdpecificação e da utilização de schemas. termina com casos de estudo onde, para cada um, são apresentados o DTDs, o Schema e uma instância documental. A segunda parte do livro é dedicada à transformação e formatação de documentos XML. Há 2 abordagens: a declarativa (única que estudaremos) baseia-se na norma XSL, desde a criação de stylesheets simples até às de 2ª geração. CAP.2 DOCUMENTAÇÃO ESTRUTURADA Para que os documentos tenham valor é necessário que sejam fáceis de lovcalizar, de consumir (interpretar, validar, reutilizar. A estrutura de um documento é a chave para a informação que nele está contida e pode determinar o seu valor. As vantagens da explicitação da estrutura: - Acesso – permite que os elementos dos documentos sejam rapidamente localizados e manipulados. Por ex., pode-se seleccionar todos os títulos de capítulos de um livro para fazer um índice alfabético. - Validação – A verificação de que a informação apresentada está completa e de acordo com as regras estruturais. - Reutilização – localizar alguns elementos e utilizá-los para outro fim (cartões de tarefa de um manual). - Normalização – Com a publicação e posterior adopção de DTDs, é possível normalizar a criação de documentos de um determinado tipo. 2.1. Anotação Por analogia, a publicação electrónica adoptou a mesma designação para a tarefa de colocar marcas no texto para instruir os programas de formatação e impressão. Generalizando, pode-se definir uma anotação de um texto como um meio de tornar explícita uma interpretação desse texto 8ex. carta comercial). Para o computador será muito mais fácil processar este tipo de documento se ele estiver anotado, ie, etiquetado o que é o cabeçalho, a assinatura, a data,... A anotação serve 2 propósitos: - Divide o documento em componentes - dá organização lógica (explicitamente)

- Dá indicações para o processamento (implicitamente) - Realça o texto - Dá interpretação (inmplicitamente) - Dá instruções de formatação (explicitamente) Há 3 passos distintos na tarefa de anotação 8que requer esforço e consome tempo): - Primeiro, há que analisar a estrutura da informação e os atributos que a caracterizam - Depois, há que determinar, quais as funções de processamento que produzirão o formato/transformação desejado para cada elemento - Po último, há que inserir as anotações no texto. Quanto ao género, ou estilo, das marcas, distinguem-se 2 tipos de anotação: procedimental e descritiva. a primeir aé mais orientada para os aspectos tipográficos, o utilizador tem consciência do impacto físico. A 2ª preocupa-se mais com os aspectos lógicos e estruturais. 2.1.1. Anotação Procedimental Ex. 1 – uma carta anotada Comité Organizador da conferência “Sistemas de Informação para o Futuro” .vspace .... tab4 of 4 Pode muito rapidamente tornar-se complexa, mas permite controlo directo sobre os aspectos visuais. Só para imprimir, não para armazenar e reutilizar. 2.1.2. Anotação Descritiva Ao contrário, usa códigos que apenas classificam as componentes do documento. Ex. <P> em html Ex.2 Poema Anotado <poema> <titulo>”Soneto Já Antigo</titulo> <autor>(Álvaro de Campos)</autor> <corpo> <quadra> <verso>Olha, <nome>Daisy</nome>:quando eu morrer tu hás-de</verso> ...completo na pg. 14 Há anotações como quadra, terceto e verso que estão relacionadas com a estrutura do documento e há outras como nome e lugar que estão relacionadas com a semântica que se pretende associar ao conteúdo. As vantagens: o mesmo documento é susceptível de ser tratado, sem nenhuma alteração, por vários processadores diferentes, podendo, cada um destes, aplicar funções de processamento distintas às várias componentes do documento. 2.1.3. Linguagens de Anotação O conjunto de anotações, utilizado por uma dada comunidade de utilizadores num determinado contexto, designa-se por “Linguagens de Anotação”. Como se verá mais à frente, existem mecanismos formais para definição destas linguagens. Não definem apenas quais as anotações que se poderão utilizar num determinado contexto, mas também especifica qual a ordem em que essas anotações devem ou podem ser usadas. Ex. LaTex, RTF, SGML, WordStar (texto) e mais actuais utilizadas na anotação de documentos para a web: HTML, XML. 2.1.4. Perspectivas de Anotação Há 3 abordagens básicas à tarefa de anotar: - Anotação orientada ao formato - À estrutura - Ao conteúdo. Uma boa linguagem de anotação terá de surgir de um equilíbrio destas 3 aproximações. Anotação Orientada ao Formato Ex. Texto carregado, itálico, quebra de página, tabelas, paginação. ex: ... <quadra>

<verso>Olha, <realçado>Daisy>/realçado>: quando eu morrer tu hás-de</verso> O perigo é o de não permitir, no futuro, utilizações alternativas do conteúdo do documento. Ex. quiséssemos obter lista de nomes ou lugares. A anotação orientada ao formato descreve o aspecto visual de um elemento, mas não o identifica nem especifica qual a sua função. Anotação Orientada à Estrutura Baseia-se na hierarquia genérica. Ex. documento com secções; cada secção pode conter novas secções, listas e parágrafos. O uso abusivo pode levar a situações em que elementos diferentes em termos de conteúdo mas que ocorrem na mesma posição hierárquica sejam anotados com a mesma marca. Anotação Orientada ao Conteúdo É o coração da anotação genérica. a identificação dos elementos pelo seu conteúdo e propósito, em lugar da sua forma ou posição hierárquica, faz com que se atinja o expoente máximo da flexibilidade no contexto aplicacional. Mais uma vez, o uso abusivo pode levar a situações problemática. Em situações extremas podese estar a anotar elementos com marcas diferentes sem que, mais tarde, se tire partido dessas anotações e as anotações pesam no processamento do documento. Uma Anotação Equilibrada Depois do que vimos, torna-se claro que a solução óbvia é usar os 3 de forma equilibrada. Uma das mais usadas pela indústria da publicação electrónica, o DocBook, estão representados os 3 paradigmas como se exemplifca: - Formato - EMPH para realçar texto e TABLE para organizar visualmente a informação - Estrutura – SECT1, SECT2 e SECT3 para marcar os níveis de secções e subsecções. - Conteúdo - NAME, AUTHOR, PUBDATE, COMMAND, ... para marcar vários itens de informação. 2.2. Evolução das Linguagens de Anotação Começou nos anos 60. A associação americana Graphic Communications Association (GCA) criou a GenCode para desenvolver anotações para os documentos dos seus clientes, que usavam diferentes aplicações e formatos para os seus documentos. A IBM criou a GML (Generalized Markup Language) para resolver os seus problemas internos de publicação electrónica. O mesmo documento podia produzir um livro, um relatório ou edição electrónica, através de processamento. No início dos 80s os representates do GenCode e GML juntaram-se num esforço de normalização formando um comité ANSI Computer Languages for the Processing of Text. O objectivo era normalizar a metodologia de especificação, a definição e a utilização de anotações em documentos, o qual foi atingido com a criação do SGML (Standardized Generalized Markup Language) que foi lançada em 1986 como a norma ISO 8879. Desenhada com o objectivo de permitir a definição e utilização de formatos de documentos. É suficientemente formal para permitir validar os dcumentos, tem estrutura suficiente para permitir a especificação e manuseamento de documentos complexos e é extensível de modo a suportar a gestão de grandes repositórios de informação. No CERN escolheu um conjunto de anotações SGML e adoptou-as como linguagem da sua aplicação. Em Nexus, o editor e navegador original da www, ele usou essas anotações, folhas de estilo para formatar visualmente as páginas e aquilo que lançou definitivamente este género de aplicações: links. Em 1993 aparece o Mosaic. Mesmo a última versão do HTML, a 4.0, lançada em 1997, fornece apenas um conjunto limitado de anotações. Desde 1992, o HTML evoluiu de uma sintaxe adhoc para uma linguagem de anotação definida em SGML (ideia-ferramentas genéricas). Mas isso era complicado pois as pessoas queriam era pouca coisa para saberem tirar partido. Foi um 1º esforço. Então apareceu o XML, eXtensible markup Language: por um lado o reconhecimento do SGML como uma boa metodologia para estruturar e representar documentos, por outro, a identificação de limitações do conjunto fixo de anotações do HTML. 2.2.1. HTML versus XML

O HTML é o formato universal para quem produz documentos para a www. O seu sucesso encontra-se associado à sua pobreza semântica. O XML é uma alternativa mais rica. O XML/SGML possibilita a criação do contexto específico para cada comunidade. O HTML só se pode estender através de pós-processamentos específicos e não através de novos elementos adicionados à linguagem. Pelo contrário, o XML possibilita 3 funcionalidades críticas: - Extensibilidade – o autor pode definir novas anotações, relacioná-las com as existentes na estrutura e acrescentar-lhe os atributos que desejar. - Estrutura – O autor pode definir uma estrutura para uma dada família ou classe de documentos que pode mais tarde ser associada às instâncias documentais. - Validação – o autor pode proceder, ou solicitar, a validação do conteúdo do documento relativamente à estrutura. CAP.3 XML ... Um documento XML é composto por 3 partes distintas: - Declaração – obrigatoriamente e no início. ex: <?xml version=”1.0” encoding=”iso-8859-1”?> O objectivo é dar algumas indicações sobre a natureza do documento: versão do XML, qual a tabela de caracteres utilizada, qual a especificação de estilo, etc. - DTD (“Document Type Declaration”) – em conjunto especificam um tipo de documento. É opcional. Documentos com estrutura diferente (carta, memo, livro, artigo, manual, ...) terão DTDs distintos. - Texto anotado (instância) – Contém a informação, as anotações e, opcionalmente, uma referência ao DTD, que pode ser externo (armazenado noutro ficheiro). Um DTD: - Define qual a estrutura de uma família (classe ou tipo) de documentos. - Especifica quais as anotações/marcas disponíveis para anotar cada um dos elementos constituintes dos documentos deste tipo. - Especifica quais os atributos que estão associados a cada elemento. Para cada atributo, indica qual o domínio e quais os valores por omissão. - Define a estrutura do conteúdo de cada elemento: que subelementos tem; em que ordem; onde é que pode aparecer texto normal; onde é que podem aparecer dados que não sejam texto. O XML, com os DTDs opcionais, veio criar dosi novos conceitos: o de documento válido e o de documento bem-formado. 3.2.1. Documento Válido vs. Bem-Formado O DTD corresponde à gramática e o parser ao verificador. No entanto, o XML foi pensado para suportar aplicações web, pelo que o DTD e as respectivas verificações podem tornar-se um fardo bem pesado. Então introduziram-se 2 níveis de verificação: válido, se tiver um DTD associado e o texto estiver de acordo com as especificações; bemformado se obedecer a: - Tiver um ou mais elementos; - Tiver um só elemento raiz; - Todas as anotações estiverem aninhadas correctamente. 3.3. Ciclo de Vida de um Documento XML Começa numa fase de análise. O resultado é a definição de um DTD ou Schema. As fases seguintes são: edição/criação; validação; armazenamento; e formatação/transformação. 3.3.1. Análise Documental É a modelação da informação. O objectivo é compreender todas as componentes, ou elementos, que constituem uma dada família de documentos, bem como as relações entre eles. É uma tarefa subjectiva. O XML pode facilmente albergar pequenas variações da estrutura da mesma informação. Os resultados são tanto melhores quanto maior e mais representativo for o envolvimento de futuros utilizadores da aplicação na equipa de análise.

É composta pelas seguintes etapas: 1. Identificação dos tipos de documentos no universo em causa; 2. Definição de uma estratégia para o DTD; 3. Identificação dos utilizadores; 4. Escolha de um nome para o DTD; 5. Reconhecimento dos elementos lógicos do tipo de documento em causa; 6. Escolha entrte elementos e atributos; 7. Determinação da estrutura hierárquica. Identificação dos Tipos de Documento no Universo em Causa A ideia é agrupar documentos com propriedades semelhantes em classes. Definção de uma Estratégia para o DTD Um DTD desenhado de raiz para documentos que vão ser criados é diferente de um DTD desenhado para suportar documentação já existente – compatibilidade. Identificação dos Utilizadores São as pessoas que vão produzir ou manipular os documentos XML anotados segundo o DTD que vai ser definido, para quentodos sejam ouvidos. O Nome do DTD O XML reduz o grau de liberdade do utilizador. O nome deve ser elucidativo do tipo de documento Elementos Lógicos do DTD Nesta fase, o objectivo é obter uma descrição da estrutura do documento ; interessa, portanto, encontrar e distinguir os elementos que compõem o documento a nível lógico. Ex. memo: MEMO tem um emissor e um destinatário, que designamos por DE e PARA. O resto pode induzir alguma subjectividade, mas podemos dizer que tem um CORPO e este está estruturado por parágrafos designados por P. Podemos ainda identificar elementos como ASSUNTO e ASSINATURA, ou mesmo um elemento mais complexo que visa registar o percurso do documento dentro da instituição. Durante este processo há questões que devem estar sempre presentes: será necessa´rio distinguir este elemento? O que é que se pretende fazer com ele? Convém cobrir todos os ângulos do problema. Por último, devem ter-se presentes os processamentos a que irão ser submetidos os documentos. Cada processamento pode ter implicações na estrutura. Elemento ou Atributo? No mundo real há casos fronteira; aí hesita-se entre um elemento e um atributo. ex. links em html. Este problema é crítico e tem de ser resolvido caso a caso, baseando-nos, no entanto, nos seguintes princípios: - A informação é estrutural? Um objecto que por natureza deve estar presente é um bom candidato a elemento. - A informação qualifica o conteúdo ou faz parte de um padrão repetitivo? Uma carta pode ser privada ou de negócios. Não está relacionada estruturalmente com o elemento carta, apenas qualifica ou cataloga o documento (lista numerada). É um bom candidato a atributo. - A informação está relacionada com o aspecto visual? -> elemento - A informação requer um processamento especial? -> elemento. Determinação da Estrutura Hierárquica Agora é necessa´rio especificar as relações: quem contém quem, em que ordem, qual o nº de ocorrências, etc. Neste momento pode colocar-se a questão de como representar a estrutura para facilitar a escrita de um DTD. A érvore estrutural do documento dá uma boa maneira de visualizar a sua estrutura. No entanto não tem informação sobre a frequência de cada um dos elementos (opcionais e

repetições). Então introduzem-se os diagramas de estrutura ou o ELM-tree (Element Lucid Model – tree), formal. 3.3.2. Edição de Documentos XML Corresponde à criação. Em princípio basta ediotor de texto, mas se se quiser tirar partido do DTD, usa-se um Editor de XML. É um editor estruturado parametrizável pelo DTD, isto é, é um editor que, lendo um DTD, vai ser contextualmente sensível a esse DTD. Ajudam o escritor a marcar o seu texto sem ter de saber de cor a sintaxe de todas as anotações em uso na medida em que lhe mostram, em cada momento (em cada contexto), a lista de todas as marcas que aí se podem usar; além disso, possibilitam a validação estrutural imediata do documento que está a ser editado. ex: XMetal da Softquad. No editor de XML é preciso fazer a sua configuração relativamente ao DTD, que não é mais que a sua compilação com uma ferramenta própria que acompanha o editor. Depois de compilado é adicionado à biblioteca de DTDs do editor. 3.3.3. Validação É uma das mais-valias da documentação estruturada tem para o processamento de documentação. Esta validação é estrutural e verifica se um dado documento respeita um determinado DTD. É feita por um parser configurável por uma especificação de estrutura, um DTD. Normalmente aparecem integrados noutras aplicações como esditores estruturados. Produz 2 resultados: um é uma lista de erros; outro é um texto declarativo correspondente à travessia da estrutura de dados interna usada para guardar o documento durante o processo de reconhecimento. Relativamente à linguagem/formato usado para a saída dos dados da travessia, pode haver algumas variações, mas há uma assumida como norma: o ESIS – Element Structure Information Set. Ex: (MEMO (DE - Camarada Napoleão ) DE (PARA - Bola de neve )PARA (CORPO (P -Na obra intitulada “A Quinta dos Animais”, ... \\n (P - Será que o XML--- Qual a tua opinião? )P )CORPO )MEMO Elementos principais: (elem-id Início do elemento com o identificador elem-id. Se tiver atributos, eles já apareceram em linhas precedentes com o prefixo A )elem-id – Fim... -texto Conteúdo do último elemento indicado Anome valor O próximo elemento a ser iniciado terá um atributo de nome nome e com o valor valor. ?proc-inst Instrução de processamento proc-inst Muitas vezes o documento é processado para obter o formato ESIS que é preciso para a formatação. ex de parsers: expat Xerces XML for C++ Depois de acabar de escrever o DTD é a altura de pensar no estilo de apresentação. É uma tarefa complexa. 3.3.4. Formatação e Transformação

Quem opta por uma solução XML separa o conteúdo da formatação. De uma maneira geral, o que se pretende fazer com um documento XML é transformá-lo: simplesmente traduzi-lo para RTF, PDF ou HTML; Uma solução seria ferramenta de configuração do parser, mas isso contraria o objectivo de independência das plataformas. Em 1996, foi publicado o DSSSL, Document Style and Semantics Specification Language, a norma ISO/IEC 10179:1996 (o Assembly...). Entretanto foi desenvolvida uma nova linguagem XML, com a mesma funcionalidade mas com nível de abstracção mais elevado – o XSL – eXtended Stylesheet Language. 3.3.5. Armazenamento Para o trabalho com os documentos é preciso extrair partes, executar procuras inteligentes, criar indíces, etc. O leque de soluções de armazenamento são 3: 1. Armazenar os documentos no sistema de ficheiros do próprio sistema 2. Armazenar os documentos numa base de dados relacional Parece óbvia, mas não é. Existem 2 grandes famílias de documentos XML: orientados à informação e orientados ao texto. Para estes há uma ordem linear inerente à sua essência, que não há nas bases de dados, resultando daqui uma perda. No entanto, devido a baixos custos, esta solução foi implementada – Omnimark – Micro-Document Architecture – MDA. 3. Armazenar os documentos numa base de dados orientada a objectos. É cara mas eficaz. O modelo hierárquico de objectos modela directamente qualquer árvore documental. O sistema de ficheiros é um recurso utilizado até ao limite. CAP. 4 DOCUMENTOS XML BEM FORMADOS Um documento XML é formado por dados e anotações. Num documento XML, os dados são os blocos de texto. A anotação de um documento descreve a sua estrutura e induz uma interpretação do seu conteúdo. A anotação é composta por: marcas de início de elementos, marcas de fim de elementos, marcas de elementos vazios, referÊncias a entidades, comentários, limitadores de secções especiais de texto (CDATA-secção 4.6), declarações de tipo de documento e instruções de processamento. Uma anotação começa sempre por ‘<’ e termina por ‘>’ 4.1. A declaração XML Um documento XML deve começar sempre por uma declaração XML. Podem ser usados 3 atributos numa declaração XML: version É obrigatório standalone É opcional. “yes” indica que o documento está autocontido, isto é, não tem referências a entidades externas. encoding É opcional e indica qual a codificação usada para os caracteres. O valor por omissão é UTF-8. Para caracteresd portugueses é “iso-8859-1” 4.2. Comentários Um comentário pode aparecer em qualquer ponto de um documento XML. Começa pela marca <!- - e termina com a marca - -> Existem algumas restrições: - Não podem aparecer antes da declaração - Não podem aparecer dentro de uma anotação - Não se podem usar as sequências de caracteres “--“ dentro de um comentário. Além da sua funçãod e documentação usam-se para remover temporariamente partes do documento. 4.3. Instruções de Processamento

Começa por <?id-processador e termina por ?>;id-processador deverá indicar a que tipo de processamento a instrução se destina. ex: <?html action=”hr”?> <?html…?> estas instruções de processamento identificam ordens que deverão ser executadas aquando da transformação deste documento para HTML. 4.4. Elementos Determinam os blocos lógicos em que o texto global pode ser partido ou decomposto. Cada elemento é composto pela sua anotação de início ( <...> ), pelo seu conteúdo e pela sua anotação de fim ( </...> ). Um elemento tem de estar completamente contido noutro elemento, excepto o ancestral de todos os elementos (o elemento raiz). Algumas estruturas hierárquicas podem ser recursivas, o que pode causar problemas no momento de processar a informação. As regras de formação do nome de um elemento: 1. O primeiro caractér deverá ser uma letra, um underscore ou um sinal de dois pontos; 2. Os caracteres seguintes podem ser letras, dígitos, underscores, hífens, pontos e dois pontos. 3. O espaço em branco não pode aparecer no nome de uma anotação. Em XML há distinção entre maiúsculas e minúsculas. Por outro lado, no conteúdo de um elemento, nunca deverão aparecer os caracteres < e >. Em lugar deles deve-se usar as entidade &lt; e &gt; 4.4.1. Tipos de Conteúdo Os elementos podem incluir outros elementos (ditos elementos filho) e texto. Há os que não contêm texto directamente – são os estrutrantes. ex: RECEITAS. Os caracteres brancos (espaços, mudanças de linha, tabulações) são irrelevantes e não são considerados como fazendo parte do documento. Um elemento que contenha apenas texto é designado como tendo conteúdo textual. ex: <INGRDIENTE>Meia dúzia de ovos</INGREDIENTE> Quando contém simultaneamente texto e elementos filho, designa-se por elemento de conteúdo misto. ex: <verso>Olha, <nome>Daisy</nome>:quando...</verso> Um elemento pode não ter qualquer conteúdo – elemento diz-se vazio. São normalmente usados pelo seu significado posicional. ex: BR e HR do HTML (são um pouco procedimentais). Há, no entanto, elementos vazios puramente descritivos, como é o caso dos que representam referências. Para além da posição, contêm informação nos atributos. ex: Como será discutido num capítulo mais à frente (<ref ident=”cap5”/>)… … <figura path=”…”/> Estes elementos têm forma abreviada. 4.5. Atributos Visam qualificar o elemento a que estão associados. É definido por um par constituído por um nome e um valor, que devem estar separados pelo sinal = e o valor deve estar dentro de aspas simples ou duplas. As regras de formação do nome são as mesmas que vimos para os elementos. Problema: não existe fronteira e o problema não é simples – a escolha entre elemento e atributo. 4.5.1. Atributos Reservados Há características universais que o conteúdo dos elementos pode partilhar em diferentes aplicações. Normalmente, incluem-se nestas características a língua utilizada e a importância dos caracteres brancos. Para evitar conflitos com os nomes do utilizador, a norma reservou o prefixo xml. Na norma há apenas 2 atributos reservados, xml:lang e xml:space. xml:lang este atributo pode ser associado a qualquer elemento e indica qual a língua em que o texto desse elemento está escrito. ùtil em ambientes multilinguísticos. xml:space é associável também a qualquer elemento e pode ter 2 valores: default 8indica que o espaço no conteúdo do elemento não é relevante) e preserve. 4.6. Secções Especiais de Texto Se se pretender usar os caracteres < > e & devem ser usadas antes entidades &lt; &gt; &amp;

No caso em que estes caracteres abundem, o XML dispõe do mecanismo Secções Marcadas de Texto, onde se pode escrever livremente, sem ser necessário substituir aqueles caractéres pelas entidades correspondentes. É sempre iniciada por <![CDATA[ e terminada por ]] ex: <![CDATA[Prima a tecla <<<ENTER>>>.]> 4.7. Regras de Bem Formação - Um documento XML deve ter sempre uma declaração XML no início - Um documento deve incluir um ou mais elementos - Todos os elementos têm anotações de início e fecho - Os elementos deverão estar aninhados correctamente. - Os valores de atributos têm de estar entre aspas 4.8. NameSpaces No XML há liberdade total de atribuir nomes a elementos e atributos. Mas, assim, há possibilidade de conflitos de nomes, nomeadamente quando se importam pedaços de outros documentos XML escritos por outros autores. ex: livro de catálogo e de encomenda. Os NasmeSpaces são a solução do problema. Um NameSpace é uma superetiqueta formada pelo nome da anotação ao qual é concatenado um prefixo. Esse prefixo é definido pelo utilizador e deverá ser único. Para garantir tal unicidade, convencionou-se que se usaria a sintaxe dos URL para o prefixo. Assim, partindo do princípio de que cada utilizador tem um URLpróprio acabam-se os conflitos. 4.8.1. Criação de NameSpaces O World Wide Web Consortium (W3C) publicou recomendação que define NameSpace: Uma colecção de nomes, identificados por uma referência URI (Universal Resource Identifier) que é usada nos documentos XML como prefixo dos nomes de elementos e de atributos. Na mesma recomendação dizem como devem ser criados e declarados os NameSpaces. Convencionou-se existir um atributo global xmlns. ex: xmlns=http://xml.di.uminho.pt/XMLSamples/livro.dtd 4.8.2. Prefixos Esta string identificadora de um NameSpace é demasiado grande para ser manipulada. Assim, associa-se-lhe uma abreviatura, que pode ser mais tarde usada como referEncia do NameSpace. xmlns:catalogo=http://xml.di.uminho.pt/XMLSamples/livro.dtd Exemplo 28: Utilização de NameSpaces com prefixo <catalogo:livro xmlns:catalogo=http://xml.di.uminho.pt/Samples/livro.dtd xmlns:jcr=http://jcr.di.uminho.pt/DTD/coment/dtd> <catalogo:titulo>XML: da teoria à prática </catalogo:titulo> <jcr:opinião>Um bom ponto de partida...</jcr:opiniao> <catalogo:resumo>Livro que cobrer duma maneira geral mas com alguma profundidade a temática XML. </catalogp:resumo> ... </catalogo:livro> 4.8.3. NameSpaces Locais O atributo xmlns pode ser usado em qualquer elemento. Logo, para tornar mais explícito, podia ter só declarado o jcr a seguir ao jcr:opiniao A declaração do NameSpace fica assim junto do elemento que faz uso dela. 4.8.4. NameSpaces por Omissão

O atributo xmlns pode ser utilizado isoladamente sem a declaração de um prefixo. Nesse caso declarou-se por omissão. Todos os elementos filho do elemento onde se declarou o NameSpace pertencem agora a esse NameSpace. Deixo de usar catalogo, por exemplo. 4.9. Forma Canónica de Documentos XML Preocupação actual: como representar, de uma forma abstracta, a informação num documento XML de modo a ser possível comparar documentos? Reduzi-los a XML canónico. Isto é conseguido à base de uma sintaxe bastante estrita: só é permitida a codificação de caracteres em UTF-8, os pares CR/LF são substituídos por LF, nos elementos textuais as sequências de caracters brancos sãosubstituídos por um único espaço... Os pacotes já trazem redutor – ex: Alphaworks, o XML4J da IBM. CAP. 5 DOCUMENTOS XML VÁLIDOS Na maioria dos caso em que é o utilizador que edita e manipula os documentos XML, há necessaidade de estipular um conjunto de regras que estabeleçam a valaidade dos documentos. À especificação de um tipo de documentos dá-se o nome de DTD ou XML Schema. Neste capítulo veremos em detalhe a linguagem com a qual se especifica um DTD. 5.1. Componentes de um Documento XML Válido Um documento XML válido é composto por 2 grandes e distintas partes: o DTD e a Instância. O DTD define as regras a que a instância tem de obedecer para pertencer ao tipo de documento definido pelo DTD. Pode dizer-se que um DTD é composto por um conjunto de declarações. Existem quatro tipos de declarações: elementos, atributos, entidades e instruções de processamento. 5.2. Elementos <!ELEMENT identificador (expressão-conteúdo)> identificador é o nome do elemento, o qual é depois usado nas anotações. Pode ser formado por letras, dígitos, dois pontos, hífens, underscores e pontos. Mas só pode começar por letra, underscore ou dosi pontos. expressão-conteúdo é a definição do conteúdo do elemento escrita numa linguagem de expressões regulares que obedece a uma álgebra. essa expressão especifica que subelementos podem aparecer, em que ordem e em que número. ex: <!ELEMENT contact (nome, email, telefone)> Relativamente ao conteúdo, pode ser: vazio este tipo de elemento tem apenas um valor posicional textual estruturado o conteúdo do elemento é formado por uma combinação de outros elementos misto o conteúdo do elemento é texto no meio do qual poderão surgir alguns elementos soltos livre o conteúdo do elemento não tem qualquer restrição, pode ser uma mistura de texto com uma combinação qualquer de outros elementos definidos no DTD; este tipo de elementos será usado apenas nos estados iniciais do desenvolvimento de uma aplicação. 5.2.1. Álgebra do Conteúdo Conteúdos Atómicos Elementos vazios: a constante EMPTY ex: <!ELEMENT imagem EMPTY> depois, na instÂncia: <imagem path=”../imagens/mapa.jpg”/> Elementos Textuais: a constante #PCDATA (Parsed Characater Data) <!ELEMENT para (#PCDATA)> depois, na instância: <para>Este livro tenta dar uma visão...</para> Note que #PCDATA é o único tipo de dados primitivo possível. Mesmo os elementos cujo conteúdo seja numérico ou temporal terão de ser especificados como textuais. Esta é uma das limitações dos DTD que os XML Schemas resolvem. Conteúdos Compostos

É neste tipo de elementos que surge a álgebra. Para definir a combinação de elementos temos 2 operadores: Operadores de Conexão e Operadores de Ocorrência Operadores de Conexão São normalmente colocados entre 2 elementos e define a ordem em que estes podem ocorrer ou combinar-se. , operador de sequência (a,b) significa que o elemento tem de ser composto por um elemento a e um elemento b, e que a deve preceder b. <!ELEMENT CARTA (DEST, ABERTURA, CORPO, FECHO> | operador de alternativa (a|b) significa que o elemento é composto por um elemento a ou por um elemento b. <!ELEMENT PARA (#PCDATA | LISTA)*) Operadores de Ocorrência São aplicados a um termo e visam limitar o nº de ocorrências desse termo. ? (0 ou 1 vez) a? * (0 ou mais vezes) a* + (1 ou mais vezes) a+ Elementos Mistos É um elemento textual, onde podem ocorrer livremente, entre o texto, alguns elementos previamente identificados. <!ELEMENT elem-misto (#PCDATA | elem1 | elem2 | ... ) * > São aqueles que mais problemas levantam. No entanto há situações em que não é possível evitálos. Um dos exemplos mais comuns é o elemento parágrafo: <!ELEMENT paragrafo (#PCDATA | data | nome)*> Elementos Livres: a constante ANY Acabam por ser elementos de conteúdo misto onde, no meio do texto, pode aparecer livremente qualquer um dos outros elementos definidos na DTD, um nº de vezes também livre. <!ELEMENT doc (para)+> <!ELEMENT nome (#PCDATA)> <!ELEMENT lugar (#PCDATA)> <!ELEMENT data (#PCDATA)> <!ELEMENT para ANY> 5.2.2. Exemplos: o DTD Agenda e o DTD Poema Como exemplo da primeira superclasse, informação estruturada, apresentamos a agnda de contactos. E, como exemplo do segundo caso (semi-estruturada), um poema. <!ELEMENT AGENDA (ENTRADA | GRUPO)+> <!ELEMENT ENTRADA (IDENT, TIPO, NOME, EMAIL, TELEFONE)> <!ELEMENT GRUPO (IDENT, (ENTRADA | GRUPO | REF)+)> <!ELEMENT NOME (#PCDATA)> <!ELEMENT EMAIL (#PCDATA)> <!ELEMENT TELEFONE (#PCDATA)> <!ELEMENT IDENT (#PCDATA)> <!ELEMENT TIPO (#PCDATA)> <!ELEMENT REF (#PCDATA)> Note que a definição do elemento grupo é recursiva. <!ELEMENT poema (titulo, autor, corpo, data)> <!ELEMENT titulo (#PCDATA)> <!ELEMENT autor (#PCDATA)> <!ELEMENT corpo (quadra, quadra, terceto, terceto)> <!ELEMENT quadra (verso, verso, verso, verso)> <!ELEMENT terceto (verso, verso, verso)> <!ELEMENT verso (#PCDATA | nome | lugar)*> <!ELEMENT nome (#PCDATA)>

<!ELEMENT lugar (#PCDATA)> <!ELEMENT data (#PCDATA)> Como foi dito, note-se que temos agora um lemento com conteúdo misto: verso. Este eleemtno, que corresponde ao coneúdo semi-estruturado do poema, está definido como uma mistura de texto com elementos nome e lugar. Podíamos generalizar para qualquer nº de quadras e tercetos ou até para qualquer nº de estrofes, mas avisa-se que a generalização pode ser perigosa pois implica perdas semânticas. O ideal é termos o objectivo final bem claro. 5.3. ATRIBUTOS No caso da agenda, pensando bem, TIPO é uma característica do elemento ENTRADA e não um dos seus elementos constituintes, por isso pode passar a atributo (subjectivo, sempre). Por seu lado, IDENT e REF devem ser vistos como um par pois é com os seus valores que se monta um mecanismo de referenciação. Ora, para este fim, existe no XML, um par de tipos de atributos, ID e IDREF que têm a eles associada a validação que garante que a referenciação está bem feita. Logo: <!ATTLIST ENTRADA IDENT ID #REQUIRED> <!ATTLIST GRUPO IDENT ID #REQUIRED> <!ATTLIST REFERENCIA REF IDREF #REQUIRED> A primeira declaração associa um atributo de nome IDENT ao elemento ENTRADA. N último caso, foi necessário criar um elemento, REFERENCIA, ao qual pudesse ser associado o atributo REF. <!ELEMENT REFERENCIA EMPTY> 5.3.1. Declaração <!ATTLIST elem-id att1-id att1-tipo att1-class att1-val-omissao … attn-id attn-tipo attn-class attn-val-omissao > Usar uma declaração deste tipo ou declarar um de cada vez, só depende do gosto pesoal. 5.3.2. Tipos São 10 e apenas eles, isto é, não são permitidos tipos definidos pelo utilizador nem tipos compostos. CDATA – é o mais geral. É qualquer texto livre sem anotações. Usado para preços, URLs, endereços de email, etc. ID – deve conter um identificador que é único em todo o documento. Este tipo de atributos deve ser usado para associar identificadores únicos a elementos. IDREF – aponta para um atributo do tipo ID de outro elemento no documento. Usado normalmente para implementar relações entre elementos, em que cada relação é representada por um par de atributos ID/IDREF. As razões podem ser simples – de um para um ou de um para muitos, ou complexas – de muitos para muitos. Ex: ... <AGENDA> <ENTRADA IDENT=”e1” TIPO=”pessoa”> ... </ENTRADA> <GRUPO IDENT=”ep1”> ... <REFERENCIA REF=”e1”/> <GRUPO/> Note-se que poupei, usando REF=”e1” na entrada da mesma pessoa, agora par um grupo. As relações de muitos para muitos representam outra situação onde é necessário utilizar este tipo de atributos, para evitar repetição de informação. Ex. caso de autores e livros. IDREFS – é útil quando se pretende fazer referência a mais que um elemento. ex:

<!ELEMENT AUTOR ...> <!ATTLIST AUTOR id ID #REQUIRED> … <!ELEMENT LIVRO ...> <!ATTLIST LIVRO autores IDREFS #REQUIRED> poderíamos ter: … <AUTOR id=”jcr”>…</AUTOR> <AUTOR id=”prh”>…</AUTOR> ... <LIVRO autores=”jcr prh”>...</LIVRO> Enumerado Não utiliza uma palavra chave. Em vez disso, oferece uma lista (ou eneumeração) de valores possíveis para esse atributo. ex: <!ATTLIST ENTRADA IDENT ID #REQUIRED TIPO (PESSOA | EMPRESA | INSTITUICAO) “pessoa”> ENTITY – pode conter como valor o nome de uma entidade (declarada algures no DTD. Em desuso. ex: <!ATTLIST ENTRADA IDENT ID #REQUIRED TIPO (PESSOA | EMPRESA | INSTITUICAO) “pessoa” FOTO ENTITY> Se no DTD existisse uma entidade de nome paulo com a fotografia do Paulo José, podia usar-se este atributo para associar a entidade à entrada: ... <ENTRADA IDENT=”e7” FOTO=”paulo”> <NOME>Paulo José Bastos</NOME> ... </ENTRADA> ... ENTITIES – contém o nome de várias entidades declaradas algures no DTD. ex: cada slide de uma apresentação é uma imagem declarada como uma entidade no DTD. ENTITIES indica a ordem de visonameno do slides: ... <apresentaçao id=”ap3” slides=”slide2 slide5 slide6 slide7”/> … NOTATION – é o menos utilizado. É usado para associar um tipo de dados externo a um determinado atributo ou elemento. NMTOKEN – Os valores de atributos deste tipo são identificadores no contexto do XML. É semelhante ao tipo ID, só que em termos semânticos não tem a restrição da unicidade. Em desuso. NMTOKENS – Quando o valor de um atributo precisa de ser composto por uma lista de NMTOKEN separados por espaço, usa-se este tipo. Em desuso. Usa-se numa situação a evitart: quando se coloca a informação nos atributos em vez de nos elementos. ex: ALCUNHA NMTOKENS na entrada ALCUNHA=”trinca espinhas” 5.3.3. CLASSES A classe de um atributo interfere directamente com a tarefa de validação e de processamento, indicando qual o comportamento esperado do utilizador relativamente ao atributo: se o atributo é opcional, se é obrigatório ou se tem um valor fixo. Há 3 classes de atributos: #IMPLIED – o atributo é opcional. #REQUIRED – o atributo é obrigatório

#FIXED – o atributo é constante e imutável e o seu valor será sempre o que estiver na declaração à frente da palavra chave #FIXED. ex: <!ELEMENT data...> <!ATTLIST data tipo CDATA #FIXED “data”> Ex: de definição do tipo data para posterior transformação, já que o XML não o tem. A indicação da classe na declaração de um atributo é opcional. Se não for especificado, os processadores assumem #FIXED. 5.3.4. Valores Por Omissão O valor por omissão é uma string, entre aspas. 5.4. Associação de um DTD a um Documento <!DOCTYPE agenda SYSTEM “agenda.dtd”> Esta declaração especifica que o elemento raiz do documento é agenda e que o DTD pode ser encontrado no sistema, no ficheiro agenda.dtd Deve aparecer sempre após a declaração XML e antes do elemento raiz. 5.4.1. Redefinição Parcial de um DTD A sintaxe da declaração DOCTYPE pode ter um bloco extra onde é possível redefinir partes do DTD; para o caso do documento ter necessidades específicas. ex: ... <!DOCTYPE agenda SYSTEM “agenda.dtd” [ <!ELEMENT ENTRADA (NOME, EMAIL, TELEFONE, URL?)> <!ELEMENT URL (#PCDATA)> ]> ... Nesta instância de agenda, as entradas poderão ter um URL associado.

CAP. 6 ESTRUTURA FÍSICA: ENTIDADES Um documento XML pode estar espalhado por vários ficheiros do sistema. Facilita-se desta maneira a reutilização de subcomponentes. 6.1. CONCEITOS O XML tem um mecanismo que permite isolar fisicamente e armazenar separadamente qualquer parte de um documento (ex. cada cap. de um livro, ou figuras). Cada uma destas unidades de informação é designada por entidade e tem um identificador único associado pelo qual é referenciada. A única excepção é a entidade correspondente ao documento principal, que não precisa do identificador, pois é normalmente referenciada pelo nome do ficheiro que a contém. Uma entidade é definida numa declaração própria que normalmente aparece no início do DTD. Nesta declaração é atribuído um nome à entidade e é-lhe associado um conteúdo ou uma referência para um ficheiro externo onde está esse conteúdo. As entidades são usadas por referência, isto é, o autor coloca uma referência no texto que identifica univocamente uma entidade. Mais tarde, quando o documento for processado, as referências são substituídas pelos respectivos conteúdos. Não são permitidas referências cíclicas. Deve-se ter cuidado; o seu uso abusivo aumenta a complexidade do tratamento do documento. Há no entanto situações em que deve ser considerada: - quando a mesma informação é utilizada algumas vezes no documento. - quando a informação tem representações diferentes em sistemas incompatíveis. - quando a informação diz respeito a um grande documento que deve ser separado em unidades mais pequenas de modo a facilitar a manutenção. - quando a informação é composta por dados num formato diferente do XML (imagem,...) Entidades Gerais são usadas como mecanismo de abreviatura para strings de grande dimensão que se irão repetir Entidades Carácter representam a maneira de codificar caracteres especiais Entidades Externas servem para referenciar ficheiros externos Entidades Paramétricas são usadas como variáveis na escrita de um DTD 6.2. ENTIDADES GERAIS Sintaxe da declração: <!ENTITY identificador “conteúdo”> Exemplo: <!ENTITY XML “eXtended Markup Language”> Sintaxe da referência: &identificador Exemplo: “Este livro descreve o XML(&XML;)...” pode ser mais que texto – pode ser txto anotado Exemplo 37: Entidades Gerais com anotações <!ENTITY jcr “<NOME>José Carlos Ramalho</NOME> Na instância: ... <AGENDA> <ENTRADA id=”e1” tipo=”pessoa”> &jcr; <EMAIL>... 6.3. ENTIDADES CARÁCTER A norma XML ao adoptar o Unicode, tornou obsoleta a utilização deste tipo de unidades. Há, no entanto, uma situação em que leas ainda são utilizadas: na representação de alguns caracteres especiais do XML. Entidade/Carácter: &amp;/& &lt;/< &gt;/> &quot;/” &apos;/’ Os caracteres são representados pelo seu valor decimal ou hexadecimal. Sinatxe da referência: &#código decimal; &#xcódigo hexadecimal Exemplo: O &#169 ( ou &#xA9); deste livro é da FCA 6.4. ENTIDADES EXTERNAS Podem ser de 2 espécies: representar um pedaço do documento XML e, neste caso, o seu conteúdo é analisado e validado; ou um bloco de informação binária. 6.4.1. Entidades Externas Textuais

Quando um documento cresce e atinge dimensões consideráveis, a sua edição pode tornar-se penosa e difícil. Este livro por exmplo podia encontrar-se repartido em vários ficheiros XML – um por capítulo. Esta filosofia é implementada em XML através de entidades externas, que corresponde a uma das partições do documento original. No documento principal, colocam-se referências às entidades externas no local onde devem ser inseridos os respectivos ficheiros XML. <!ENTITY identificador [SYSTEM path] [PUBLIC identificador-público] Os blocos entre [ e ] são opcionais, mas pelo menos um deles deverá estar presente. Os 2 blocos dizem repeito aos 2 métodos possíveis de endereçamento dos ficheiros externos: directamente, através do nome e local do ficheiro no sisteme ou indirectamente, através de identificador público. O método indiorecto surge para facilitar a gestão dos ficheiros dentro do sistema. Pressupões a existÊncia de um ficheiro com o nome catalog, que faz o emparelhamento entre identificadores públicos e nomes de ficheiros. Um identificador público é uma string que obedece a um conjunto de requisitos estipulados na Formal Public Identifiers. ex: <!ENTITY capitulo2 PUBLIC “ -//jcr//Capitulo 2 da tese//PT”> temos de ter o catalog. ex: PUBLIC “ -//jcr//Capitulo 2 da tese//PT” “a:cap2.xml” A utilidade mais óbvia deste mecanismo é a movimentação de ficheiros, alterando apenas os respectivos paths no catálogo. As externas textuais: Sintaxe da referência: &identificador Exemplo: ... &capitulo1;... 6.4.2. Entidades Externas Binárias no DTD <!ENTITY foto-autor SYSTEM “imagens/fotojcr.jpg” NDATA jpeg> Notações NDATA especifica o tipo de dados. Mas para ser reconhecido como iomagem ha´que definir algures no DTD: <!NOTATION jpeg “image/jpeg”> Variam de aplicação para aplicação. Exemplo 41: Entidades Binárias ... <!NOTATION jpeg “image/jpeg”> … <!ENTITY paulo SYSTEM “imagens/fotopaulo.jpg” NDATA jpeg> ... <!ELEMENT imagem EMPTY <!ATTLIST imagem imdata ENTITY #REQUIRED> no documento: … <imagem imdata=”paulo”/> ... Este mecanismo é muito pouco suportado pelas aplicações existentes. Daí: Exemplo 42: Esquema alternativo par inclusão de dados binários ... <!ELEMENT imagem EMPTY> <!ATTLIST imagem path CDATA #REQUIRED formato CDATA #IMPLIED … no documento: <imagem path=”paulo.jpg” formato=”JPEG”/>

6.5. ENTIDADES PARAMÉTRICAS Num DTD, há sempre subconjuntos de elementos que têm listas de atributos em comum ou mesmo parte da sua definição estrutural. Se fôssemos definir o DTD sem colocar em evidência as partes comuns, iríamos ter múltiplas declarações do mesmo objecto com a agravante de que, sempre que quiséssemos alterar esse objecto, teríamos de alterar todas as definições. Enquanto as entidades vistas até aqui são usadas para expansão do documento XML, uma entidade paramétrica é normalmente usada para abreviar a escrita de partes constantes. ex: <!ENTITY \% para-list “(para)+”> <!ENTITY \% at-base “id ID #REQUIRED”> … <!ELEMENT capítulo (…)> <!ELEMENT figura EMPTY> <!ATTLIST figura \%at-base; ficheiro CDATA #REQUIRED formato (gif | jpeg | png> <!ELEMENT exemplo (\%para.list; | código | ...)> <!ELEMENT resumo (\%par-list;)> 6.5.1. Redefinição de Entidades Paramétricas As entidades paramétricas são particularmente poderosas pois podem ser redefinidas. As redefinições são feitas no bloco DOCTYPE usando entre [ ] Podemos até levar ao extremo de definir o conteúdo de todos os elementos e atributos como entidades paramétricas. 6.5.2. Modularidade na Especificação de um DTD Um DTD pode ser modular se forem utilizadas entidades paramétricas externas na sua especificação. Declara-se da mesma maneira que as normais só que, em vez de um texto de substituição, leva a palavra chave SYSTEM seguida da string indicativa do ficheiros ao qual se pretende associar a entidade. ex: 46 – DTD Modular <!ENTITY \% estrutura SYSTEM “estrutura.dtd”> <!ENTITY \% dados SYSTEM “dados.dtd”> ... <!ELEMENT base-de-dados (estrutura, dados)> \%estrutura; \%dados; ... 6.6. INCLUSÃO CONDICIONAL Usado na gestão de modularidade. Em XML, existe uma directiva IGNORE que indica ao processador que não deve analisar um determinado conjunto de declarações. <![IGNORE [ <!ELEMENT corpo (quadra, quadra, terceto, terceto> ]]> Esta directiva e a INCLUDE poderão parecer inúteis. Porém podem ser usadas através de entidades paramétricas e não directamente. Se for o caso: Começamos por definir uma entidade soneto: <!ENTITY % soneto “INCLUDE”> Agora podemos usar essa entidade paramétrica no lugar da directiva: <![%soneto;[ <!ELEMENT corpo (quadra, quadra, terceto, terceto)> ]]> Como uma entidade paramétrica pode ser redefinida num bloco de redeclarações de um DTD, esta combinação fornece-nos um mecanismo muito poderoso para especificar e utilizar um DTD. com esta utilização de inclusões condicionais e entidades paramétricas, é possível desenvolver

um DTD de grandes dimensões que pode ser parametrizado no instante da criação das instâncias documentais como se demonstra no ex. 47 seguinte: Um DTD para poemas mais versátil: <!ELEMENT poema (titulo, autor, corpo, data)> <!ELEMENT titulo (#PCDATA)> <!ELEMENT autor (#PCDATA)> <!ELEMENT data (#PCDATA)> <![\%soneto;[ <!ELEMENT corpo (quadra, quadra, terceto, terceto)> <!ELEMENT quadra ...> <!ELEMENT terceto ...> ]]> <!ENTITY \% soneto “INCLUDE”> <![\generico;[ <!ELEMENT corpo (quadra | terceto)+> <!ELEMENT quadra ...> <!ELEMENT terceto ...> ]]> <!ENTITY \%generico “IGNORE”> ... depois podemos redefinir: <?xml version=”1.0” ... ?> <!DOCTYPE poema SYSTEM “poema.dtd” [ <!ENTITY \% generico “INCLUDE”> <!ENTITY \% soneto “INCLUDE”> ]> <poema> … </poema> Os grandes DTDs que se afirmaram na indústria documental usam este mecanismo de parametrização para tornar mais amplo o seu universo de aplicações e para permitir que o utilizador tenha uma maneira de personalizar o DTD, desencorajando-o, desta forma, de desenvolver um DTD específico.

CAP. 7 XML SCHEMAS conceitos básicos. 7.1. Introdução O XML Schema foi desenvolvido numa tentaiva de dar resposta a alguns problemas que se sentiam na utilização de um DTD, sobretudo porque esta não era suficientemente poderosa e expressiva para a especificação de restrições ao conteúdo dos documentos XML. As vantagens são: - Escrevem-se em XML - Suportam os tipos de dados comuns à maior parte das linguagens de programação e permitem, adicionalmente, que o utilizador defina outros tipos de dados. - Fornecem um poderoso sistema de classes e tipos que permite a extensão e a reutilização de estruturas no próprio XML Schema (mais poderoso que paramétricas) - Suportam utilização de Namespaces -> modularidade mais fácil - Disponibilizam várias facilidades importantes para o tratamento de elementos de conteúdo misto. 7.2. O Primeiro Exemplo <?xml version=”1.0” encoding=”iso-8859-1”?> <aluno> <numero>4238</numero> <nome>José Alberto Rodrigues</nome> <curso>LESI</curso> </aluno> XML Schema que torna este documento XML bem formado num documento XML válido <?xml version=”1.0” encoding=ISO-8859-1”?> <schema xmlns=”http://www.w3.org/2001/XMLSchema”> <element name=”aluno”> <complexType> <sequence> <element name=”numero” type=”int”/> <element name=”nome” type=”string”/> <element name=”curso” type=”string”/> </sequence> </complexType> </element> </schema> O XML é auto-descritivo, como vemos. 7.3. Tipos Simples Os tipos simples (simple types) restringem o texto que pode aparecer no valor de um atributo ou no conteúdo de um elemento textual (um elemento textual contém apenas texto, não tem elementos filho nem atributos. Há 4 tipos primitivos para sequências de caracteres (texto): string anyURI
NOTATION – uma declaração de um link para um documento externo num formato diferente do XML

QName – um nome qualificado; segue as regras do nome de um elemento ou atributo Existem 3 tipos primitivos para dados numéricos: decimal float – um nº de vírgula flutuante de precisão simples (32 bits) double - ... dupla precisão (64 bits) Suporta 9 tipos de dados para representação de datas e dados temporais: duration dateTime – um instante preciso no tempo date – uma data específica time – um isntante no tempo (hh,mm,ss) gYearMonth – um ano e um mês gYear – um ano

gMonthDay gMonth gDay Ex. 49 (parte) <element name=”nome” type=”string”/> ... <nome>123</nome> Ex. 50 (parcial) – tipos de dados numéricos <element name=”elem-aval1” type=”decimal”/> <element name=”media-final” type=”float”/> … <elem-aval1>10.25</elem-aval1> <media-final>129.1E-1</media-final> Ex. 51 (parcial) – tipos de dados temporais uma instância do tipo duration obedece à norma ISO 8601 e tem o seguinte formato: PnYnMnDTnHnMnS, em que n é um nº, P é um designador que indica que o conteúdo da string corresponde a um período, T é o separador da data e do tempo em horas. ex: <qq-elemento duração=2P11Y7M9DT0H23M3.5S”/> O período associado ao atributo duração corresponde a 11 anos, 7 meses, 9 dias, 0 horas, 23 minutos e 3,5 segundos. O tipo date tem a forma yyy-mm-dd. Instanciando ex. <qq-elemento momento=”2000-07-13”/> 7.4 Tipos Compostos A declaração de um tipo composto é usada para definir um elemento do tipo estruturado, isto é, permite especificar quais são os elementos filho, como se compõem esses filhos, a cardinalidade dos elementos filho, os atributos, a obrigatoriedade dos atributos, etc. regra: “Se um elemento tem elementos filho ou atributos, então é um elemento do tipo composto.” Forma elegante e versátil de definir o nosso ex. inicial é usar separadamente um tipo de dados abstracto. <complexType name=”Taluno”> <sequence> <element name=”numero” type=”int”> … <element name=”aluno” type=Taluno”/> Isto torna possível algumas funcionalidades importantes: - É possível declarar mais elementos como sendo do tipo abstracto definido sem repetir o bloco da sua definição - É possível, em qualquer momento, alterar o tipo abstracto e essas alterações serão propagadas. 7.4.1. Conteúdo de um Tipo Composto Para se especificar um tipo composto como uma combinação de outros elementos, tem de se usar um dos 3 operadores de composição disponíveis: sequence, choice e all sequence permite especificar um conteúdo formado por vários elementos que têm de obedecer a uma ordem fixa. choice – permite especificar um conteúdo formado por um elemento escolhido arbitrariamente entre um conjunto de elementos alternativos. all – todos os elementos contidos num compsitor all podem aparecer uma ou nenhuma vez e podem aparecer em qualquer ordem. mas tem algumas restrições: só pode aparecer no nível mais elevado eos elementos nele contidos têm de ser todos de um tipo simples. Ex.52 – submissão electrónica de trabalhos práticos – versão 2 Vamos, então, registar os dados de uma submissão electrónica de um trabalho prático atendendo aos seguintes considerandos: a equipa de trabalho é constituída por um conjunto de alunos até ao máximo de 3; além dos alunos, deverá ser registada a data e hora da submissão e o nome do ficheiro enviado. <?xml version=”1.0” encoding=”ISO-8859-1”?>

<schema xmlns=http://www.w3.org/2001/XMLSchema> <complexType name=”Taluno””> <sequence> <element name=”numero” type=”int”/> <element name=”nome” type=”string”/> <element name=”curso” type=”string”/> </sequence> </complexType> <element name=”submissão”> <complexType> <sequence> <element name=”equipe”> <complexType> <sequence> <element name=”aluno” type=Taluno”/> <element name=”aluno” type=Taluno”/> <element name=”aluno” type=Taluno”/> </sequence> </complexType> </element> <element name=fich-env” type=”string”/> <element name=2data-hora” type=dateTime”/> </sequence> </complexType> </element> </schema> De acordo com este XML Schema, o documento XML seguinte representa uma instância de uma submissão electrónica <?xml version=”1.0” encoding=”ISO-8859-1”?> <submissão> <equipe> <aluno> <numero>4238</numero> <nome>José Alberto Rodrigues</nome> <curso>LESI</curso> </aluno> <aluno> <numero>4140</numero> <nome>José Carlos Ramalho</nome> <curso>LESI</curso> </aluno> <aluno> <numero>4156</numero> <nome>Paulo Jorge Domingues</nome> <curso>LESI</curso> </aluno> </equipe> <fich-env>ZXcomplier.zip</fich-env> <data-hora>1986-03-26T16:05:13</data-hora> </submissão> 7.4.2. Especificação de Ocorrência O XML Schema possui um mecanismo que permite especificar o nº de ocorrências de um determinado elemento. É implementado com 2 atributos: minOccurs e maxOccurs. Com estes atributos, os seus pares de valores podem corresponder aos operadores de ocorrência num DTD:

minOccurs=”0”, maxOccurs=”1” – torna o elemento opcional (‘?’ no DTD) minOccurs=”0”, maxOccurs=”unbounded” – 0 ou mais vezes (‘+’ no DTD) minOccurs=”1”, maxOccurs=”unbounded” – 1 ou + vezes (‘+’ no DTD). no Schema anterior era só pôr <sequence maxOccurs=”3”> e assim era escusado repetir 3 vezes a mesma coisa <element name=”aluno” type=Taluno”/> A ausência do minOccurs significa, por omissão, 1. O valor por omissão do maxOccurs é o valor de minOccurs. 7.5. Tipos Simples Derivados (a partir de um tipo simples primitivo existente) especifica-se utilizando um mecanismo de restrições. Ex 53 – o dia do mês <simpleType name=”Tdia”> <restriction base=”integer”> <minInclusive value=”1”/> <maxInclusive value=”31”/> </restriction> </simpleType> e já podíamos declarar elementos ou atributos do tipo: <element name=”D” type=”Tdia”/> e perante instâncias do tipo <D>43</D> a validação daria erro. Estas restrição é designada de domínio ou intervalo. Um operador de restrição tem a forma de um elemento XML e contém um atributo de nome value onde é especificado o valor para arestrição correspondente. Enumeração de alguns operadores de restrição existentes no XML: minInclusive – é fechado minExclusive – semelhante mas aberto maxInclusive maxExclusive Length – permite fixar o tamanho de um conteúdo textual pattern – permite especificar uma expressão regular a que o conteúdo dos lementos associados ao tipo deve obedecer enumeration – permite especificar cada um dos valores de uma lista fixa de valores de um tipo enumerado. Combinações são “infinitas” ex. 54 – Tipo simples derivado: o nº de telefone restrições: - os nºs têm todos 9 dígitos; são todos da zona de Braga; hífen a separar dígitos de zona dos outros. É claramente uma restrição de formato, pelo que se deve usar o operador pattern, que é um dos mais poderosos: <simpleType name=”Ttelefone”> <restriction base=”integer”> <pattern value=”253-[0-9]{6}”/> </restriction> <simpleType> Outro dos mais usados é o Enumeration Ex. 55 o dia da semana Este tipo de restrição em que se quer limitar o conteúdo de um elemento a um dos valores predefinidos de uma lista, chama-se restrição por enumeração. <simpleType name=”TdiaSemana”> <restriction base=”string”> <enumeration value=Domingo”/> … </restriction> </simpleType> 7.6. Atributos

Como já foi discutido nos cap. 3 e 4, um documento XML também pode ter atributos que visam caracterizar os elementos aos quais se aplicam. Em XML Schema, um atributo é definido de modo semelhante ao de um elemento. as principais diferenças são: - não pode conter elementos ou atributos filho - é sempre de um tipo simples (+ imp. – tipo primitivo ou derivado pelo utilizador) - Não é ordenado Um elemento que tenha atributos é do tipo composto. ex 56 – Submissões (versão 3) Pretende-se acrescentar um atributo ao elemento aluno para indicar o seu estatuto: ordinário, trabalhador-estudante ou militar: <complexType name=”Taluno”> <sequence> <element name=”numero” type=”integer”/> <element name=”nome” type=”string”/> <element name=”curso” type=”string”/> </sequence> <attribute name=”regime” type=”string” use=”optional” default=”ordinário”/> </complexType> 7.6.1. Ocorrência de Atributos Por omissão é opcional. Para especificar o tipo de ocorrência de um atributo, recorre-se ao atributo use do XML Schema, que pode ter um dos seguintes valores: - required – o atributo tem de estar presenta - optional – é opcional (é o valor por omissão) - prohibited – o atributo não pode aparecer, deverá ser omitido 7.6.2. Restrições ao valor de um atributo. Para além do default, podemos especificar que o valor do atributo deve ser o igual ao prescrito no schema, quer o atributo esteja presente ou não na instância documental, podemos, em vez de default, usar fixed, que tem uma utilidade um pouco marginal. default e fixed são conhecidos como restrições ao valor de um atributo, pois restringem os valores que um determinado atributo pode ter. 7.6.3. Restrições ao tipo de um atributo Por ex. para indicar que um determinado atributo só pode ter valores num determinado intervalo ou que o seu valor terá de pertencer a uma lista de valores predefinida. Ex. 57 Restrições ao tipo de um atributo ... <simpleType name=”TRegime”> <restriction base=”string”> <enumeration value=”ordinario”/> <enumeration value=”trabalhador-estudante”/> <enumeration value=”militar”/> <enumeration value=”dirigente-académico”/> </restriction> </simpleType> … <complexType name=”Taluno”> <sequence> … </sequence> <attribute name=”regime” type=”Tregime” use=”optional” default=”ordinário”/> </complexType>

7.7. Elementos Vazios Não tem conteúdo textual nem elementos filho. Só pode pois conter atributos, caso contrário não passa duma simples marca, o que é raro. Ex. 59: Declaração de Elementos Vazios – 2 – caso mais comum. Pretende-se especificar um elemento que assinale a inclusão de uma imagem num documento. Para isso vamos especificar um elemento imagem com atributos path e formato: <element name=”imagem”> <complexType> <attribute name=”path” type=”string” use=”required”/> <attribute name=”formato” type=”TiFormato”/> </complexType> </element> <simpleType name=”TiFormato”> <restriction base=”string”> <enumeration value=”GIF”/> <enumeration value=”BMP”/> <enumeration value=”PNG”/> </restriction> </simpleType> 7.8. Elementos de Conteúdo Misto É uma combinação de elementos filhos e texto. A necessidade é quando um autor tem necessidade de associar um significado ou uma ênfase especial a um bocado do texto. Por ex. no caso do verso para especificar nomes e lugares, vimos que no DTD se fazia: <!ELEMENT verso (#PCDATA|nome|lugar)*> pelo que não era possível restringir nem a ordem nem o nº de ocorrências. Num XML Schema teremos: <element name=”verso”> <complexType mixed=”true”> <choice minOccurs=”0” maxOccurs=”unbounded”> <element name=”nome” type=”string”/> <element name=”lugar” type=”string”/> </choice> </complexType> </element> Ex. 60 – Elementos de conteúdo misto Voltando ao caso das submissões electrónicas, o sistema devia responder com uma mensagem típica, com restrições de ordem (nome, título e data-hora) e apenas 1 vez. Então: <element name=”recibo”> <complexType mixed=”true”> <sequence> <element name=”nome” type=”string”/> <element name=”titulo” type=”string”/> <element name=”data-hora” type=”dateTime”/> </sequence> </complexType> </element> 7.9 Contexto: Elementos Globais versus Locais - Declarações de elementos globais são filhas do elemento raiz schema - Declarações de elementos locais estão aninhadas algures na estrutura de um schema e não são filhas directas do elemento schema. Se for declarado globalmente qualquer outro elemento do tipo composto pode usar aquela declaração criando uma referência para ela, para evitar repetições em documentos que contêm blocos estruturais repetidos. Ex. 61 – Declarações de elementos globais e sua reutilização

Nas submissões o bloco estrutural aluno repete-se. A solução até agora era declarar um tipo abstracto Taluno. A declaração de um elemento global Aluno permite: <?xml version=“1.0” encoding=”ISO-8859-1”?> <schema xmlns=http://www.w3.org/2001/XMLSchema> <element name=”Aluno”> <sequence> <element name=”numero” type=”int”/> <element name=”nome” type=”string”/> <element name=”curso” type=”string”/> </sequence> </element> <element name=”submissão”> <complexType> <sequence> <element name=”equipe”> <complexType> <sequence maxOccurs=”3”> <element ref=”Aluno”/> </sequence> </complexType> </element> <element name=”fich-env” type=”string”/> <element name=”data-hora” type=”dateTime”/> </sequence> </complexType> </element> </schema> No XML Schema não há indicação explícita do elemento raiz e todos os elementos irmãos declarados sob o elemento schema são potenciais raízes de instâncias documentais desse schema. O anterior garante a validação de documentos que servem de registo de submissões electrónicas, mas também garante a validade a documentos que contenham dados de um aluno. Pode-se portanto concluir que a utilização de elementos globais tem algumas utilidades: permite a reutilização desses elementos, permite validar parcialmente um documento e permite, quando levada ao exagero, ter vários tipos de documento especificados no mesmo schema. O que vimos permite construir schemas para 75% dos problemas que podem surgir. 7.10 Exemplos: os schemas Agenda e Poema – correspondem aos DTDs de 5.2.2. Vamos usar, como descrevemos, técnicas de modularidade, usando tipos abstractos para modularizar e a seguir uma metodologia top-down. depois há uma nova solução com elementos globais. Exemplo 62: A agenda de contactos – com tipos de dados abstractos <?xml version=”1.0” encoding=”iso-8859-1”?> <xs:schema xmlns:xs=2http://www.w3.org/2001/XMLSchema” elementFormDefault=”qualified”> attributeFormDefault=”unqualified”> <xs:element nam=”agenda”> <xs:complexType> <xs:choice maxOccurs=”unbounded”> <xs:element name=”entrada” type=”Tentrada”/> <xs: element name=”grupo” type=”Tgrupo”/> </xs:choice> </xs:ComplexType> </xs:element>

<xs:complexType name=”Tentrada”> <xs:sequence> <xs:element name=”nome” type=”xs:string”/> <xs:element name=”email” type=”xs:string”/> minOccurs=”0” maxOccurs=”1”/> <xs:element name=”telefone” type=”Ttelefone”/> </xs:sequence> <xs:attribute name=”id” type=”xs:ID” use=”required””/> </xs:complexType> <xs:simpleType name=”Ttelefone”> <xs:restriction base=”xs:string”> <xs:pattern value=””253-[0-9]\{6}”/> </xs:restriction> </xs:simpleType> <xs:complexType name=”Tgrupo”> <xs:choice maxOccurs=”unbounded”> <xs:element name=”entrada” type=”Tentrada”/> <xs:element name=”ref” type=”Tref”/> <xs:element name=”grupo” type=”Tgrupo”/> </xs:choice> <xs:attribute name=”gid” type=”xs:ID” use=”required”/> </xs:complexType> <xs:complexType name=”Tref”> <xs:attribute name=”entref” type=”xs:IDREF” use=”required”/> </xs:complexType> </xs:schema> Schema da Agenda com Elementos Globais PARTE II – XSL O XML é cada vez mais usado para estruturar e representar informação, quer em aplicações web, quer em aplicações ditas empresariais. A beleza do XML reside na sua simplicidade, é um formato textual (e, assim, independente de paltaformas) e extensível (permite sempre acrescentar novas descrições para a informação em causa). Fornece, pois, uma maneira de descrever a informação sem nenhuma preocupação sobre a utilização final que se quer dar a essa informação, criando uma separação entre conteúdo e forma. Mas um documento XML, um texto anotado, por si só, não é apropriado para ser lido oumanipulado por quem não está interessado na estrutura. Para distribuir informação no formato XML, é necessário preservar o seu conteúdo fazendo desaparecer as marcas, ou anotações, substituindo-as pela formatação ou transformação apropriada; por ex., <titulo>T</titulo> pode ser transformado em <H1>T</H1> para poder ser visionado num browser HTML. A norma XSL – eXtensible Stylesheet Language – foi desenvolvida para dar resposta a este problema. Nesta segunda parte do livro, é discutida uma família de normas do World Wide Consortium (W3C) derivadas de uma proposta inicial para uma linguagem de especificação de estilo chamada XSL. contudo, durante a sua incubação, esta proposta dividiu-se em 3: A primeira, XPath, define um método de localização de informação em documentos XML, e tem diversas utilizações nomeadamente, na transformação e an formatação. A segunda, XSLT (XSL Transformations), fornece uma metodologia para transformar documentos XML em outros formatos de dados, incluindo linguagens de formatação. E, finalmente, XSLFO (XSL Flow Objects), ou simplesmente XSL, é usada para especificar a forma pretendida para os documentos XML.

Estas 3 normas juntas constituem um meio de formatar documentos XML. O XSLT atingiu a maturidade há já algum tempo e devido ao atraso do XSLFO, começou por ser usado para converter documentos XML em HTML, para efeitos de apresentação e de distribuição de conteúdos XML. Devido ao grande nº de aplicações que são desenvolvidas diaraiamente neste paradigma, este será o cerne desta segunda parte do livro. CAP. 8 – O PASSADO: DSSSL E CSS Como já foi referido, o XSL surge como uma evolução de duas outras tecnologias já existentes: o DSSSL – Document Style Semantics and specification Language e o CSS – Cascading style Sheets. 8.1. DSSSL Como já vimos, o XML especifica apenas a estrutura, não fornece qualquer facilidade para a especificação de aparência visual ou formato. Então, cada editor tinha a sua linguagem própria para associar estilo aos documentos XML. A portabilidade estava assim ameaçada. Foi pois na tentativa de normalizar o que faltava que o comité ISO lançou a norma ISO/IEC 1079:1996, hoje conhecida como DSSSL, que foi primeiro penasod para o SGML (antecessor do XML). O DSSSL é muito complexo, havendo pouca literatura. É uma linguagem de especificação na qual se podem distinguir 4 sublinguagens: 2 principais para preparar o documento final e formatá-lo: - uma para especificar a transformação de um ou mais documentos XML, num ou mais documentos XML - uma para especificar a aplicação de atributos de formatação a um documento XML (única terminada) e 2 auxiliares: - uma de interrogação (Standard document Query Language – SDQL), que se usa para identificar e seleccionar partes de um documento XML - uma funcional de cálculo de expressões (subconjunto da Scheme) 8.1.1. Modelo conceptual Compreende 2 partes (independentes): - uma especificação de transformação – há situações em que o conteúdo do documento final pretendido difere do original, é um subconjunto ou corresponde ainda a uma reordenação do conteúdo inicial (XML -> XML) - uma especificação de estilo – que vai dirigir a formatação (XML -> RTF, PDF, HTML, Postscript, etc.) – definição de matgens, tipo de letra, tamanho, etc. embora haja muita cois já estabelecida por cada processador. 8.1.2. Linguagem de Transformação Permite especificar processos de modificação (alteração/criação). Pode compreender operações como: - Rearranjo de estruturas (reordenação ou agrupamento). Ex. registo de alunos que se quer agora ordenado por nome de aluno - Construção de novos elementos relacionados com outros elementos já existentes – o analista especifica como os novos se obtêm dos existentes – ex. notas de rodapé agrupadas e colocadas no fim do cap. - Associação de novas características a sequências específicas de conteúdo – ex. 1º parágrafo de cap. pode ter início com estilo diferente - Associação de novas características a componentes específicos de conteúdo 8.1.3. O Processo de Transformação O processo de transformação, XML Tree Transformation Process (XTTP) compreende as etapas: construção da Árvore Documental Abstracta (ADA); transformação propriamente dita; gearção de XML. Construção da Árvore Documental Abstracta ADA É feita por um parser. A estrutura pode ser bastante complexa. No entanto conclui-se que a estrutura mínima para representar um documento estruturado seria a seguinte (usa-se o XML Schema como notação na especificação formal da ADA). ... CAP. 9 XSL: eXtended Stylesheet Language

O XSL começou a ser desenvolvido em 1997 e baseou-se em 2 normas existentes, DSSSL e CSS; foi partido em 2 normas que seguiram percursos diferentes: o XSLT e o XLSFO. O XSLFO define um conjunto de objectos gráficos através dos quais é possível especificar como é que os dados XML devem ser apresentados. Um processador de XSLFO, também chamado de formatador, usa esses objectos gráficos para converter a informação para o formato final, por ex. PDF. Ainda tem pouca maturidade e por isso é pouco usada. O assunto do resto do livro é pois o XSLT. Na versão 1.0, juntamente com uma norma acessória, o XPath tornaram-se numa recomendação W3C em fins de 1999 e, desde então tem sido a plataforma para a transformação de documentos XML. O XPath permite navegar e localizar elementos em documentos XML e é uma parte vital do processo de transformação, permitindo-nos especificar que partes do documento queremos transformar. À semelhança do DSSSL, o XSLT é usado para transformar informação referente a documentos XML, de uma estrutura para outra, o que tem como fins: - A criação de novos conteúdos - A conversão da ADA noutra ADA com estrutura diferente - A extracção de partes do conteúdo - A execução de queries estruturais sobre o conteúdo dos documentos XML O XSLT é também muito usado para transformar os documentos XML em documentos num formato apropriado para apresentação ou distribuição, tais como: - Geração de HTML, CSS, JavaScript, e outros, para distribuir conteúdos na web - Geração de VRML ou VoiceXML, para browsers não convencionais - Geração de representações gráficas para o conteúdo como SVG 9.1. Folhas de Estilo XSLT Uma folha de estilo XSL é composta por um conjunto de modelos ou templates e instruções baseadas em expressões XPath que indicam ao processador de XSLT como aplicar as templates aos nodos do documento XML a transformar. Para cada template, o processador percorre o documento até encontrar um nodo seleccionável pela template. A seguir aplica as instruções da template ao conteúdo do nodo. O resultado pode ser um novo documento XML, HTML ou texto simples. 9.2. XSLT: Modelo de Processamento Permite 2 abordagens na especificação da transformação pretendida: funcional ou declarativa, no qual o processador reage aos elementos XML à medida que os for encontrando, e outra, imperativa, na qual o processador é explicitamente instruído para realizar uma série de acções. Ex. 75: Duas abordagens alternativas ao processamento de XML Considerando o ex. da submissão electrónica, pretende-se converter esse documento numa página HTML. Seguindo uma abordagem declarativa, a descrição da transformação é: - Quando o elemento submissão for encontrado, gera-se o elemento h2 com o conteúdo Registo duma Submissão Electrónica dum TP e, a seguir, processam-se os elementos pertencentes ao conteúdo de submissão. - Quando o elemento equipe for encontrado, gera-se o elemento h3 com o conteúdo Work Team e gera-se um elemento table com o conteúdo processado de equipe, depois de se ter gerado um cabeçalho com um elemento tr e 3 elementos th - Quando o elemento aluno for encontrado, gera-se o elemento tr com o conteúdo processado de aluno - Quando o elemento numero for encontrado, gera-se o elemento td com o conteúdo processado de numero; idem para nome e curso. - Quando o elemento fich-env for encontrado não se faz nada (o conteúdo deste elemento é filtrado) - Quando o elemento data-hora for encontrado, gera-se o elemento h3 com o conteúdo Data e Hora: e coloca-se o conteúdo do elemento. Na abordagem imperativa: - coloca na saída um elemento h2 com o conteúdo Registo duma Submissão Electrónica dum TP - coloca na saída um elemento h3 com o conteúdo Work Team seguido de um elemento table, por sua vez, seguido dum cabeçalho com um elemento tr e 3 th - Para cada elemento aluno, gera-se o elemento tr com o seguinte conteúdo:

- um elemento td com o conteúdo de numero; idem para nome e curso. - Coloca na saída um elemento h3 com o conteúdo Data e Hora: seguido do conteúdo do elemento data-hora. Conclui-se do exemplo que a abordagem declarativa é mais reutilizável. 9.3. Ferramentas Actualmente há muitos processadores de XSLT, destando: saxon – completo, pequeno e rápido xt – inclui algumas funçõe sextra como possibilidade de vários ficheiros de saída sablotron – desenvolvido em C++ Xalan – Open source Apache 9.4. Utilização do XSL O XML por si só não nos permite implementar aplicações ou tirar partido da informação nele armazenada. Temos de conseguir manipular, interrogar, transformar e distribuir essa informação. Com o XSL é possível: - converter documentos entre diferentes formatos XML - formatar conteúdos XML para distribuição - Integrar o processamento de XML no servidor de aplicações web - utilizar XSLFO e CSS para produzir documentos de alta qualidade a partir de documentos XML - interrogar e seleccionar partes do conteúdo de um documento XML. CAP. 10 – XML Path Language (XPath) Vimos que as transformações XSLT são determinadas pela estrutura lógica do documento XML (ADA) que se quer transformar e pelas templates na stylesheet XSLT. As expressões XPath incluídas nas templates são responsáveis pela definição de qual a template que é aplicada a determinado nodo. Em termos funcionais os objectivos do XPath são: - Selecção de nodos para processamento - Especificação de condições permitindo diferentes modos de processamento do mesmo nodo - Geração de texto a ser incluído na árvore final (ADA resultante). O XPath é uma sintaxe usada para descrever partes de um documento XML. É possível então referenciar o primeiro elemento aluno, o atributo regime de aluno, todos os elementos nome cujo conteúdo contém José, etc. Uma stylesheet XSLT usa expressões XPath em 2 atributos, match e select, que estãoa ssociados a vários elementos do XSLT e que permitem guia a transformação. O XPath foi desenvolvido para ser utilizado como valor de um atributo num documento XML. A sintaxe é uma mistura da linguagem de expressões com a linguagem para especificação do caminho numa estrutura de directorias. Adicionalmente fornece um conjunto de funções para manipulação de texto, Namespaces e outras funcionalidades. Outro pormenor importante é que o XPath trabalha com a versão do documento XML processada pelo parser, isto é, com a s entidades de texto expendidas e as secções especiais de texto (CDATA) convertidas para texto. 10.1. O Modelo de Dados do XPath Do ponto de vista do XPath, um documento XML é uma ADA, ou seja, uma árvore de nodos. Para o XPath, há 7 tipos de nodos: - o nodo raiz (um por documento) - nodos elemento - nodos atributo - nodos texto - nodos comentário - nodos instrução de processamento - nodes namespace. EX: Usando a versão do poema (ex.35) 10.1.1. Nodo Raiz É o nodo que contém o documento inteiro. No nosso caso contém o elemento poema. É representado por ‘/’ em XPath. Não tem pai e tem pelo menos 1 filho – o nodo que representa o documento. Também pode conter comentários (há 1) e instruções de processamento (no nosso

caso há 1 – xml) que estejam fora do elemento que representa o documento, e que são pois filhos da raiz. O valor textual do nodo raiz corresponde à concatenação de todos os nodos texto existentes na sua descendência. 10.1.2. Nodos Elemento Todos os elementos são representados por um nodo. No nosso caso poema, titulo, autor, corpo, etc. Os filhos de um nodo elemento podem ser nodos texto, elemento, comentário e instrução de processamento que ocorrem nesse elemento. O valor textual é a concatenação dle com os filhos. Como todas as referências a entidades foram expandidas, não se pode manipular entidades gerais ou carácter em XPath. 10.1.3. Nodos Atributo Tem sempre um pai que é um nodo elemento. No nosso caso, por ex. o nodo elemento poema é pai de um nodo atributo com o nome tipo e valor soneto. Este tipo tem algumas funcionalidades distintas dos outros tipos de nodos: - Não são filhos do pai (elemento). Os filhos deste são elementos texto, elemento, cometário, instrução. Se se quiser seleccionar os nodos atributo tem de se indicar explicitamente, o que dá jeito e é o que se pretende. - Em circunstâncias normais o processador cria um nodo atributo para todos os atributos instancados no documento original e para os atributos que tenham um valor por omissão declaradao no DTD ou no Schema. 10.1.4. Nodos Texto São os mais simples, apenas contendo o texto do elemento correspondente. Se no documento original existem referências a entidades estas serão resolvidas antes do nodo ser criado, um nodo texto contém apenas texto puro. Não tem irmãos na ADA. 10.1.5. Nodos Comentário É muito simples. Contém apenas texto. Contém todo o conteúdo do comentário original excepto as marcas <! e -> 10.1.6. Nodos Instrução de Processamento Tem 2 partes, um nome e um valor textual, que é tudo o que aparece a seguir ao nome, excepto a marca de fecho ?> 10.1.7. Nodos namespace – raramente usados. 10.2. XPath como Selector de Nodos O selector é uma expressão XPath e esta é a utilização mais comum do XPath em XSLT. 10.2.1. Contexto Tudo aquilo que se faz em XPath é relativo ao contexto. Por analogia, podemos ver a ADA como uma árvore de directorias e o conteúdo dos seus nodos como ficheiros. 10.2.2. Selectores Simples ‘/’ – no início, selecciona o nodo raiz da ADA; no meio de uma expressão, funciona apenas como separador de 2 níveis da árvore. ‘.’ – representa o contexto actual; selecciona o nodo corrente ‘..’ – selecciona o pai do nodo correspondente ao contexto actual Estes operadores podem combinar-se em expressões XPath mais complexas. EXpls: /poema/corpo/quadra – selecciona todos os nodos do tipo quadra que são filhos de nodos corpo, que são filhos do nodo poema (só há um, é o elemento raiz do documento), que, por sua vez, é filho do nodo raiz da ADA (‘/’). ./verso/nome ../titulo 10.2.3. Selectores Relativos e Selectores Absolutos A expressão absoluta facilita a vida ao processador de XSL, mas complica a vida ao programador dificultando a reutilização. A relativa é o contrário, e é mais universal (por ex. aplica-se aos ternos e quadras do nosso poema) 10.2.4. Seleccionar: Para Além de Elementos (tb. se pode ter em conta o contexto) Selecção de Atributos Usa-se o carácter @ como prefixo do nome do atributo. Ex. /poema/@tipo. Selecção do Texto dum Elemento Usa-se uma função selectora do XPath de nome text() – se o nodo for intermédio corresponde à concatenação do texto de todos os filhos. Ex.

/poema/titulo/text() /poema/text() Selecção de Comentários e Instruções de Processamento comment() e processing-instruction() - uso esporádico. 10.2.5. Selectores Complexos 1. ‘*’ – selecciona todos os elementos no contexto corrente (só nodos elemento) 2. ‘@*’ – selecciona todos os atributos no contexto actual 3. ‘node()’ – selecciona todos os nodos no contexto actual ‘//’ – no meio de uma expressão significa que entre as 2 barras podem ocorrer zero ou mais elementos. Ex. “//verso” selecciona todos os versos do poema quer sejam filhos de quadra ou terno. Expls: /poema/corpo/*/verso //nome //@* //* //node() //coment() //quadra/text() 2ª Parte do XPath: 10.3. Eixos de Navegação No entanto, em muitas aplicações, é necessa´rio seleccionar nodos segundo uma perspectiva diferente da relação pai-filho, como por ex: - Todos os nodos ancestrais do nodo corrente - Todos os nodos descendentes do nodo corrente - Todos os nodos irmãos precedentes (à esquerda) ou sequentes (à direita) do nodo corrente. Para isso o XPath disponibiliza um mecanismo “eixo de navegação” (conceito fulcral do XPath). Ao todo são 13. Podemos afirmar que qualquer expressão XPath usa uma determinada relação (EN) entre elementos para “encaminhar” a selecção ao longo da ADA. Já era nas anteriores mas por ser a mais simples pode-se omitir. Para se usar um EN numa expressão indic-se o nome do EN seguido de (‘::’) seguido do nome do elemento que se quer seleccionar. Ex. quadra/verso é equivalente a child::quadra/child::verso. ENs: - child – Selecciona os filhos do nodo corrente (a omissão corresponde a este eixo). são incluídos nodos elemento, comentário, IP e textuais; não atributo nem namespace. - parent – selecciona o nodo pai do nodo corrente. Equivale ao .. - self – Selecciona o nodo corrente. Equivale ao . self::* = . - attribute – Selecciona os atributos do nodo corrente. equivale ao @ - ancestor – - ancestor-or-self - descendant – mesmas limitações do child - descendant-or-self - preceding-sibling – Selecciona todos os nodos que têm o pai do nodo corrente e que aparecem antes do nodo corrente no documento XML. - following-sibling - preceding – selecciona todos os nodos que aparecem antes do nodo corrente no documento, excepto os nodos ancestrais e os nodos atributo e namespace - following - ... descendentes ... - namespace – selecciona os nodos namespace do nod corrente ver expls. pg. 215 e 216 embora à frente apareçam integrados em ex. práticos. 10.4. Predicados É um filtro que restringe os nodos seleccionados por uma expressão XPath. São avaliados em tempo de execução e dão como resultado um valor booleano. Se para um determinado nodo, o resultado da avaliação do predicado for verdadeiro, esse ndo é seleccionado. ex. //quadra/verso[2] – selecciona o 2º verso das quadras do poema.

Números – predicado constituído apenas por um nº selecciona os nodos que têm essa posição particular. Atributos – Um predicado constituído por uma selecção de atributo é verdadeiro se esse atributo existir no lemento corrente. Ex. /poema[@tipo] selecciona o poema mas só se este tiver o atributo tipo instanciado //*[@*] selecciona qualquer elemento que tenha um qualquer atributo instanciado Funções – um predicado pode conter invocações de funções XSLT (ver próxima secção). Ex. quadra[last()] selecciona a última quadra do contexto corrente verso[position() mod 2 = 0] selecciona os versos do contexto corrente que se enecontram nas posições pares. Combinadores de Predicados - and or e união | 10.5 Funções Existem algumas expressões de selecção que não é possível especificar com os mecanismos discutidos até agora. Por isso usam-se funções, que pode ser divididas em 4 categorias: . Funções para manipulação de listas de nodos – Realizam cálculos sobre a ADA -position() – dá como resultado um nº correspondente à posição do nodo na ADA -last() – Dá como resultado um nº correspondente ao total de nodos existentes no nível da ADA do nodo corrente - count(xpath-exp) – Resultado é um nº de nodos seleccionados pela expressão XPath.ex. count(//verso) – conta o nº de versos do poema count(quadra[1]/ancestor::*) – conta o nº de ancestrais da 1ª quadra, ie, dá o nível da quadra. - id(identificador) – dá o nodo que tem um atributo do tipo ID com valor igual a identificador . Funções para manipulação de strings – para manipular texto - concat(str1,str2,...) - starts-with(str1,str2) – retorna um booleano true se str1 começar por str2 - contains(str1,str2) - substring(str,num,comp) – retorna uma string que se extrai da string argumento começando na posição num e de comprimento comp. - substring-before(str1,str2) – Retorna uma substring da 1ª, composta pelos caracteres anteriores à primeira ocorrência da 2º string do argumento. - substring-after(str1,str2) - string-length(str) - normalize-space(str) – Retorna a string arg. mas com os espaços do início e fim retirados, e todas as sequências de caracteres brancos no meio da string são substituídos por um único espaço em branco. - translate(str1,str2,str3) – Retorna a 1ª com as ocorrências de caracteres de str2 substituídos pelo respectivo caráctyer (na mesma posição) de str3. . Funções Booleanas - boolean(arg) – converte o argumento (pode ser qualquer coisa) num valor booleano - not(bool-exp) - true() - false() - lang(str) - string(arg) – converte o seu argumento, que pode ser de qualquer tipo, numa string. Utilização: quando aplicada a elemento de conteúdo vazio devolve falso, o que nos fornece maneira de testar elementos vazios. . Funções Numéricas number(arg) – converte o seu argumento (qualquer tipo) num nº. Se arg. for omitido a função é aplicada ao nodo corrente - sum(xpath-exp) – Retorna o resultado da soma da conversão para nº de todos os elementos seleccionados pela expressão argumento. Se um dos nodos tiver um conteúdo que não seja um nº, retorna NaN. - floor(num) - Retorna o maior inteiro menor ou igual ao argumento - ceiling(num) - round(num)

10.6 Exemplos de Expressões XPath //AAA – selecciona o nodo filho da raiz com nome AAA /AAA/CCC – Selecciona nodos de nome CCC filhos do nodo principal AAA que é filho da raiz //BBB – Selecciona todos os nodos de nome BBB existentes na ADA //DDD/BBB – todos os BBB que seja filhos de CCCs existentes em qualquer ponto da ADA /AAA/CCC/DDD/*todos os nodos filhos de nodos DDD que, por sua vez, são filhos de nodos CCC... /*/*/*/BBB – todos os nodos BBB posicionados no 4º nível //* - todos os nodos do tipo elemento existentes na ADA /AAA/BBB[1] - o 1º filho com nome BBB do AAA que é filho da raiz /AAA/BBB/[last()] último filho de nome BBB do AAA //BBB[@ident] – todos os nodos com nome BBB que tenham um atributo de nome ident instanciado //BBB[@*] – todos os nodos com nome BBB que tenham pelo menos um atributo instanciado. //BBB[@ident=’b1’] – todos os nodos com nome BBB que tenham um atributo de nome ident instanciado com valor b1. //BBB[normalize-space(@nome)=’bbb’] – todos os nodos com nome BBB que tenham um atributo de nome nome cujo valor normalizado seja igual a bbb //*[count(*)=2] - todos os nodos que tenham exactamente 2 filhos //*[count(BBB)=2] - todos os nodos que tenham exactamente 2 filhos com nome BBB //*[name()=BBB] – todos com nome BBB //*[starts-with(name(),’B’)] – cujo nome se inicie por B //*[contains(name(),’C’] – cujo nome contenha o carácter C //*[string-length(name())=3] – cujo nome seja constituído por 3 caracteres. //BBB | //CCC – todos da ADA com nome BBB ou CCC /descendant::* - todos os descendentes do nó raiz //CCC/descendant::*/DDD – todos os descendentes de nodos com nome CCC e cujo nome seja DDD CAP.11 FOLHAS DE ESTILO - construção 1º discute-se a arquitectura de uma folha de estilo. Depois os vários elementos XSL com os quais se constroem as folhas de estilo. 11.1. Conceitos Gerais Uma folha de estilo é essencialmente constituída por um conjunto de modelos (templates) Um modelo é constituído por 2 partes: - um sleccionador de nodos (expressão XPath) - Um bloco de instruções XSL – que é aplicado aos nodos que vão sendo seleccionados. Um processador de XSL realiza uma travessia da ADA começando pelo nodo raiz e visitando os filhos da esq. para a direita. Sempre que visita um novo nodo, o processador verifica se existe na folha de estilo algum modelo para lhe aplicar. Se existir aplica-o, se não aplica um por omissão para aquele tipo de nó. Um conceito muito importante é o contexto. 11.2. Anatomia de Uma Folha de Estilo Uma folha de estilo XSL é um documento XML. Por issso, deve ser iniciado pela declaração XML. O elemento principal deste tipo de documentos é sempre o mesmo e tem o nome de stylesheet. Como pode haver conflito de nomes entre elementos xsl e instâncias XML, deve usar-se um namespace associado ao prefixo xsl. Assim, forma inicial: <?xml version=”1.0” encoding=”iso-8859-1” ...?> <xsl:stylesheet version=”1.0” xlmns:xsl=http://www.w3.org/1999/XSL/Transform> … </xsl:stylesheet> 11.2.1. Elementos de Topo – filhos de stylesheet – por ordem de utilização normal: - xsl:import – permite importar modelos definidos noutras folhas de estilo. A prioridade será inferior. este elemento é vazio e só pode aparecer no início de uma folha de estilo. Ex. <xsl:import href=”poema.xsl”/>

- xsl:include – usa-se quando se pretende desenvolver modularmente uma folha de estilo. O funcionamento é semelhante ao anterior, mas a prioridade atribuída é igual e pode aparecer em qualquer ponto. Quando se desenvolve modularmente uma folha de estilo, colocam-se os modelos genéricos numa folha de estilo à parte que, depois, é incluída por quem precisar de utilizar aqueles modelos. A sintaxe é: <xsl: include href=”generics.xsl”/> - xsl:strip-space – permite especificar os lementos aos quais deve ser retirado o espaço em branco a mais. Tem um atributo de nome elements cujo valor deverá ser uma lista de nomes de elementos separados por um espaço simples. É de topo -> só filho de stylesheet. <xsl: strip-space elements=”quadra verso”/> - xsl:preserve-space - xsl:output – permite configurar o resultado final da transformação. É um lemento vazio e toda a informação relativa à configuração é colocada em atributos. <xsl:output [method = “html|text|xml”] [encoding = “encoding-name”] [omit-xml-declaration = yes|no”] [standalone=”yes|no”] [ident = yes|no”] method – xml: o processador verifica se o documento está bem formado; html: ignora uma série de restriçoes; text: não toma qualquer acção reletivamente ao que envia para a saída. encoding – indica qual a tabela de caracteres a usar na saída. em 905 dos casos é iso-8859-1 omit-xml-declaration – dá a opção ao utilizador de inserir ou não a declaração XML no documento resultado. yes só se method=xml standalone – yes indica que o documento final é só um. indent – processador utiliza espaços e mudanças de linha para formatar de acordo com a estrutura se yes. Normalmente presente em todas as folhas de estilo. Em 90% dos caso de geração para web: <xsl: output omit-xml-declaration=”yes” method=”html” encoding=”isso-8859-1” indent=”yes”/> - xsl:key – permite criar um índice de acesso directo para um determinado grupo de elementos (especificado em expressão XPath). Sintaxe: <xsl:key name=”nome” match=”xpath-exp” use=”chave”/> use é a entidade (atributo, elemento filho, conteúdo textual) do contexto actual que irá ser usada como chave do índice. O índice pode depois ser usado em qualquer ponto da folha através da função key() que tem 2 argumentos. ex: <xsl:value-of select=”key(/i-entrada’,’e3’)/nome”/> retornaria o nome associado à entrada com o atributo id igual a 3. - xsl:decimal-format – permite especificar um formato numérico que será usado sempre que o processador enviar nºs para a saída. Tem vários atributos permitindo várias variants: <xsl:decimal-format decimal-separator=”carácter” grouping-separator=”carácter” infinity=”string” minus-sign=”carácter” NaN=”string” percent=”carácter” per-mille=”carácter” zero-digit=”carácter” digit=”carácter”

pattern-separator=”carácter” /> Uma instância deste elemento permite configurar o modo de funcionamento da função formatnumber, que tem a sintaxe: format-number(num,string1,string2?) string1 é o padrão que especifica o formato string2 é opcional e corresponde a um nome(atributo name) de um elemento xsl:decimal-format - xsl:text – este elemento coloca o seu conteúdo na saída - xsl:value-of – calcula o valor textual da expressão XPath especificada no atributo select e envia-o para a saída. - xsl:namespace-alias – especificar um nome alternativo para o namespace sepre que não possa ser usado. A utilização mais comum surge em folhas de estilo que dão origem a outras folhas de estilo (aumentar o nível de abstracção). É um elemento de topo, que tem 2 argumentos: stylesheet-prefix – o prefixo que será usado na folha de estilo e que está associado a um namespace alternativo. result-prefix – o prefixo pelo qual será substituído quando estiverem a ser enviados para a saída. ver ex. pg. 232. - xsl:attribute-set – permite definir uma colecção de atributos que pode depois ser aplicado na criação de um elemento na saída. sintaxe: <xsl:attribute-set name=”identificador” use-attribute-sets=”lista de identificadores”> <xsl:attribute.../> ... </xsl:attribute-set> Ex de folha de estilo que especifica uma colecção de atributos para elementos imagem que depois é utilizada na criação de um elemento IMG do HTML <?xml version=”1.0” encoding=”UTF-8”?> <xsl:stylesheet version=”1.0” xmlns:xsl=http://www.w3.org/1999/XSL/Transform> <xsl:attribute-set> <xsl:attribute name=”border”>0</xsl:attribute> <xsl:attribute name=”width”>120</xsl:attribute> <xsl:attribute name=”height”>60</xsl:attribute> </xsl:attribute-set> <xsl:template match=”imagem”> <img scr={@url} xsl:use-attribute-sets=”imagem”/> </xsl:template> </xsl:stylesheet> - xsl:attribute – permite especificar atributos. Tem um atributo de nome name com o qual se define o nome do atributo e o seu conteúdo define o valor do atributo. - xsl:use-attribute-sets=”identificador” – Este atributo indica que se querem colocar neste ponto os atributos definidos na colecção identificada por identificador - scr=@url - As chavetas, quando utilizadas dentro de um atributo, indicam ao processador que se quer calcular uma expressão XPath. Neste caso, o cálculo da expressão retorna o valor do atributo url do elemento imagem na instância documental. - xls:variable – permite definir uma variável, que em XSL são constantes. As declaradas como elementos de topo são globais, as outras locais. Para se aceder ao valor duma variável coloca-se $ antes do seu nome. Pode ser definida de 2 maneiras: - Com este elemento vazio e usando o atributo select para definir o seu valor através de uma exp. XPath ... <xls:template match=”imagem”> <xls:variable name=”url” select=”@url”/>

<img scr=”$url” xsl:use-attribute-sets=”imagem”/> </xsl:template> … - Se não for vazio, o seu conteúdo define o valor da variável: ... <xls:template match=”imagem”> <xls:variable name=”url” > <xls:value-of select=”@url”/> </xls:variable> … - xsl: param – permite especificar o nome e o valor por omissão de um parâmetro que, mais tarde, poderá ser usado por um modelo. O seu valor pode ser definido da mesma maneira que o valor de uma variável. Tb. há globais e locais. Ex. 77 – Passagem de valores da linha de comando Esta folha de estilo imprime o número que lhe é passado na linha de comando e faz isso qualquer que seja o documento a que é aplicada. <?xml version=”1.0” encoding=”UTF-8”?> <xsl:stylesheet version=”1.0” xmlns:xsl=http://www.w3.org/1999/XSL/Transform> <xsl:param name=”num” select=”7”/> <xsl:output omit-xml-declaration=”yes”/> <xsl:template match=”/”> <xsl:value-of select=$num”/> </xsl:template> </xsl:stylesheet> esta folha de estilo quando invocada na linha de comando com o saxom dá o seguinte resultado: saxon rel.xml par-linha-com.xsl num=123 123 - xsl:template – É com este tipo de elementos que se especifica o conjunto de acções que se quer ver realizado por uma folha de estilo. Agrupa um conjunto de instruções (elementos xsl) que devem ser aplicados aos nodos seleccionados pela expressão XPath especificada num dos seus atributos. sintaxe: <xsl:template [match = xpath-exp”] [priority = “numero-inteiro”] // para quando o nodo é sel. por + que 1 template [name = “identificador”] [mode = “identificador”] > ... Instruções ... </xsl:template> name – permite associar um nome ao template para usar mais tarde como uma subrotina. mode – há muitos problemas cuja solução implica realizar várias travessias ao documento. Quando uma folha de estilo contém a especificação de mais do que uma travessia (mais que um conjunto de modelos) é necessário saber que modelo pertence a que travessia. A cada travesia é associado um identificador e todos os modelos pertencentes a uma determinada travessia têm o atributo mode instanciado com o identificador dessa travessia. Vamos agora discutir a parte comportamental: como é que uma folha de estilo é executada e como é que se pode controlar e alterar essa execução. 11.2.2. Modelos ex: A Folha de Estilo mais simples <?xml version=”1.0” encoding=”UTF-8”?> <xsl:stylesheet version=”1.0” xmlns:xsl=http://www.w3.org/1999/XSL/Transform> </xsl:stylesheet>

Qual o resultado quando aplicado a um documento? Não é string vazia. É o conteúdo textual do documento XML. Isto deve-se ao facto de não existir nenhum modelo definido nesta folha de estilo e sempre que não há, para qualquer nodo, a norma XSL prevê a aplicação dum modelo por omissão. Modelos Por Omissão - Modelo para nodos do tipo elemento e raiz – qualquer que seja a travessia, aqueles nós são visitados. <xsl:template match=”*|/” mode=”x”> <xsl:apply-templates mode=”x”/> </xsl:template> Modelo para nodos do tipo texto e atributo – copia o texto dos nodos textuais e os valores dos atributos para a saída. Para que este modelo seja aplicado, a travessia dos respectivos nodos terá de ser explicitamente invocada. <xsl:template match=”text()|@*”> <xsl:value-of select=”.”/> </xsl:template> Modelo para nodos do tipo comentário e instrução de processamento – não faz nada, tem acção de filtragem <xsl:template match=”comment() | processing-intruction()”/> Modelos para nodos do tipo namespace – idem imp. - xsl:apply-templates – se quisermos continuar a processar os nodos filho temos de o indicar explicitamente, caso contrário será filtrdao. sintaxe: <xsl:aplly-template select=”xpath-exp” mode=”identificador” … instruções xsl:sort ou xsl:with-param … </xsl:apply-templates> se select for omitido serão visitados todos os filhos do corrente. EXEMPLO: 11.2.3. UMA FOLHA DE ESTILO PARA A AGENDA Relembrar (ex34?) uma instância válida de uma agenda. Pretende-se especificar uma folha de estilo para agendas, que disponibilize numa página HTML, atendendo aos seguintes propósitos: - No início da página, deverá ser colocado um índice para cada uma das entradas e grupos de entradas - Ao longo da página, cada entrada deverá ter os seus campos agrupados numa lista - Sempre que aparecer uma referência a uma entrada, aquela deverá ser substituída pelo conteúdo da entraada que está a referenciar - um grupo deverá ter as suas entradas agrupadas numa lista - no início de cada grupo, deverá haver um link para regressar ao índice de entradas. <xsl:stylesheet version=”1.0” xmlns:xsl=http://www.w3.org/1999/XSL/Transform> <xsl:output method=”html” encofing=”iso-8859-1” indent=”yes”/> <xsl:key name=”i-entrada” match=”entrada” use=”@id”/> <xsl:template match=”agenda”> <h1>Agenda de Contactos</h1>

<hr/> <h2> <a name=”indice” >Índice de Entradas</a> </h2> <xsl:apply-templates mode=”indice”/> <hr/> <h2>Entradas</h2> <xsl:apply-templates/> <hr/> <h6> by jcr 2002</h6> </xsl:template> // especificou-se o modelo principal que coordena a execução dos restantes modelos. É invocada a travessia que irá gerar o índice de acesso directo às entradas e é desencadeada a travessia. <xsl:template match=”grupo”> </hr> <h3><a name={@gid}> Grupo: <xsl:value-of select=”@gid”/> </a> </h3> [<a href=”#indice”<Índice</<>] <ol> <xsl:apply-templates/> </ol> <hr/> </xsl:template> // Este é o odelo que trata a informação dos grupos. Utiliza-se o atributo gid para compor o cabeçalho do grupo. Cria-se um link para o índice no início da página html. <xsl:template match=”entrada”> <h3><a name={@id}>Entrada: <xsl:value-of select=”@id”/></a> </h3> <dl> <dt>Nome: </dt> <dd><xsl:value-of select=”nome”/></dd> <dt>Email: </dt> <dd>xsl:value-of select=”email””/></dd> <dt>Telefone:</dt> <dd><xsl:value-of select=”telefone”/></dd> </dl> </xsl:template> //No modelo especificado para entrada, cria-se uma marca no início, que é usada como ponto de referência no índice. Depois trata-se do conteúdo da entrada. <xsl:template match=”ref”> <h3>Entrada: <xsl:value-of select=”@entref”/></h3> <dl> <dt>Nome: </dt> <dd><xsl:value-of select=”key(í-entrada’, @entref)/nome”>>/dd> <dt>Email: </dt> <dd><xsl:value-of select=”key(‘I-entrada’,@entref)/email”/></dd> <dt>Telefone: </dt> <dd><xsl:value-of select=”key(‘I-entrada’,@entref)/nome”/></dd> </dl> </xsl:template>

// No modelo que trata as referências vai-se buscar a informação da entrada referenciada. Utilizase a tabela de acesso directo i-entrada para aceder ao nodo da entrada referenciada e de lá extrair a informação pretendida. <! -- Criação do Índice --> <xsl:template match=”entrada” mode=”indice”> [a href=#{@id}><xsl:value-of select=@id”/></a> </xsl:template> <xsl:template match=”grupo” mode=”indice”> [a href=#{@gid}><xsl:value-of select=@gid”/></a> </xsl:template> <xsl:template match=”text()” priority=”-1” mode=”indice”/> </xsl:stylesheet> //Estes 3 últimos modelos criam o índice no início da Página 39 de 42 11.3. Elementos de Controlo O XSLT tem 3 elementos que podem modificar a ordem de execução de uma folha de estilo. 11.3.1. xsl:if é como um if normal <xsl:if test=”exp-booleana> … </xsl:if> Se o resultado da expressão for verdadeiro então os elementos filhos de xsl:if são processados. Ex. <xsl:if test=”count(//entrada) &gt; 100”> <xsl:text>O número de entradas já é maior que 100</xsl:text> <xsl:text> Entradas = </xsl:text> <xsl:value-of select=”count(//entrada)”/> </xsl:if> A avaliação de test tem de ser booleano. Regras: - number (números) – zero, neagtivo ou NaN – falso - node-set (conjunto de nodos) – um conjunto vazio – falso - string – string vazia – falso 11.3.2. xsl:choose <xsl:choose> <xsl:when test=”exp-booleana”> … </xsl:when> … <xsl:otherwise> … </xsl:otherwise> </xsl:choose> É equivalente à instrução case ou switch. Pode tb. servir para implementar if-then-else 11.3.3 xsl:for-each É uma alternativa ao elemento xsl:apply-templates, com uma diferença a nível do paradigma que é imperativo. <xsl:for-each select=”xpath-exp” … <xsl:for-each> É construída uma lista de nodos seleccionados pela expressão XPath e depois aplicam-se as acções a esses nós, especificadas na instrução for-each. Ex. 80 – temos um excerto dum livro (pg.250) Pretendo criar uma página html com o índice do livro, uma lista dos títulos e capítulos. Esta acção é implementada pelo seguinte modelo:

<xsl:template match=”livro”> <OL> <xsl:for-each select=”capítulo”> <LI> <xsl:value-of select=”titulo”/> <LI> <xsl:for-each> </OL> </xsl:template> O resultado da transformação seria: <OL> <LI>Introdução</LI> <LI>Anotação de Documentos</LI> <LI>XML</LI> <LI>XSL</LI> </OL> 11.4. Ordenação de Elementos Em alguma aplicações, é necessário visitar os nodos documentais por outra ordem tal como a ordem alfabética de um determinadao atributo ou subelemento. Para isso é preciso reorganizar a lista de nodos que foram seleccionados. <xsl:sort select = “xpath-exp” [data-type = “text|number”] [lang = “código ISSO do idioma””] [order = “ascending|descending”] //por omissão é ascendente [case-order=”upper-first|lower-first”] /> Pode aparcer como filho do elemento xsl:apply-templates ou do elemento xsl:for-each. Por omissão do atributo data-type a ordem é alfabética, que não dá para nºs. EXEMPLO 81: O Ficheiro de Alunos Considere o contexto em que uma disciplina é leccionada a alunos de vários cursos. A avaliação contínua dos alunos foi registada num único documento XML com a seguinte forma: <?xml version=”1.0”?> <!DOCTYPE aval SYSTEM “aval.dtd”> <aval> <disciplina>Processamento Estruturado de documentos </disciplina> <ano>2001</ano> <docente> <nome>Jos&#233, Carlos Ramalho</nome> <email>jcr@di.uminho.pt</email> <url>http://www.di.uminho.pt/~jcr/</url> </docente> <alunos> <aluno> <nome> JOSE ALVES DE CASTRO</nome> <numero>23187</numero> <curso>LMCC</curso> <nota>16</nota> </aluno> <aluno> <nome> BRUNO MIGUEL PEREIRA PINTO</nome> <numero>24806</numero> <curso>LESI</curso> <nota>sn</nota> </aluno> <aluno> <nome> FILIPE ALEXANDRE DA SILVA MARTINS</nome> <numero>24816</numero>

<curso>LESI</curso> <nota>18</nota> </aluno> <aluno> <nome> ALVARO JOSE DE CASTRO MOREIRA DA SILVA</nome> <numero>19469</numero> <curso>LESI</curso> <nota>18</nota> </aluno> <aluno> <nome> ANDRE FILIPE AZEVEDO DE SOUSA</nome> <numero>22639</numero> <curso>LESI</curso> <nota>18</nota> </aluno> <aluno> <nome> MARIO BENTO AZEVEDO</nome> <numero>20210</numero> <curso>LMCC</curso> <nota>10</nota> </aluno> </alunos> ... </aval> Para efeitos de registo, é necessário produzir uma listagem dos alunos ordenados por curso e dentro do curso por ordem alfabética de nome. A folha de estilo produzindo uma tablea HTML é: <?xml version=”1.0” encoding=”iso-8859-1” standalone=”yes”?> <xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform version=”1.0”> <xsl:output method=”html” omit-xml-declaration=”no” encoding=”isso-8859-1” standalone=”yes” indent=”yes”/> <xsl:template match=”/”> <xsl:apply-templates/> <xsl:template> <xsl:template match=”aval”> <CENTER> <H3>Avaliação no período lectivo 2001/2002</H3> </CENTER> <xsl:apply-templates/> </xsl:template> (ver completo no Altova) Exemplo 82: O Ficheiro de alunos (2) Agora pretende-se uma folha de estilo que produza uma listagem, em texto livre, apenas do número e nome do aluno, um aluno por linha, e em que os alunos estejam ordenados por número. fizeram no saxon. Fazer como exercício no Altova. Na folha de estilo destacam-se os pontos: - a configuração da saída para texto, através do elemento xsl:output; - a template com nome n1 que simplesmente coloca uma mudança de linha na saída e que é invocada na template aluno através do elemento xsl:call-template - a colocação de um elemento xsl:sort no interior de um elemento xsl:apply-templates com o objectivo de alterar a ordem natural da travessia da árvore documental. 11.5 Tratamento de Referências/Ligações

Há 3 mecanismos que permitem criar referências/ligações entre elementos de um documento XML. 11.5.1. Atributos do tipo ID A mais simples é a associação de um atributo do tipo ID a cada elemento susceptível de vir a ser referenciado. Exemplo 83: Geração de um Índice de Navegação para o Livro. fazer no Altova 11.5.2. generate-id() Suponha que já tem a sua instância criada e, devido à sua dimensão, a adição de atributos do tipo ID aos elementos críticos não é uma solução viável. existe uma função que permite gerar automaticamente um identificador único para todos os elementos com a garantia de que sempre que se invocar a função sobre a mesma instância, recebe sempre o mesmo identificador. Ex. 84: Geração de um Índice de navegação para o livro fazer no Altova Tinha o mesmo excerto do livro mas sem os atributos tipo ID. A única alteração na folha de estilofoi a substituição do atributo ident pela aplicação da função generate-id() ao nodo corrente. 11.5.3. xsl:key (para os casos mais complexos) Já foi usado mas é complexo. Resumindo o que foi dito atrás, o elemento deve ser usado sempre que, na transformação de um sistema de referÊncias, se pretender substituir a referência por informação pertencente ao objecto referenciado. Ex. citações em livros. Ex. 85: Citações Bibliográficas Imagine um pequeno parágrafo com uma citação bibliográfica que aparece descrita mais à frente no documento. <para>Num trabalho anterior (<cit-bib refid=”Ram99”/>), o autor defendia que...</para> ... <bibitem id=”Ram99”> <titulo>O Desporto e a Osteoporose</titulo> ... </bibitem> ... Na página HTML, pretende-se substituir a referÊncia pelo título da obra. ... <xsl:key name=”i-cita” match=”//bibitem” use=@id”/> … <xsl:template match=”cit-bib”> [<xsl:value-of select=”key(‘I-cita’,@refid)/titulo”/>] </template> … Nas linhas 2 a 4 usa-se o elemento xsl:key para criar uma tabela de acesso directo aos itens bibliográficos. O atributo id do item bibliográfico é a chave de acesso nesta tabela. linhas 6 a 9 – o modelo que trata as citações faz a substituição destas pelo título da obra correspondente (utiliza a tabela de acesso directo criada, para ir buscar o título) colocado dentro de parentesis rectos.

Sign up to vote on this title
UsefulNot useful