0% acharam este documento útil (0 voto)
57 visualizações84 páginas

XML e XSL

Este documento resume um livro sobre XML e XSL. Ele discute a importância do XML e como ele se tornou uma norma amplamente utilizada em muitos domínios. Também descreve como o livro pretende fornecer uma cobertura abrangente de XML e transformação de documentos XML usando XSL.

Enviado por

jassonrecife
Direitos autorais
© Attribution Non-Commercial (BY-NC)
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
57 visualizações84 páginas

XML e XSL

Este documento resume um livro sobre XML e XSL. Ele discute a importância do XML e como ele se tornou uma norma amplamente utilizada em muitos domínios. Também descreve como o livro pretende fornecer uma cobertura abrangente de XML e transformação de documentos XML usando XSL.

Enviado por

jassonrecife
Direitos autorais
© Attribution Non-Commercial (BY-NC)
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 84

XML e XSL da Teoria Prtica

Jos Carlos Leite Ramalho Pedro Rangel Henriques

20 de Abril de 2001

XML e XSL: da Teoria Prtica

2 c FCA - EDITORA DE INFORMTICA

Pref acio

Quando o projecto desta obra nasceu, ainda no ano de 2000, o objectivo era escrever um livro sobre XML. A ideia era a de criar um livro que pudesse servir ao curioso mas tambm ao estudante da rea e utilizador mais experiente. A temtica do XML cedo se revelou insuciente. Um utilizador de XML, normalmente, quer fazer alguma coisa com os documentos que vai criando. Para isso, necessrio transformar os documentos XML. Assim, este livro cobre, exaustivamente, numa primeira parte, o XML e, numa segunda parte, a temtica da transformao dos documentos. No necessrio voltar a reforar aqui a importncia do XML. Hoje, esta norma invadiu todas as reas do saber onde a informtica est presente. Domnios to diversos como a medicina, a indstria aeronutica, o xadrez, a matemtica, a msica, as letras e o teatro fazem parte das reas de aplicao desta tecnologia. Da a preocupao de fazer uma obra abrangente que possa dar resposta a quem trabalha em todas aquelas reas. O livro reecte a experincia acumulada dos autores. Alm de descrever os conceitos bsicos, apresenta metodologias e maneiras de fazer que s se adquirem aps vrios anos de experincia. Um dos objectivos deste livro tambm o de acelerar a curva de aprendisagem do XML que ainda grande e apontada como umas das desvantagens da tecnologia. Quando se escreve uma obra h, num determinado momento, a necessidade de colocar um ponto nal e terminar. Foi o que zemos mas, cando com a sensao que

c FCA - EDITORA DE INFORMTICA ix

XML e XSL: da Teoria Prtica

muito podia ainda ser escrito. No momento em que este livro estiver a ser impresso, estaremos j a trabalhar na prxima edio, para que esta d mais e melhor.

x c FCA - EDITORA DE INFORMTICA

Indice

I
1

XML
Documentos XML bem formados 1.1 1.2 1.3 1.4 A declarao XML . . . . . . . . . . . . . . . . . . . . . . . . . . Comentrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Instrues de processamento . . . . . . . . . . . . . . . . . . . . . Elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.1 1.5

1
3 4 5 6 7

Tipos de contedo . . . . . . . . . . . . . . . . . . . . . . 10

Atributos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.5.1 Atributos reservados . . . . . . . . . . . . . . . . . . . . . 13

1.6 1.7 1.8

Seces especiais de texto . . . . . . . . . . . . . . . . . . . . . . 14 Regras de bem formao . . . . . . . . . . . . . . . . . . . . . . . 16 NameSpaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.8.1 1.8.2 Criao de NameSpaces . . . . . . . . . . . . . . . . . . . 20 Prexos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
c FCA - EDITORA DE INFORMTICA xi

XML e XSL: da Teoria Prtica

1.8.3 1.8.4 1.9 2

NameSpaces locais . . . . . . . . . . . . . . . . . . . . . . 22 NameSpaces por omisso . . . . . . . . . . . . . . . . . . . 23

Forma cannica de documentos XML . . . . . . . . . . . . . . . . 24 25

Documentos XML vlidos 2.1 2.2

Componentes de um documento XML vlido . . . . . . . . . . . . 26 Elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.2.1 2.2.2 lgebra do contedo . . . . . . . . . . . . . . . . . . . . . 29 Exemplos: o DTD Agenda e o DTD Poema . . . . . . . . . 35

2.3

Atributos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 2.3.1 2.3.2 2.3.3 2.3.4 Declarao . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Valores por omisso . . . . . . . . . . . . . . . . . . . . . 52

2.4

Associao de um DTD a um documento . . . . . . . . . . . . . . 53 2.4.1 Redenio parcial de um DTD . . . . . . . . . . . . . . . 54 57

XML Path Language (XPath) 3.1

O Modelo de Dados do XPath . . . . . . . . . . . . . . . . . . . . 58 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 Nodo raiz . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Nodos elemento . . . . . . . . . . . . . . . . . . . . . . . 60 Nodos atributo . . . . . . . . . . . . . . . . . . . . . . . . 60 Nodos texto . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Nodos comentrio . . . . . . . . . . . . . . . . . . . . . . 61 Nodos instruo de processamento . . . . . . . . . . . . . . 61 Nodos namespace . . . . . . . . . . . . . . . . . . . . . . 61

xii c FCA - EDITORA DE INFORMTICA

3.2

XPath como selector de nodos . . . . . . . . . . . . . . . . . . . . 62 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 Contexto . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Selectores Simples . . . . . . . . . . . . . . . . . . . . . . 62 Selectores Relativos e Selectores Absolutos . . . . . . . . . 63 Seleccionar: para alm de elementos . . . . . . . . . . . . . 64 Selectores Complexos . . . . . . . . . . . . . . . . . . . . 66

3.3 3.4 3.5 3.6

Eixos de Navegao . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Predicados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Exemplos de expresses XPath . . . . . . . . . . . . . . . . . . . . 74

c FCA - EDITORA DE INFORMTICA xiii

XML e XSL: da Teoria Prtica

xiv c FCA - EDITORA DE INFORMTICA

Parte I XML

c FCA - EDITORA DE INFORMTICA 1

Documentos XML bem formados

Como o leitor pode constatar, um documento XML formado por dados e anotaes. As primeiras perguntas que podem surgir so: o que que so anotaes? Como distingui-las dos dados? Num documento XML, os dados so blocos de texto. Pode ser que um dia os dados noutros formatos que no texto possam vir a fazer parte de um documento XML, mas neste momento so externos aos documentos, podendo ser referidos atravs de entidades (captulo ??). A anotao de um documento descreve a sua estrutura e induz uma interpretao do seu contedo. A anotao composta por: marcas de incio de elementos, marcas de m de elementos, marcas de elementos vazios, referncias a entidades, comentrios, limitadores de seces especiais de texto (CDATA seco 1.6), declaraes de tipo de documento e instrues de processamento. Veja-se agora, representado em XML, o exemplo tradicionalmente usado noutros contextos.

c FCA - EDITORA DE INFORMTICA 3

XML e XSL: da Teoria Prtica

Exemplo 1: "Hello World"


<?xml version="1.0" encoding="UTF-8"?> <doc> Hello World!!! </doc>

Uma anotao comea sempre por < e termina por >. Por isso fcil ver que o nosso exemplo tem trs anotaes: <?xml ...?>, <doc> e </doc>.

1.1

A declarao XML

De acordo com a norma ([?]), um documento XML deve comear sempre com uma declarao XML (que tem estado presente em todos os exemplos fornecidos at agora). Normalmente, se o documento tiver algo antes da declarao ou esta estiver ausente, qualquer processador acusar um erro ao tentar processar o documento. Uma declarao XML uma anotao especial que tem a seguinte forma: <?xml version="1.0" standalone="yes" encoding="iso-8859-1" ?> Podem ser usados trs atributos numa declarao XML: version O valor deste atributo indica a verso de XML que est a ser utilizada. Neste momento, apenas o valor "1.0" possvel. Este atributo obrigatrio e tem de estar presente em todas as declaraes. standalone Este atributo opcional e pode ter um de dois valores: o valor "yes" indica que o documento est autocontido, no tem referncias a entidades externas; o valor "no"indica que o documento contm referncias a entidades externas (por exemplo: outros documentos).
4 c FCA - EDITORA DE INFORMTICA

Documentos XML bem formados

encoding Este atributo tambm opcional e indica qual a codicao usada para os caracteres: o valor por omisso UTF-8, mas tambm poder ser UCS-2, UCS-4, ISO-XXX. No nosso caso, usamos caracteres portugueses, por isso, este atributo ter sempre o valor "iso-8859-1".

1.2

Comentrios

Um comentrio pode aparecer em qualquer ponto de um documento XML. Comea pela marca <!-- e termina com a marca -->.

Exemplo 2: "Hello World"

<?xml version="1.0" encoding="iso-8859-1"?> <!--Isto um comentrio no incio--> <doc>Ol Mundo!!!</doc>

Existem algumas restries utilizao de comentrios: No podem aparecer antes da declarao. No podem aparecer dentro de uma anotao. No se pode utilizar a sequncia de caracteres "--"dentro de um comentrio. Alm da sua funo bvia de documentao, os comentrios podem ainda ser utilizados para remover temporariamente partes do documento, desde que essas partes no contenham comentrios.

Exemplo 3: Uso de comentrios para remover partes de um documento

c FCA - EDITORA DE INFORMTICA 5

XML e XSL: da Teoria Prtica <RECEITAS> <TITULO> O Meu Livro de Receitas </TITULO> <RECEITA ORIGEM="Portugal"> <TITULO> Bolo </TITULO> <!-<INGREDIENTE> 500g de farinha </INGREDIENTE> --> <INGREDIENTE> 200g de aucar </INGREDIENTE> <INGREDIENTE> 300g de manteiga </INGREDIENTE> </RECEITA> </RECEITAS>

1.3

Instrues de processamento

As instrues de processamento so a nica reminiscncia da anotao procedimental que ainda perdura no XML. Uma instruo de processamento no faz parte do contedo do documento. uma indicao directa ao processador do documento de que algo deve ser executado naquele ponto quando o documento estiver a ser transformado. Uma instruo de processamento comea por <?id-processador e termina por ?>; id-processador dever indicar a que tipo de processamento a instruo se destina. Note-se que a declarao XML (seco 1.1) no mais do que uma instruo de processamento. A seguir apresenta-se um documento XML que contm algumas instrues de processamento.
6 c FCA - EDITORA DE INFORMTICA

Documentos XML bem formados

Exemplo 4: Instrues de processamento

<?xml version="1.0" encoding="ISO-8859-1"?> <agenda> <?html action="hr"?> <entrada id="e1" tipo="pessoa"> <nome>Jos Carlos Ramalho</nome> <email>[email protected]</email> <telefone>253 604479</telefone> </entrada> <?html action="hr"?>

Neste exemplo, alm da j referida declarao XML, esto presentes duas instrues de processamento anlogas: <?html ...?> estas duas instrues de processamento identicam ordens que devero ser executadas aquando da transformao deste documento para HTML. Neste caso concreto, indica-se que, quando o processamento do documento XML coincidir com a gerao da sua verso HTML, devero ser geradas duas marcas hr nas posies onde se encontram as instrues de processamento. Neste momento, j vimos tudo o que pode aparecer no incio de um documento XML (antes do corpo do documento): instrues de processamento, comentrios e a declarao XML1 . Um documento XML bem formado tem vrias componentes que se descrevem nas seces seguintes.

1.4

Elementos

A estrutura de um documento XML denida custa de elementos que determinam os blocos lgicos em que o texto global pode ser partido ou decomposto. Um
1

Embora os dois primeiros possam aparecer em qualquer ponto do corpo do documento.

c FCA - EDITORA DE INFORMTICA 7

XML e XSL: da Teoria Prtica

elemento composto pela sua anotao de incio, pelo seu contedo e pela sua anotao de m. Uma anotao de incio comea por < e termina com >, e uma anotao de m comea por </ e termina com >. Quer uma quer outra contm no meio o nome do elemento que inicia ou que termina, respectivamente.

Exemplo 5: Anotao de um elemento No texto abaixo, a palavra Braga est anotada como sendo um elemento de nome lugar.
Vais ver o espectculo a <lugar>Braga</lugar>?

Uma restrio inerente ao XML a de que o nome de uma anotao de m tem de ser igual ao da anotao de incio imediatamente anterior (este ser um dos princpios da bem formao de um documento). Um elemento tem de estar completamente contido noutro elemento, excepto o ancestral de todos os elementos (o elemento raiz). Algumas estruturas hierrquicas podem ser recursivas. Um elemento pode conter directa ou indirectamente instncias de si prprio, como iremos ver mais frente num caso de estudo (exemplo 23). Esta possibilidade de recursividade ou aninhamento ir causar, muitas vezes, problemas no momento de processar a informao, mas necessria para modelar certo tipo de informao. As regras a que o nome de um elemento deve obedecer so as seguintes: 1. o primeiro carcter dever ser uma letra, um underscore ou um sinal de dois pontos; 2. os caracteres seguintes podem ser letras, dgitos, underscores, hfens, pontos e dois pontos; 3. o espao em branco no pode aparecer no nome de uma anotao.
8 c FCA - EDITORA DE INFORMTICA

Documentos XML bem formados

Em XML h distino entre maisculas e minsculas. Assim, lugar, Lugar e LUGAR so referncias a elementos distintos. Eis alguns exemplos de nomes vlidos: <Doc:princ> <documento> <_secreto> <aluno4> <DB_tab5> </Doc:princ> </documento> </_secreto> </aluno4> </DB_tab5>

E alguns exemplos de nomes invlidos: <1documento> <aluno(4)> <DB tab5> </1documento> -- comea por dgito </aluno(4)> -- tem parentesis </DB tab5> -- tem espao em branco

Por outro lado, no contedo de um elemento, nunca devero aparecer os caracteres < e > pois so os caracteres que limitam as anotaes. Em lugar deles devemse usar, respectivamente, as entidades (captulo ??) do tipo carcter &lt; e &gt;. Qualquer processador ou editor de XML far a substituio automtica daquelas entidades pelos caracteres correspondentes.

Exemplo 6: Caracteres reservados Se, no documento, estivesse escrito desta forma:


A anotao &lt;nome&gt; usada para anotar nomes.

Um editor mostraria o mesmo texto da seguinte maneira:


A anotao <nome> usada para anotar nomes.

c FCA - EDITORA DE INFORMTICA 9

XML e XSL: da Teoria Prtica

1.4.1

Tipos de contedo

Os elementos podem incluir outros elementos (ditos elementos lho) e texto. H elementos que no contm texto directamente, apenas contm outros elementos. So elementos estruturantes. Num dos exemplos anteriores, apresentou-se o livro de receitas: o elemento RECEITAS tem como contedo apenas elementos RECEITA; portanto um elemento deste tipo.

<RECEITAS> <RECEITA> ... </RECEITA> <RECEITA> ... </RECEITA> <RECEITA> ... </RECEITA> ... </RECEITAS>

Os caracteres brancos (espaos, mudanas de linha, tabulaes) que surgem no contedo de elementos que no contm texto so irrelevantes e no so considerados como fazendo parte do documento. Assim, o excerto anterior poderia ser igualmente representado por:

<RECEITAS><RECEITA> ... </RECEITA><RECEITA> ... </RECEITA><RECEITA> ...</RECEITA>...</RECEITAS>

No entanto, em algum ponto da hierarquia do documento, o texto ir aparecer. Neste ponto o elemento contm texto ou uma mistura de texto com elementos lho. Um elemento que contenha apenas texto designado como tendo contedo textual. So exemplo desta situao, os elementos abaixo, que j foram aparecendo neste livro:

<lugar>Braga</lugar> <INGREDIENTE>Meia dzia de ovos</INGREDIENTE> <data>(1922)</data>


10 c FCA - EDITORA DE INFORMTICA

Documentos XML bem formados

Quando um elemento contm simultaneamente texto e elementos lho, designa-se por elemento de contedo misto. Nos exemplos abaixo, <verso> e <p> so instncias de elementos de contedo misto (que tambm j foram introduzidos anteriormente), enquanto <nome> e <lugar> so instncias de elementos de contedo textual. <verso>Olha, <nome>Daisy</nome>: quando ...</verso> <p>Vais ver o espectculo a <lugar>Braga</lugar>?</p> Por ltimo, um elemento pode no ter qualquer contedo. Este tipo de elemento normalmente designado por elemento vazio. Estes elementos so normalmente utilizados pelo seu signicado posicional. Alguns exemplos conhecidos do HTML so os elementos BR e HR que marcam, respectivamente, a quebra de uma linha e o traar de uma linha horizontal. O leitor aqui poderia interrogar-se: "No ser isto uma anotao procedimental?". Ter um pouco de razo, mas relembre a discusso sobre uma anotao equilibrada (??). H, no entanto, elementos vazios puramente descritivos como o caso de elementos que representam referncias. Para alm da posio, contm informao nos atributos (1.5). Eis um exemplo de um destes elementos: Como ser discutido num captulo mais frente (<ref ident="cap5"/>) ... Outro exemplo deste tipo de elementos, que aparecer mais frente nalguns casos de estudo, o de um elemento que marca o ponto onde dever ser inserida uma imagem. Como se pode ver na figura seguinte ... <figura path="..."/> ... Como j deve ter notado, estes elementos tm uma sintaxe diferente. So representados por uma nica anotao que iniciada por < e termina em />, que a forma abreviada de escrever <elem-ident></elem-ident>. Na prxima seco, vamos analisar os atributos que surgiram nestes ltimos exemplos.
c FCA - EDITORA DE INFORMTICA 11

XML e XSL: da Teoria Prtica

1.5

Atributos

Um elemento pode ter um ou mais atributos que, por sua vez, podem ser opcionais ou obrigatrios. Os atributos visam qualicar o elemento a que esto associados. Ao pensar no problema da distino entre elemento e atributo, podemos traar um paralelo com a lngua portuguesa: os elementos so os substantivos, e os atributos os adjectivos. Podemos ento estabelecer a seguinte equivalncia: Isto uma casa Isto uma casa verde ----<CASA> <CASA COR="verde">

No h limite para o nmero de atributos que podem estar associados a um elemento. Os atributos aparecem sempre na anotao que marca o incio de um elemento, uma vez que vo qualicar o contedo que se segue. Um atributo denido por um par constitudo por um nome e um valor: o nome e o valor devem estar separados pelo sinal = e o valor dever estar colocado dentro de aspas simples ou duplas. O nome de um atributo segue as mesmas regras do nome dos elementos. O valor ser sempre o texto que estiver dentro das aspas. Podemos desde j alertar o leitor para o problema da representao de uma dada informao num elemento ou num atributo. No existe uma fronteira entre os dois e muitas vezes a escolha no simples. Atente-se no seguinte exemplo de uma agenda de contactos.

Exemplo 7: Informao nos elementos


<agenda> <entrada id="e1" tipo="pessoa"> <nome>Jos Carlos Ramalho</nome> <email>[email protected]</email> <telefone>253 604479</telefone> </entrada> ... </agenda> 12 c FCA - EDITORA DE INFORMTICA

Documentos XML bem formados

Uma agenda composta por um ou mais elementos entrada. Cada um destes elementos estruturado em vrios subelementos, nome, email e telefone, e tem dois atributos id e tipo que lhe atribuem certas propriedades. Vamos ver o que acontece se passarmos a informao dos elementos para atributos.

Exemplo 8: Informao nos atributos

<agenda> <entrada id="e1" tipo="pessoa" nome="Jos Carlos Ramalho" email="[email protected]" telefone="253 604479"/> ... </agenda>

Este documento tambm um documento XML bem formado o que mostra a fragilidade da fronteira entre atributo e elemento mas, como veremos mais frente, muito mais difcil de processar.

1.5.1

Atributos reservados

H caractersticas universais que o contedo dos elementos pode partilhar em diferentes aplicaes. Normalmente, incluem-se nestas caractersticas a lngua utilizada e a importncia dos caracteres brancos. Para evitar conitos com nomes de atributos denidos pelo utilizador, a norma reservou o prexo xml:. Na norma XML h apenas dois atributos reservados, xml:lang e xml:space, que se descrevem a seguir. xml:lang Este atributo pode ser associado a qualquer elemento e indica qual a lngua em que o texto desse elemento est escrito. Esta faceta til em ambientes multilingues. Poderamos ter por exemplo:
c FCA - EDITORA DE INFORMTICA 13

XML e XSL: da Teoria Prtica

<para xml:lang="en">Hello</para> <para xml:lang="pt">Ol</para> <para xml:lang="fr">Bonjour</para> Desta maneira poderamos seleccionar o elemento a mostrar em dada altura ao utilizador, dependendo da escolha lingustica deste. Os valores possveis para este atributo esto denidos na norma ISO-639. xml:space Este atributo, tambm associvel a qualquer elemento, pode ter um de dois valores: default ou preserve. Serve para indicar se o espao branco no contedo do elemento em causa ou no relevante. O valor default indica que o espao no importante e far com que a maioria dos processadores compactem qualquer sequncia de carcteres brancos num espao. O valor preserve far com que os caracteres brancos sejam mantidos como parte integrante do contedo do elemento.

1.6

Seces especiais de texto

Quando um autor quer usar caracteres que podem ser confundidos com aqueles utilizados para delimitar as anotaes, como <, > e &, deve usar entidades como &lt;, &gt; ou &amp; no seu lugar. Apesar de uma entidade deste tipo ter o efeito desejado de eliminar a confuso, no de todo intuitiva e o texto torna-se de difcil leitura. Se determinado pedao de texto contiver muitos caracteres deste tipo, por exemplo um extracto de um documento XML que se queira usar como demonstrao, a utilizao de entidades pode ser considerada inaceitvel. Considere o seguinte exemplo:

Exemplo 9: Caracteres especiais no texto Para obter o seguinte texto nal:


Prima a tecla <<<ENTER>>>.

O utilizador deve introduzi-lo da seguinte forma:


14 c FCA - EDITORA DE INFORMTICA

Documentos XML bem formados Prima a tecla &lt;&lt;&lt;ENTER&gt;&gt;&gt;.

Para resolver as situaes em que estes caracteres abundam, o XML dispe de um mecanismo: Seces Marcadas de Texto. Numa seco destas, pode-se escrever livremente sem ser necessrio substituir aqueles carcteres pelas entidades correspondentes. Uma seco marcada de texto sempre iniciada por <![CDATA[ e terminada por ]]>.

Exemplo 10: Seces marcadas de texto Recorrendo ao mecanismo das Seces Marcadas de Texto para se obter o mesmo resultado nal:
Prima a tecla <<<ENTER>>>.

o texto a introduzir ter a seguinte forma:


<![CDATA[Prima a tecla <<<ENTER>>>.]]>

Contudo, as referncias a entidades, dentro destas seces, so ignoradas.

Exemplo 11: Seces marcadas e entidades Assim, o resultado visual (nal) do texto XML:
<![CDATA[Prima a tecla &lt;&lt;&lt;ENTER&gt;&gt;&gt;.]]>

ser:
c FCA - EDITORA DE INFORMTICA 15

XML e XSL: da Teoria Prtica Prima a tecla &lt;&lt;&lt;ENTER&gt;&gt;&gt;.

Terminou aqui a descrio dos elementos a que se pode recorrer para a constituio de um documento XML bem formado.

1.7

Regras de bem formao

Aps termos visto quais os componentes de um documento XML, vamos enunciar um conjunto de regras que deve ser seguido na construo de um documento XML bem formado: Um documento XML deve ter sempre uma declarao XML no incio Apesar de no ser obrigatria, muitos processadores no funcionaro correctamente se ela estiver ausente. Nos nossos documentos, em lngua portuguesa, a declarao XML ter sempre a seguinte forma:
<?xml version="1.0" encoding="iso-8859-1"?>

O documento deve incluir um ou mais elementos Para ser bem formado, um documento XML precisa de incluir um ou mais elementos. O primeiro, que delimitar todo o corpo do documento, o elemento raiz e todos os outros devero estar includos dentro dele.

Exemplo 12: Documento XML bem formado No documento XML abaixo, o elemento raiz sumarios, contendo, no seu interior, os elementos disciplina, professor e aula, os quais, por sua vez, so constitudos por outros elementos e texto:
<?xml version="1.0" encoding="ISO-8859-1"?> <sumarios> 16 c FCA - EDITORA DE INFORMTICA

Documentos XML bem formados <disciplina> Processamento Estruturado de Documentos</disciplina> <professor> <nome>Jos Carlos Ramalho</nome> <email>[email protected]</email> <url>http://www.di.uminho.pt/~jcr</url> </professor> <aula tipo="T"> <data>2000.10.02</data> <sumario> <p> Anotao de Documentos: um pouco de histria.</p> <p> Linguagens de Anotao como meta-linguagens: o SGML e o XML.</p> <p> Anotao Descritiva. Ciclo de vida dos documentos estruturados.</p> </sumario> </aula> ... </sumarios>

Todos os elementos tm anotaes de incio e fecho A nica excepo a esta regra so os elementos vazios, cujas anotaes podem ser substitudas por uma nica anotao de incio que termina em / >. Os elementos devero estar aninhados correctamente No exemplo seguinte, apresenta-se a situao a evitar.

c FCA - EDITORA DE INFORMTICA 17

XML e XSL: da Teoria Prtica

Exemplo 13: Elementos aninhados incorrectamente

O ttulo do livro <B><I>XML</B> ... Prtica</I>.

Ao contrrio do que acontece no excerto acima, o primeiro elemento a comear ter sempre de ser o ltimo a fechar e o ltimo a abrir dever ser sempre o primeiro a fechar. Neste caso, as anotaes de B e de I esto cruzadas. O elemento B deveria terminar antes do I iniciar, ou iniciar depois do incio de I, ou ainda fechar depois do fecho de I.

Os valores de atributos tm de estar dentro de aspas Se numa dada situao o valor do atributo necessitar de conter aspas, ento devero ser usados apstrofes (ou aspas simples) para limitar o valor, como se v no exemplo abaixo:
<citao texto=O mido falou:"O Rei vai n!" />

1.8

NameSpaces

Usando XML, o utilizador tem uma liberdade total na denio da sua linguagem, podendo atribuir os nomes que bem entender aos seus elementos e atributos. No entanto, medida que o nmero de utilizadores e de aplicaes XML foi crescendo, surgiu um problema que no estava previsto; comearam a aparecer conitos nos nomes dos elementos: quando num documento XML se importam pedaos de outros documentos XML escritos por outros autores, podero surgir conitos como anotaes com o mesmo nome, mas com semnticas diferentes ou utilizadas em contextos contraditrios.

Exemplo 14: Conitos entre elementos com o mesmo nome Consideremos o caso do elemento livro usado em dois contextos diferentes: num catlogo e num pedido de encomenda.
18 c FCA - EDITORA DE INFORMTICA

Documentos XML bem formados

Elemento livro no catlogo:


<livro> <titulo>XML: da teoria prtica</titulo> <resumo>Livro que cobre duma maneira geral mas com alguma profundidade a temtica XML.</resumo> <temas> <tema>XML</tema> <tema>XSL</tema> </temas> </livro>

Elemento livro no pedido de encomenda:


<encomenda> ... pagamento e envio ... <item> <livro> <titulo>XML: da teoria prtica</titulo> <isbn>1-999999-88-7</isbn> </livro> <quantidade>4</quantidade> <preo EUR="17 euros"/> </item> </encomenda>

O elemento livro apresenta duas semnticas diferentes nos dois contextos em que usado. Se estivssemos perante um outro documento formado com elementos de ambos os documentos apresentados, teramos alguma diculdade em interpretar os componentes livro que aparecessem, pois no saberamos descobrir a provenincia desses elementos livro.

Os NameSpaces so a soluo do problema. Um NameSpace uma superetiqueta formada pelo nome da anotao ao qual concatenado um prexo. Esse prexo denido pelo utilizador e dever ser nico.
c FCA - EDITORA DE INFORMTICA 19

XML e XSL: da Teoria Prtica

Para garantir tal unicidade, convencionou-se que se usaria a sintaxe dos URL para o prexo. Assim, partindo do princpio de que cada utilizador tem um URL prprio, acabam-se os conitos.

1.8.1

Criao de NameSpaces

O World Wide Web Consortium (W3C) publicou uma recomendao com o ttulo Namespaces in XML, onde se dene um Namespace como: Uma coleco de nomes, identicados por uma referncia URI (Universal Resource Identier) que usada nos documentos XML como prexo dos nomes de elementos e de atributos. A mesma recomendao dene o modo como devem ser criados e declarados os Namespaces. Para esse efeito, convencionou-se existir um atributo global (pode ser instanciado em qualquer elemento do documento) de nome xmlns. com este atributo que se dene/cria um NameSpace. No exemplo seguinte, apresentam-se algumas declaraes de NameSpaces vlidos:

Exemplo 15: NameSpaces

xmlns="http://xml.di.uminho.pt/XMLSamples/livro.dtd" xmlns="livro.dtd" xmlns="meu-URL/DTDs/livro.dtd"

As trs declaraes so vlidas, apesar de s a primeira seguir a recomendao de utilizar o formato de um URI para o identicador do NameSpace.

20 c FCA - EDITORA DE INFORMTICA

Documentos XML bem formados

1.8.2

Prexos

A string identicadora de um NameSpace demasiado grande para ser manipulada directamente. Assim, e para que a utilizao de um NameSpace seja vivel, associase-lhe uma abreviatura (um identicador ou qualicador do nome) que pode, mais tarde, ser utilizado como referncia ao NameSpace. Este qualicador tambm, muitas vezes, designado por prexo.

Exemplo 16: NameSpaces com prexos Em relao ao ltimo exemplo, os NameSpaces podiam ter sido declarados assim:
xmlns:catalogo="http://xml.di.uminho.pt/Samples/livro.dtd" xmlns:encomenda="livro.dtd" xmlns:jcr="meu-URL/DTDs/livro.dtd"

Neste caso, catalogo, encomenda e jcr seriam abreviaturas dos respectivos NameSpaces indicados frente.

Imaginemos agora um cenrio ligeiramente diferente: temos um catlogo de livros em XML ao qual queremos acrescentar os nossos comentrios usando as nossas anotaes para comentrios. Podamos utilizar os NameSpaces da seguinte forma:

Exemplo 17: Utilizao de NameSpaces com prexo

<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 prtica </catalogo:titulo> <jcr:opiniao>Um bom ponto de partida ...</jcr:opiniao> c FCA - EDITORA DE INFORMTICA 21

XML e XSL: da Teoria Prtica <catalogo:resumo>Livro que cobre duma maneira geral mas com alguma profundidade a temtica XML. </catalogo:resumo> ... </catalogo:livro>

1.8.3

NameSpaces locais

Como se disse atrs, o atributo xmlns pode ser utilizado em qualquer elemento e no apenas no elemento raiz. Assim, e para o tornar mais claro, o exemplo anterior poderia ser reescrito da seguinte maneira:

Exemplo 18: Utilizao de NameSpaces locais

<catalogo:livro xmlns:catalogo="http://xml.di.uminho.pt/DTD/livro.dtd"> <catalogo:titulo>XML: da teoria prtica </catalogo:titulo> <jcr:opiniao xmlns:jcr="http://jcr.di.uminho.pt/DTD/coment.dtd"> Um bom ponto de partida ...</jcr:opiniao> <catalogo:resumo>Livro que cobre duma maneira geral mas com alguma profundidade a temtica XML. </catalogo:resumo> ... </catalogo:livro>

A declarao do Namespace cou agora junto do elemento que faz uso dela (jcr:opiniao).
22 c FCA - EDITORA DE INFORMTICA

Documentos XML bem formados

1.8.4

NameSpaces por omisso

O atributo xmlns pode ser utilizado isoladamente sem a declarao de um prexo. Quando isso acontece, nenhum prexo especicado e diz-se que se acabou de declarar um NameSpace por omisso. Todos os elementos lho do elemento onde o NameSpace foi declarado pertencem agora a esse NameSpace. O mesmo exemplo do catlogo com comentrios pode ento ser reescrito da seguinte forma:

Exemplo 19: Utilizao de NameSpaces por omisso

<livro xmlns="http://xml.di.uminho.pt/DTD/livro.dtd"> <titulo>XML: da teoria prtica</titulo> <jcr:opiniao xmlns:jcr="http://jcr.di.uminho.pt/DTD/coment.dtd"> Um bom ponto de partida ...</jcr:opiniao> <resumo>Livro que cobre duma maneira geral mas com alguma profundidade a temtica XML. </resumo> ... </livro>

Como o Namespace associado a livro foi declarado sem prexo, todos os elementos lhos de livro so considerados como pertencentes a esse NameSpace, excepo daqueles que tenham um NameSpace declarado localmente (como o caso de jcr:opiniao). Mais frente, veremos a relao dos NameSpaces com os DTD e com os XML Schema. Mais tarde, iremos utiliz-los quando estivermos a discutir o XSL. Para terminar o captulo, vamos ver uma variante do XML que est relacionada com a representao abstracta da informao num documento.
c FCA - EDITORA DE INFORMTICA 23

XML e XSL: da Teoria Prtica

1.9

Forma cannica de documentos XML

Nos ltimos tempos, tem surgido uma preocupao crescente no seio da comunidade de investigadores e utilizadores do XML: como representar, de uma forma abstracta, a informao num documento XML de modo a ser possvel comparar documentos? Alm de ser uma questo actual, achamos pertinente coloc-la aqui porque introduz mais um conceito que aparece de vez em quando a quem trabalha com XML: o XML cannico. A soluo utilizada noutras reas do conhecimento cientco a reduo dos dois objectos que se querem comparar forma mais simples, utilizando uma metodologia convencional. Noutras reas, esta operao recebeu o nome de reduo forma cannica. Aqui, designaremos o resultado dessa reduo por XML cannico. O XML cannico uma proposta existente no World Wide Web Consortium (W3C) e que o leitor mais interessado poder consultar na Web2 . Na representao em XML cannico, dois documentos XML logicamente equivalentes, mas que podiam estar representados de maneiras diferentes em XML (espaamento, linhas em branco, codicao, elementos vazios, ...), so iguais byte a byte. Isto conseguido custa de uma sintaxe bastante estrita: s permitida a codicao de caracteres em UTF-8, os pares CR/LF so substitudos por LF, nos elementos textuais as sequncias de caracteres brancos so substitudas por um nico espao, ... H vrios pacotes de software que integram ferramentas que fazem a reduo de documentos XML forma cannica. Um deles o conjunto de ferramentas da IBM Alphaworks, o XML4J3 . Concluindo, dois documentos XML na forma cannica podem ser comparados directamente e qualquer diferena entre eles ser bem evidente, podendo este processo de comparao ser automatizado. No prximo captulo, vamos abordar a especicao de DTD e o conceito de documento XML vlido.
2 3

http://www.w3.org/TR/xml-c14n http://www.alphaworks.ibm.com/tech/xml4j

24 c FCA - EDITORA DE INFORMTICA

Documentos XML v alidos

At ao momento vimos como relativamente fcil ao utilizador comum criar documentos XML bem formados. Um documento XML bem formado no necessita de a ele ter associado um processo de validao exaustivo, o que simplica muito o seu processamento. Em muitas aplicaes XML, os documentos so gerados automaticamente. Nestas aplicaes, o gerador garante por si s a bem-formao e a validao dos documentos e, nesta situao, trabalhar com documentos bem formados mais do que suciente. Porm, na maioria dos casos em que o utilizador que edita e manipula os documentos XML, h necessidade de estipular um conjunto de regras que estabeleam a validade dos documentos. Este conjunto de regras dene uma classe, ou tipo, de documento e permite a posterior validao e processamento dos documentos criados. especicao de um tipo de documentos d-se o nome de DTD (Document Type Denition) ou XML Schema. O processo que verica se um documento est de acordo com um DTD ou Schema designa-se por Validao; a um documento depois de vericado atribumos a classicao de documento XML Vlido. Os XML Schemas sero discutidos num captulo mais frente (cap. ??). Neste captulo, apresenta-se em detalhe a linguagem com a qual se especica um DTD.

c FCA - EDITORA DE INFORMTICA 25

XML e XSL: da Teoria Prtica

2.1

Componentes de um documento XML vlido

Um documento XML vlido composto por duas grandes e distintas partes: o DTD e a Instncia. O DTD dene as regras a que a instncia tem de obedecer para pertencer ao tipo de documento denido pelo DTD. Como j foi abordado no captulo anterior, a anotao de um elemento composta por duas marcas, uma de incio do elemento e uma de m do elemento. Estas anotaes iro descrever as qualidades caractersticas do elemento. Uma daquelas caractersticas o seu nome, que identica o tipo do elemento: pargrafo, figura, lista, ... Adicionalmente, um elemento poder ser qualicado por mais caractersticas que lhe so inerentes. Estas recebem a designao de atributos. As anotaes descrevem a estrutura de um documento. Indicam quais os elementos que ocorrem no documento e em que ordem. Esta estrutura tem de ser vlida de acordo com o conjunto de declaraes no DTD que dene todas as estruturas permitidas num determinado tipo de documento. Para introduzir este conceito de DTD, recorre-se ao exemplo seguinte.

Exemplo 20: DTD para uma carta Neste exemplo, todas as linhas comeadas por <!- so comentrios e destinamse a esclarecer o objectivo geral do tipo de documento e os de cada elemento em particular.
<!-- Este DTD define a estrutura de docs do tipo CARTA --> <!DOCTYPE CARTA [ <!-- Uma carta uma sequncia de elementos: --> <!-um destinatrio, um texto de abertura, um corpo --> <!-e um texto de fecho. --> <!ELEMENT CARTA (DEST, ABERTURA, CORPO, FECHO)> <!-- O destinatrio texto. --> <!ELEMENT DEST (#PCDATA)> <!-- A abertura texto. --> <!ELEMENT ABERTURA (#PCDATA)> 26 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos <!-- O corpo composto por um ou mais pargrafos. <!ELEMENT CORPO (PARA)+> <!-- Um pargrafo composto por texto podendo ter uma <!-- ou mais listas intercaladas. <!ELEMENT PARA (#PCDATA | LISTA)*> <!-- Uma lista uma sequncia de um ou mais items. <!ELEMENT LISTA (LITEM)+> <!-- Um item texto. <!ELEMENT LITEM (#PCDATA)> <!-- O fecho texto. <!ELEMENT FECHO (#PCDATA)> --> --> --> --> --> -->

Este DTD muito simples, contm apenas declaraes de elementos. Mesmo assim, permite escrever cartas estruturadas e ainda fazer a validao estrutural desses documentos. Contudo, est ainda um pouco distante de um DTD real que contm normalmente maior riqueza informativa.

Formalmente, pode-se dizer que um DTD composto por um conjunto de declaraes. Existem quatro tipos de declaraes que podem ser usadas num DTD: elementos, atributos, entidades e instrues de processamento. As entidades esto relacionadas com a organizao fsica de um documento XML, por isso iremos abord-las no prximo captulo (cap. ??). As instrues de processamento j foram descritas no captulo anterior (cap. 1). Nas prximas seces vamos analisar os outros tipos de declaraes elementos e atributos visto que, esses sim, esto relacionados com a organizao lgica de um documento, que a questo mais importante a discutir neste captulo.

2.2

Elementos

Um elemento denido, no DTD, numa declarao do tipo ELEMENT, que obedece seguinte estrutura:
<!ELEMENT identificador (expresso-contedo)> c FCA - EDITORA DE INFORMTICA 27

XML e XSL: da Teoria Prtica

Em que: identicador o nome do elemento, o qual depois usado nas anotaes:


DTD: <!ELEMENT

meu-elem (...)>

Instncia: ...<meu-elem>contedo do elemento</meu-elem>...

O identicador do elemento pode ser formado por letras, dgitos, dois pontos, hfens, underscores e pontos. Mas s pode comear por letra, underscore ou dois pontos. expresso-contedo a denio do contedo do elemento escrita numa linguagem de expresses regulares que obedece a uma lgebra ([?]). A expresso regular que dene o contedo do elemento especica que subelementos podem aparecer, em que ordem e em que nmero:
DTD: <!-- Um contacto composto por uma sequncia de: nome, email e telefone. --> <!ELEMENT contacto (nome,email,telefone)> Instncia: ... <contacto> <nome>contedo de nome</nome> <email>contedo de email</email> <telefone>contedo de telefone</telefone> </contacto> ...

Relativamente ao contedo, podemos classicar os elementos como pertencendo a um de cinco tipos possveis: vazio o elemento no dever ter qualquer contedo; este tipo de elementos tem apenas um valor posicional.
28 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos

textual o contedo do elemento apenas texto (com algumas restries). estruturado o contedo do elemento formado por uma combinao de outros elementos. misto o contedo do elemento texto no meio do qual podero surgir alguns elementos soltos. livre o contedo do elemento no tem qualquer restrio, pode ser uma mistura de texto com uma combinao qualquer de outros elementos denidos no DTD; este tipo de elementos ser usado apenas nos estados iniciais do desenvolvimento de uma aplicao. Vamos ento ver como se pode denir o contedo de um elemento, recorrendo lgebra de expresses regulares.

2.2.1

lgebra do contedo

Esta lgebra no mais do que um conjunto de denies com as quais podemos exprimir e denir a constituio de elementos num documento XML. Assim, vamos ter constantes para contedos atmicos, e um conjunto de combinadores e operadores para a denio de contedos estruturados e semi-estruturados (que designaremos globalmente por contedos compostos). Contedos atmicos Elementos vazios: a constante EMPTY Alguns elementos no tm contedo textual nem elementos lho. Designamos estes elementos por elementos vazios e usamos a palavra-chave EMPTY para denir o seu contedo. Por exemplo, suponhamos que estamos a criar um documento XML e, num dado ponto, queremos inserir uma imagem. Como no se pode inserir a imagem no meio do documento (a imagem no est em XML estamos a excluir as imagens SVG1 ),
Standard Vector Graphics- linguagem XML para a denio de imagens vectoriais de pequena e mdia resoluo.
1

c FCA - EDITORA DE INFORMTICA 29

XML e XSL: da Teoria Prtica

coloca-se um elemento marcando o local onde se quer inseri-la, com um apontador para o cheiro externo onde aquela se encontra armazenada. Tal elemento seria denido da seguinte forma:
<!ELEMENT imagem EMPTY>

Esta declarao faz saber ao processador de XML que imagem um elemento vazio e que, por isso, ser representado por uma nica anotao:

... O trajecto realizado encontra-se no mapa abaixo: <imagem path="../imagens/mapa.jpg"/> ...

Elementos textuais: a constante #PCDATA O contedo de elementos que so formados apenas por texto dene-se recorrendo palavra-chave #PCDATA (Parsed Character Data) que, como a expanso em ingls indica, analisado pelo processador do documento. Esta anlise necessria para expandir as referncias a entidades que possam existir nesse texto. H, no entanto, algumas restries aos caracteres que se podem usar: o carcter & no pode ser utilizado; em seu lugar dever ser colocada uma referncia entidade que o dene - &amp; o carcter < no pode ser utilizado; em seu lugar dever ser colocada uma referncia entidade que o dene - &lt; o carcter > no pode ser utilizado; em seu lugar dever ser colocada uma referncia entidade que o dene - &gt; O processador de XML encarrega-se, como j foi referido, de substituir as entidades pelos caracteres correspondentes.
30 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos

Exemplo 21: Caracteres reservados Suponha que, na pele de um professor, redigia um texto em XML sobre a avaliao de uma disciplina e, em determinada altura, necessitava de escrever:
...se a nota for > 8 e < 10 o aluno deve ser submetido a uma prova oral.

Para obedecer s restries impostas pelo XML o texto deveria ser escrito da seguinte forma:
...se a nota for &gt; 8 e &lt; 10 o aluno deve ser submetido a uma prova oral.

Tipicamente, um documento contm texto e embora, como veremos mais frente, possam surgir documentos XML especiais s com anotaes, esta a situao normal. Por isso, verica-se que elementos com contedo #PCDATA existem em praticamente todos os documentos XML. Por exemplo, para organizar simplesmente um dado texto em pargrafos, bastaria denir o seguinte elemento:
<!ELEMENT para (#PCDATA)>

e ento us-lo ao longo do dito texto para marcar o incio e o m de cada pargrafo, obtendo-se um documento estruturado com o seguinte aspecto:
... <para>Este livro tenta dar uma viso...</para> <para>No primeiro captulo, ...</para> ...

Note que #PCDATA o nico tipo de dados primitivo possvel, quando se usa um DTD para especicar a estrutura de um documento XML. Mesmo que haja elementos cujo contedo seja numrico ou temporal, eles tero de ser especicados como tendo contedo textual. Esta uma das limitaes de um DTD que os XML Schema resolvem, como iremos ver mais frente (cap. ??).
c FCA - EDITORA DE INFORMTICA 31

XML e XSL: da Teoria Prtica

Contedos compostos Elementos estruturados neste tipo de elementos que surge a lgebra para especicao de contedos. Um elemento deste tipo dene-se como uma combinao de outros elementos. Para denir estas combinaes, temos dois conjuntos de operadores: operadores de conexo e operadores de ocorrncia.

Operadores de conexo: Os operadores de conexo so normalmente colocados entre dois elementos e denem a ordem em que estes podem ocorrer ou combinar-se.

, operador de sequncia (a, b) signica que o elemento tem de ser composto por um elemento a e um elemento b, e que a deve preceder b. No exemplo 20, de uma carta, aparece logo no incio:
<!ELEMENT CARTA (DEST, ABERTURA, CORPO, FECHO)>

O que signica que uma carta , obrigatoriamente, constituda por um destinatrio, uma abertura, um corpo e um fecho, nesta ordem. A ordem sequencial imposta pelo operador ,. | operador de alternativa (a|b) signica que o elemento composto por um elemento a ou por um elemento b. Nesse mesmo exemplo 20, a declarao:
<!ELEMENT PARA (#PCDATA | LISTA)*>

signica que o contedo de PARA pode ser formado, alternativamente, por texto ou por subelementos LISTA.
32 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos

Operadores de ocorrncia: Os operadores de ocorrncia so aplicados a um termo (um elemento ou uma expresso de contedo, i. e., elementos ligados por operadores) e visam limitar o nmero de ocorrncias do termo ao qual so aplicados. ? (0 ou 1 vez) a? o elemento denido por esta expresso tem de ser constitudo por um elemento a, que opcional. * (0 ou mais vezes) a o elemento denido por esta expresso tem de ser constitudo por zero ou mais elementos a. + (1 ou mais vezes) a+ o elemento denido por esta expresso tem de ser constitudo por um ou mais elementos a. Elementos mistos Um elemento de contedo misto pode denir-se como um elemento textual, onde podem ocorrer livremente, entre o texto, alguns elementos previamente identicados. Num DTD, um elemento de contedo misto deve ser sempre denido como uma alternativa qual aplicado o operador de ocorrncia *. Os operandos da alternativa so #PCDATA e os elementos que podem ocorrer livremente no texto. A declarao de um elemento deste tipo tem a seguinte forma:
<!ELEMENT elem-misto (#PCDATA | elem1 | elem2 | ...)*>

Os elementos com contedo misto, ou semi-estruturados, so aqueles que mais problemas levantam a quem constri aplicaes baseadas em XML. No entanto, h situaes em que eles so mesmo necessrios e no possvel evit-los: normalmente em aplicaes de publicao electrnica onde o contedo dos documentos semi-estruturado. Um dos exemplos mais comuns o elemento pargrafo: constitudo por texto no meio do qual podem surgir livremente datas, nomes, ...
<!ELEMENT paragrafo (#PCDATA | data | nome)*> c FCA - EDITORA DE INFORMTICA 33

XML e XSL: da Teoria Prtica

Uma instncia deste elemento poderia ser:


... <paragrafo>E foi ento, <data>1150</data>, que D. <nome>Afonso Henriques</nome> se instalou ... </paragrafo> ...

Elementos livres: a constante ANY Os elementos deste tipo acabam por ser elementos de contedo misto onde, no meio do texto, pode aparecer livremente qualquer um dos outros elementos denidos no DTD, um nmero de vezes tambm livre. O contedo destes elementos denido pela palavra-chave ANY.

Exemplo 22: Elementos livres: a constante ANY Considere o seguinte DTD:


<!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT doc (para)+> nome (#PCDATA)> lugar (#PCDATA)> data (#PCDATA)> para ANY>

Neste DTD, dene-se um tipo de documentos com elemento raiz doc, composto por um ou mais elementos para. Por sua vez, o elemento para est denido como sendo de contedo ANY, ou seja, pode ser texto com elementos nome, lugar ou data pelo meio. De acordo com este DTD, o documento abaixo seria um documento XML vlido.
<?xml version="1.0" encoding="iso-8859-1"?> <doc> <para>Este o primeiro paragrfo.</para> 34 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos <para>Este um pargrafo com nomes. A <nome> Ana</nome> comeu a papa da <nome>Joana</nome>.</para> <para>Tudo aconteceu em <lugar>Braga</lugar>...</para> <para>O pargrafo anterior contm lugares.</para> </doc>

2.2.2

Exemplos: o DTD Agenda e o DTD Poema

Vamos, agora, aplicar, em dois exemplos, o que se acabou de descrever. Como j foi subtilmente referido, o XML serve para modelar informao rigidamente estruturada, semelhante quela que se guarda numa base de dados, ou, tambm, para modelar informao semi-estruturada onde os contedos mistos abundam. Os prximos exemplos visam ilustrar estas duas situaes. Como exemplo da primeira superclasse, informao estruturada, apresentamos a agenda de contactos. E, como exemplo do segundo caso, um poema.

Exemplo 23: A agenda No captulo 1, usou-se uma agenda de contactos para exemplicar alguns dos componentes de um documento XML. Agora, vai-se denir num DTD a estrutura de uma agenda. Uma agenda deste tipo , essencialmente, constituda por uma lista de entradas. Uma entrada pode ser simples, correspondendo a uma pessoa ou empresa, ou pode ser composta e, neste caso, corresponde a um grupo de pessoas ou empresas. De notar que num grupo podem, tambm, aparecer referncias a entradas ou grupos previamente denidos na agenda. A agenda poder conter um nmero livre de grupos aninhados. Cada entrada constituda pelos seguintes itens de informao: ident uma string que corresponder ao identicador nico de uma entrada ou grupo. tipo campo com dois valores possveis: pessoa ou empresa.
c FCA - EDITORA DE INFORMTICA 35

XML e XSL: da Teoria Prtica

nome nome da pessoa ou da empresa. email e-mail da pessoa ou empresa. telefone telefone da pessoa ou empresa. ref uma string contendo o identicador de uma entrada ou de um grupo previamente denido. Um exemplo possvel de um documento XML contendo uma agenda apresenta-se a seguir:
<AGENDA> <ENTRADA> <IDENT>e1</IDENT> <TIPO>pessoa</TIPO> <NOME>Jos Carlos Ramalho</NOME> <EMAIL>[email protected]</EMAIL> <TELEFONE>253 604479</TELEFONE> </ENTRADA> <GRUPO> <IDENT>epl</IDENT> <ENTRADA> <IDENT>e2</IDENT> <TIPO>pessoa</TIPO> <NOME>Pedro Henriques</NOME> <EMAIL>[email protected]</EMAIL> <TELEFONE>253 604469</TELEFONE> </ENTRADA> <ENTRADA> <IDENT>e3</IDENT> <TIPO>pessoa</TIPO> <NOME>Joo Saraiva</NOME> <EMAIL>[email protected]</EMAIL> <TELEFONE>253 604479</TELEFONE> </ENTRADA> <REF>e1</REF> </GRUPO> <ENTRADA> 36 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos <IDENT>e4</IDENT> <TIPO>pessoa</TIPO> <NOME>Jos Joo Almeida</NOME> <EMAIL>[email protected]</EMAIL> <TELEFONE>253 604433</TELEFONE> </ENTRADA> </AGENDA>

Um DTD para este tipo de documentos podia ser especicado com o conjunto de declaraes seguinte:

<!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT

AGENDA (ENTRADA | GRUPO)+> ENTRADA (IDENT, TIPO, NOME, EMAIL, TELEFONE)> GRUPO (IDENT,(ENTRADA | GRUPO | REF)+)> NOME (#PCDATA)> EMAIL (#PCDATA)> TELEFONE (#PCDATA)> IDENT (#PCDATA)> TIPO (#PCDATA)> REF (#PCDATA)>

Observe no DTD acima o uso dos operadores de conexo , e | e do operador de ocorrncia +, bem como o constructor constante #PCDATA. Note que a denio do elemento grupo recursiva, isto , um dos elementos do seu contedo pode ser novamente grupo. Em XML possvel denir estruturas lgicas recursivas.

No exemplo anterior, como j era previsto, no surgiu nenhum elemento de contedo misto. No prximo exemplo, a ideia pegar num documento tradicional (semi-estruturado) e especic-lo recorrendo a elementos de contedo misto.
c FCA - EDITORA DE INFORMTICA 37

XML e XSL: da Teoria Prtica

Exemplo 24: O poema Neste exemplo, vamos denir um DTD para um poema, mais especicamente para um soneto, da autoria de lvaro de Campos. Em termos de anotao, ser nossa inteno explicitar a estrutura (ttulo, autor, quadras, tercetos e versos), bem como marcar nomes de pessoas ou lugares e datas que possam surgir no contedo textual. A instncia devidamente anotada tem o seguinte aspecto:
<?xml version="1.0" encoding="iso-8859-1"?> <poema> <titulo>"Soneto J Antigo"</titulo> <autor>(lvaro de Campos)</autor> <corpo> <quadra> <verso>Olha, <nome>Daisy</nome>: quando eu morrer tu hs-de</verso> <verso>dizer aos meus amigos a de <lugar>Londres</lugar>,</verso> <verso>embora no o sintas, que tu escondes</verso> <verso>a grande dor da minha morte. Irs de</verso> </quadra> <quadra> <verso><lugar>Londres</lugar> pra <lugar>Iorque </lugar>, onde nasceste (dizes</verso> <verso>que eu nada que tu digas acredito),</verso> <verso>contar quele pobre rapazito</verso> <verso>que me deu horas to felizes,</verso> </quadra> <terceto> <verso>embora no o saibas, que morri...</verso> <verso>Mesmo ele, a quem eu tanto julguei amar,</verso> <verso>nada se importar... Depois vai dar </verso> </terceto> <terceto> <verso>a notcia a essa estranha <nome>Cecily</nome></verso> <verso>que acreditava que eu seria grande...</verso> 38 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos <verso>Raios partam a vida e quem l ande!</verso> </terceto> </corpo> <data>(1922)</data> </poema>

O DTD, que permitir validar esta instncia, pode ser concebido de forma mais especca para esta famlia de poemas ou, em termos mais genricos, para suportar qualquer tipo de poema. Neste caso, optmos por torn-lo mais especco e, ento, denimos um DTD para sonetos.
<!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT poema titulo autor corpo quadra terceto verso nome lugar data (titulo, autor, corpo, data) > (#PCDATA)> (#PCDATA)> (quadra,quadra,terceto,terceto)> (verso, verso, verso, verso)> (verso, verso, verso)> (#PCDATA|nome|lugar)*> (#PCDATA)> (#PCDATA)> (#PCDATA)>

Como foi dito, note-se que temos agora um elemento com contedo misto: verso. Este elemento, que corresponde ao contedo semi-estruturado do poema, est denido como uma mistura de texto com elementos nome e lugar. Se quisssemos tornar este DTD mais genrico, podamos redenir o elemento corpo da seguinte forma:
<!ELEMENT corpo (quadra|terceto)+>

Assim, o corpo do poema deixaria de ter de ser formado por duas quadras e dois tercetos e poderia ser formado por uma sequncia de quadras e tercetos ordenados livremente. Podamos ainda torn-lo mais genrico, fazendo as seguintes redenies:
<!ELEMENT corpo (estrofe)+> <!ELEMENT estrofe (verso)+> c FCA - EDITORA DE INFORMTICA 39

XML e XSL: da Teoria Prtica

Agora, um poema formado por uma sequncia de estrofes que, por sua vez, so formadas por uma sequncia de um ou mais versos. Este DTD dever dar para anotar qualquer tipo de poema. Ao longo desta generalizao, ganhou-se universalidade, mas perdeu-se riqueza semntica. A primeira verso garantia que um documento, que fosse vlido de acordo com esse DTD, teria a estrutura de um soneto. A ltima verso ainda garante que um soneto devidamente anotado um documento vlido, mas, alm disso, garante o mesmo para muitos outros poemas que no so sonetos. Fica aqui, ento, o aviso de que a generalizao pode ser perigosa pois implica perdas semnticas. O ideal termos o objectivo nal bem claro: neste caso se quisssemos processar sonetos por exemplo, vericar mtricas e rimas, das quadras e tercetos, optaramos pela primeira verso do DTD; se, por outro lado, quisssemos processar poemas num sentido mais lato, optaramos pela ltima verso.

2.3

Atributos

No captulo anterior (captulo 1), abordou-se o conceito de atributo e a sua relao com os elementos. Agora, vamos ver como que aqueles se podem declarar num DTD. Um dos exemplos da seco anterior foi a agenda de contactos (ex. 23). No DTD apresentado esto presentes as seguintes declaraes:
<!ELEMENT IDENT (#PCDATA)> <!ELEMENT TIPO (#PCDATA)> <!ELEMENT REF (#PCDATA)>

Na altura, foram todos denidos como elementos porque estvamos a utilizar apenas elementos na especicao do DTD. Agora, introduzindo os atributos, podemse questionar algumas das decises tomadas. Por exemplo, pensando bem, TIPO uma caracterstica do elemento ENTRADA e no um dos elementos do seu contedo; por isso pode passar a atributo (uma deciso sempre subjectiva por mais argumentos que se arranjem). Por seu lado, IDENT e REF devem ser vistos como um par pois
40 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos

com os seus valores que se monta um mecanismo de referenciao2 . Ora, para este m, existe no XML, um par de tipos de atributos, ID e IDREF que tm a eles associada a validao que garante que a referenciao est bem feita. Por este motivo, os elementos IDENT e REF deveriam, tambm, ser convertidos em atributos. Assim, substitumos aquelas declaraes iniciais pelas que se seguem:
<!ATTLIST ENTRADA IDENT ID #REQUIRED> <!ATTLIST GRUPO IDENT ID #REQUIRED> <!ATTLIST REFERENCIA REF IDREF #REQUIRED>

A primeira declarao associa um atributo de nome IDENT ao elemento ENTRADA, a segunda associa um atributo de nome IDENT ao elemento GRUPO e a terceira, associa um atributo de nome REF ao elemento REFERENCIA. Note que, neste ltimo, foi necessrio criar um elemento, REFERENCIA, ao qual pudesse ser associado o atributo REF. Uma vez que este novo elemento no ter qualquer outro contedo, seja ele texto ou elementos lho, declarado como um elemento vazio:
<!ELEMENT REFERENCIA EMPTY>

Depois destas alteraes, o DTD da agenda cou com o seguinte conjunto de declaraes:
<!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT AGENDA (ENTRADA | GRUPO)+> ENTRADA (NOME, EMAIL, TELEFONE)> GRUPO (ENTRADA | GRUPO | REFERENCIA)+> REFERENCIA EMPTY> NOME (#PCDATA)> EMAIL (#PCDATA)> TELEFONE (#PCDATA)>

<!ATTLIST ENTRADA IDENT ID #REQUIRED TIPO (pessoa|empresa) "pessoa">


Mecanismo atravs do qual podemos referir, ou chamar, num dado ponto do documento, um elemento denido noutro ponto, identicando-o sem ambiguidades, ou seja, univocamente.
2

c FCA - EDITORA DE INFORMTICA 41

XML e XSL: da Teoria Prtica <!ATTLIST GRUPO IDENT ID #REQUIRED> <!ATTLIST REFERENCIA REF IDREF #REQUIRED>

Apesar de ser uma deciso algo subjectiva, como se disse anteriormente, obtm-se uma denio do tipo de documento pretendido, um DTD, que muito mais preciso e conciso em termos do papel desempenhado por cada componente do sistema de anotao.

2.3.1

Declarao

A declarao de atributos num DTD tem a seguinte sintaxe:


<!ATTLIST elem-id att1-id ... attn-id

att1-tipo attn-tipo

att1-class att1-val-omissao attn-class attn-val-omissao

>

Onde: elem-id o identicador do elemento ao qual os atributos caro associados. atti-id o identicador do atributo i. atti-tipo o tipo do atributo i. atti-class a indicao da classe a que o atributo i pertence. atti-val-omisso a indicao do valor por omisso do atributo i. Como se pode ver pela estrutura acima, uma declarao ATTLIST pode servir para declarar todos os atributos de um elemento. Usar uma declarao deste tipo para todos ou declarar cada um por sua vez, s depende do gosto pessoal de quem escreve o DTD. Para exemplicar este ponto, apresenta-se a seguir um conjunto de declaraes para um elemento imagem.

Exemplo 25: Declaraes de atributos


42 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos

Se quisssemos especicar um elemento imagem com atributos ficheiro, largura e altura, podamos faz-lo da maneira seguinte:
<!ELEMENT imagem EMPTY> <!ATTLIST imagem ficheiro CDATA #REQUIRED largura CDATA #IMPLIED altura CDATA #IMPLIED >

ou, alternativamente:
<!ELEMENT imagem EMPTY> <!ATTLIST imagem ficheiro CDATA #REQUIRED> <!ATTLIST imagem largura CDATA #IMPLIED> <!ATTLIST imagem altura CDATA #IMPLIED>

Na primeira verso, os atributos so especicados numa nica declarao; na segunda, cada atributo especicado numa declarao. Ambas as verses so vlidas em XML, s dependem do gosto do analista.

2.3.2

Tipos

Os valores dos atributos podem ser mais do que simples strings, podem ter uma semntica mais especca. Por exemplo, um atributo pode ser declarado de modo a que o valor que a ele que associado seja nico, i. e., um identicador chave que pode ser usado para referenciar e localizar um elemento num documento. Em XML, existem dez tipos de atributo, que sero explicados a seguir: CDATA
c FCA - EDITORA DE INFORMTICA 43

XML e XSL: da Teoria Prtica

Enumerado ID IDREF IDREFS ENTITY ENTITIES NOTATION NMTOKEN NMTOKENS Apenas estes tipos so permitidos. Em XML, no h maneira de especicar que o valor de um atributo , por exemplo, do tipo inteiro ou data. Isto , no h tipos denidos pelo utilizador, nem tipos compostos. CDATA Este o tipo de atributo mais geral. O valor dum atributo deste tipo qualquer texto livre sem anotaes. Pode ser usado para muitas espcies diferentes de dados3 : preos, URLs, endereos de e-mail, e todas aquelas que no se enquadrarem num dos outros tipos. Os atributos do elemento imagem, no exemplo acima, so deste tipo. ID Um atributo do tipo ID deve conter um identicador (a obedecer s mesmas regras que o nome de um elemento ou atributo) que nico em todo o documento. Por outras palavras, no documento, no pode haver mais nenhum atributo deste tipo
Como iremos ver (cap. ??), os XML Schemas permitem denir tipos de dados mais apropriados para alguns destes casos.
3

44 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos

com o mesmo valor. Por sua vez, cada um dos elementos no pode ter mais do que um atributo deste tipo. Como a prpria palavra-chave sugere (ID), este tipo de atributos deve ser usado para associar identicadores nicos a elementos. Apesar de ser comum, basta olhar para o exemplo da agenda (ex. 23), os nomes dos atributos deste tipo no necessitam de ser obrigatoriamente chamados ID ou id, podendo ter nomes como: ident, entrada-i ou cdigo. No caso da agenda, h dois atributos deste tipo. Um associa um identicador nico a cada entrada. O outro associa um identicador nico a cada grupo.
<!ATTLIST ENTRADA IDENT ID #REQUIRED ... > <!ATTLIST GRUPO IDENT ID #REQUIRED>

IDREF Um atributo do tipo IDREF aponta para um atributo do tipo ID de outro elemento no documento. Este tipo de atributos , normalmente, usado para implementar relaes entre elementos, em que cada relao representada por um par de atributos ID/IDREF. As relaes podem ser simples de um para um ou de um para muitos, ou complexas de muitos para muitos. Como exemplo das primeiras, existe o problema tpico das referncias bibliogrcas: h um conjunto de registos bibliogrcos, em que cada registo tem a ele associado um atributo do tipo ID que o identica; sempre que se quer fazer referncia a um registo usa-se um elemento vazio com um atributo do tipo IDREF; desta maneira a relao estabelecida por um par ID/IDREF. No caso da agenda de contactos temos uma situao semelhante com as entradas e as referncias:
<!ATTLIST ENTRADA IDENT ID #REQUIRED> <!ATTLIST REFERENCIA REF IDREF #REQUIRED>

Uma instncia XML possvel seria:


c FCA - EDITORA DE INFORMTICA 45

XML e XSL: da Teoria Prtica

... <AGENDA> <ENTRADA IDENT="e1" TIPO="pessoa"> ... </ENTRADA> <GRUPO IDENT="epl"> <ENTRADA IDENT="e2" TIPO="pessoa"> ... </ENTRADA> <ENTRADA IDENT="e3" TIPO="pessoa"> ... </ENTRADA> <REFERENCIA REF="e1"/> <REFERENCIA REF="e5"/> </GRUPO> ... </AGENDA>

Nesta instncia, so utilizados dois elementos REFERENCIA que estabelecem relaes com elementos ENTRADA ou GRUPO usando um par de atributos ID/IDREF. A primeira REFERENCIA est correcta pois usa o valor e1 que existe como valor de um atributo IDENT associado a uma ENTRADA. A segunda, no entanto, est incorrecta pois o valor usado, e5, no existe na instncia. Esta situao ir provocar um erro na validao do documento. As relaes de muitos para muitos representam outra situao onde necessrio utilizar este tipo de atributos. Por exemplo: estamos a registar, no mesmo documento, informao sobre livros e informao sobre autores; um livro pode ter sido escrito por vrios autores e um autor pode ter escrito vrios livros. H duas solues para representar esta informao: com repetio de informao, colocando dentro da informao de cada livro a informao dos seus autores; ou sem repetio de informao, construindo dois blocos disjuntos de informao, autores e livros, e utilizando pares de atributos ID/IDREF para implementar a relao. Para alm do tipo CDATA, os pares ID/IDREF representam o tipo de atributos mais utilizado em documentos XML associados a um DTD.
46 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos

IDREFS O tipo IDREFS uma caracterstica til quando se pretende fazer referncia a mais do que um elemento. O valor do atributo deve ser constitudo por uma lista de identicadores separados por espao, identicadores esses que devem estar instanciados num atributo do tipo ID algures no documento. Considere o exemplo anterior dos livros e respectivos autores:
<!ELEMENT AUTOR ...> <!ATTLIST AUTOR id ID #REQUIRED> ... <!ELEMENT LIVRO ...> <!ATTLIST LIVRO autores IDREFS #REQUIRED>

Se quisssemos representar a informao referente ao presente livro, teramos:


... <AUTOR id="jcr">...</AUTOR> <AUTOR id="prh">...</AUTOR> ... <LIVRO autores="jcr prh"> ... </LIVRO> ...

Enumerado O tipo enumerado no utiliza uma palavra-chave como os outros tipos de atributo; em vez disso, oferece uma lista (ou enumerao) de valores possveis para esse atributo. Cada um dos valores possveis tem de ser um identicador XML (tem que seguir as mesmas regras que os identicadores de elementos). Voltando ao caso de estudo da agenda, imagine que agora queremos distinguir as entradas que dizem respeito a pessoas, empresas (entidades privadas) e instituies (entidades pblicas). Vamos faz-lo recorrendo a um atributo do tipo enumerado de nome tipo com valores possveis pessoa, empresa, e instituicao:
<!ELEMENT ENTRADA (NOME, EMAIL, TELEFONE)> c FCA - EDITORA DE INFORMTICA 47

XML e XSL: da Teoria Prtica

<!ATTLIST ENTRADA IDENT ID #REQUIRED TIPO (pessoa|empresa|instituicao) "pessoa">

Como se pode ver, a lista de valores possveis dene-se dentro de parntesis curvos com uma barra vertical a separar os valores. O valor por omisso, colocado entre aspas a seguir enumerao, dever ser um dos valores da lista e corresponde ao valor que ser assumido pelo processador caso o utilizador no atribua um valor ao atributo. Poderamos, ento, ter a seguinte instncia XML:
... <ENTRADA IDENT="e9" TIPO="empresa"> <NOME>Lavandaria Raio de Lua</nome> <EMAIL>[email protected]</EMAIL> <TELEFONE>253 610444</TELEFONE> </ENTRADA> ...

ENTITY Um atributo do tipo ENTITY pode conter como valor o nome de uma entidade (cap. ??) declarada algures no DTD. Por exemplo, o elemento ENTRADA podia ter uma fotograa (em formato JPEG ou outro), associada atravs de um atributo foto:
<!ELEMENT ENTRADA (NOME, EMAIL, TELEFONE)> <!ATTLIST ENTRADA IDENT ID #REQUIRED TIPO (pessoa|empresa|instituicao) "pessoa" FOTO ENTITY >

Se no DTD existisse uma entidade de nome paulo com a fotograa do Paulo Jos, podia usar-se este atributo para associar a entidade entrada:
48 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos ... <ENTRADA IDENT="e7" FOTO="paulo"> <NOME>Paulo Jos Bastos</nome> ... </ENTRADA> ...

Como poder concluir mais tarde, nem esta a maneira mais produtiva de associar imagens a documentos XML, nem este tipo de atributo muito usado, estando a ser discutida a sua permanncia na norma XML.

ENTITIES Um atributo do tipo ENTITIES contm o nome de vrias entidades declaradas algures no DTD. Imagine que estvamos a tratar documentos que continham apresentaes. Uma apresentao um conjunto de slides. Cada slide uma imagem declarada como uma entidade no DTD. Algures no documento, temos um elemento apresentacao com um atributo slides do tipo ENTITIES que indica a ordem pela qual os slides devero ser visionados:
... <apresentacao id="ap3" slides="slide2 slide5 slide6 slide7"/> ...

NOTATION Este o tipo de atributo menos utilizado e que, provavelmente, deixar de ser utilizado brevemente. O tipo NOTATION usado para associar um tipo de dados externo (normalmente binrio: gif, jpeg, mpeg, ...) a um determinado atributo ou elemento. Dada a sua pouca utilidade e utilizao, no prolongaremos mais a sua discusso.
c FCA - EDITORA DE INFORMTICA 49

XML e XSL: da Teoria Prtica

NMTOKEN Os valores de atributos deste tipo so identicadores no contexto do XML: so constitudos por uma nica palavra (no pode conter espaos); e podem ser uma mistura de letras, dgitos, hfens, underscores e pontos. Este tipo de atributo semelhante ao tipo ID (lexicamente) s que, em termos semnticos, no tem a restrio de unicidade. De qualquer modo, um dos tipos de atributo a cair rapidamente em desuso.

NMTOKENS Quando o valor de um atributo precisa de ser composto por uma lista de NMTOKEN separados por espao, usa-se este tipo. semelhana do anterior, um tipo a cair em desuso. Normalmente, utilizado em aplicaes onde se coloca a informao nos atributos em lugar de a colocar nos elementos. Como iremos ver quando estivermos a discutir o processamento de documentos XML, esta uma das situaes a evitar. Considere de novo o exemplo da agenda de contactos (ex. 23), e suponha que a cada entrada estar associada uma alcunha, para um tratamento mais pessoal. Em lugar de colocar essa informao num elemento, vamos coloc-la num atributo. Como uma alcunha pode ter mais do que uma palavra, vamos declarar este atributo com o tipo NMTOKENS:
<!ELEMENT ENTRADA (NOME, EMAIL, TELEFONE)> <!ATTLIST ENTRADA IDENT ID #REQUIRED ALCUNHA NMTOKENS TIPO (pessoa|empresa|instituicao) "pessoa" FOTO ENTITY>

A nica diferena entre este tipo e o CDATA so alguns sinais de pontuao que podem aparecer neste ltimo. Uma instncia de uma ENTRADA com alcunha poderia ser:
50 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos ... <ENTRADA IDENT="e7" ALCUNHA="trinca espinhas"> <NOME>Paulo Jos Bastos</nome> ... </ENTRADA> ...

2.3.3

Classes

A classe de um atributo interfere directamente com a tarefa de validao e de processamento, indicando qual o comportamento esperado do utilizador relativamente ao atributo: se o atributo opcional, se obrigatrio ou se tem um valor xo. A norma XML dene trs classes de atributos:

#IMPLIED O atributo opcional. Cada instncia do elemento ao qual o atributo est associado poder indicar ou no, explicitamente, um valor para o atributo. Caso no tenha um valor associado, o valor assumido ser indenido ou inexistente. Por exemplo, a prxima declarao especica dois atributos opcionais para o elemento imagem: a altura e a largura.
<!ATTLIST imagem altura CDATA #IMPLIED largura CDATA #IMPLIED>

#REQUIRED O atributo obrigatrio. Nenhum valor fornecido, mas o utilizador ter de providenciar um para cada instncia. Por exemplo, cada uma das entradas da agenda de contactos tem de ter um identicador e cada referncia tem de ter o atributo ref instanciado.
<!ATTLIST ENTRADA IDENT ID #REQUIRED> <!ATTLIST REFERENCIA REF IDREF #REQUIRED> c FCA - EDITORA DE INFORMTICA 51

XML e XSL: da Teoria Prtica

#FIXED O atributo constante e imutvel e o seu valor ser sempre o que estiver na declarao frente da palavra-chave #FIXED. Se o atributo for instanciado, ter de ser com um valor igual ao declarado. Caso no seja instanciado, o sistema de processamento assumir o valor declarado. Por exemplo, suponha que numa dada aplicao se pretende associar um tipo de dados mais forte a um dado elemento, i. e., pretende-se indicar que os dados armazenados no elemento so mais do que uma simples string. Neste caso, o elemento data ir armazenar datas e pretende-se indicar que o contedo do elemento mais do que uma string, uma data que segue um determinado formato. Como o DTD no tem um meio explcito para o fazer, vamos faz-lo recorrendo a um atributo com um valor por omisso #FIXED.
<!ELEMENT data ...> <!ATTLIST data tipo CDATA #FIXED "data">

Desta maneira, qualquer processador vai assumir que todos elementos data que aparecerem instanciados num documento tm um atributo tipo com o valor "data", podendo usar esse valor para parametrizar as aces que iro executar. Mais tarde, quando estivermos a discutir a transformao de documentos XML, iremos ver como tirar partido deste tipo de atributos. A indicao da classe na declarao de um atributo opcional. Se no for especicada as ferramentas de processamento trataro o atributo como se este pertencesse classe #IMPLIED.

2.3.4

Valores por omisso

Alm de especicar um tipo e uma classe para o atributo, uma declarao ATTLIST inclui tambm a especicao de um valor por omisso. O valor por omisso o valor que ser usado para aquele atributo se o utilizador no especicar um na instncia. O valor por omisso uma string. Por exemplo, e voltando agenda de contactos, tnhamos a seguinte declarao:
52 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos <!ATTLIST ENTRADA ... TIPO (pessoa|empresa|instituicao) "pessoa">

O atributo TIPO do tipo enumerado e da classe #IMPLIED, visto que nada indicado sobre a classe, e tem um valor por omisso que uma string, pessoa. Os outros tipos de atributo, como CDATA ou NMTOKEN, tambm podem ter um valor por omisso que tambm uma constante. Relativamente aos atributos no h muito mais a dizer. Muitas vezes, a dvida entre a declarao de um componente como atributo ou como elemento subsistir e s a prtica poder ajudar o utilizador na deciso.

2.4

Associao de um DTD a um documento

Depois de vermos como especicar um DTD, vamos agora discutir as vrias possibilidades que h para associar um DTD a um documento. Um documento XML completo tem de incluir uma referncia para o DTD com o qual tem de ser comparado. Esta referncia especicada no incio do documento atravs de uma declarao DOCTYPE:
<!DOCTYPE agenda SYSTEM "agenda.dtd">

Esta declarao especica que o elemento raiz do documento agenda e que o DTD pode ser encontrado no sistema no cheiro agenda.dtd. A indicao do nome do cheiro onde se encontra o DTD pode assumir a forma de um URL completo:
<!DOCTYPE agenda SYSTEM "http://xml.di.uminho.pt/DTDs/agenda.dtd">

Esta declarao no pode aparecer livremente num documento XML. Ela deve aparecer sempre aps a declarao XML e antes do elemento raiz. No caso da agenda teramos:
c FCA - EDITORA DE INFORMTICA 53

XML e XSL: da Teoria Prtica <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE agenda SYSTEM "agenda.dtd"> <AGENDA> ... </AGENDA>

A declarao DOCTYPE uma reminiscncia do passado, do SGML ([?, ?]). Como tal, a sua sintaxe difere um pouco da sintaxe usada no XML. Esta declarao pode ainda assumir uma outra forma que era muito comum no SGML: pode usar um catlogo e um sistema de identicadores pblicos para se referir ao DTD. No entanto, esse mecanismo foi praticamente colocado de lado no XML e a maioria dos processadores de XML trabalha com DTD referidos por um URL.

2.4.1

Redenio parcial de um DTD

A sintaxe da declarao DOCTYPE pode ser um pouco mais complicada. A declarao pode ter um bloco extra onde possvel redenir partes do DTD. A ideia subjacente a de que um DTD dene uma classe genrica de documentos e poder haver documentos nessa classe com necessidades especcas muito particulares que tenham de ser especicadas parte apenas para esse documento. O bloco de redenies surge no m entre parntesis rectos. Por exemplo, suponha que, no caso da nossa agenda de contactos, queremos acrescentar um campo extra opcional ao elemento ENTRADA, o URL:
<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE agenda SYSTEM "agenda.dtd" [ <!ELEMENT ENTRADA (NOME, EMAIL, TELEFONE, URL?)> <!ELEMENT URL (#PCDATA)> ]> <AGENDA> ... </AGENDA>

Nesta instncia de agenda, as entradas podero ter um URL associado. A redenio de um DTD pode ser levada ao extremo e, nesse caso, podemos denir completamente o DTD no bloco de redenies. Novamente, para a agenda teramos:
54 c FCA - EDITORA DE INFORMTICA

Documentos XML vlidos <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE agenda [ <!ELEMENT AGENDA (ENTRADA | GRUPO)+> <!ELEMENT ENTRADA (NOME, EMAIL, TELEFONE)> ... ]> <AGENDA> ... </AGENDA>

Note que, nesta situao, j no h indicao de onde procurar o DTD, pois este est completamente denido no bloco de redenies. Esta no a situao normal. Um DTD dene uma classe de documentos e, como tal, no deve car "agarrado" a uma instncia documental. No entanto, esta uma situao que poder ser til em determinadas circunstncias: quando estamos a desenvolver o DTD ou quando queremos enviar um documento com o respectivo DTD a algum (em vez de enviarmos dois cheiros e conarmos nos conhecimentos da pessoa para saber o que h-de fazer com eles, podemos enviar um s cheiro e, desta maneira, as ferramentas que iro processar o documento trataro da validao, sendo este processo transparente para o utilizador).

Neste captulo, descreveu-se a criao e a utilizao de um DTD. Um DTD serve para especicar a estrutura de um documento XML em termos das suas componentes lgicas. Um documento pode, no entanto, tambm estar organizado em termos fsicos e no ser o monobloco a que as pessoas esto habituadas. No prximo captulo, vamos ver quais os mecanismos disponveis em XML para organizar sicamente um documento.

c FCA - EDITORA DE INFORMTICA 55

XML e XSL: da Teoria Prtica

56 c FCA - EDITORA DE INFORMTICA

XML Path Language (XPath)

No captulo anterior, viu-se que as transformaes XSLT so determinadas pela estrutura lgica do documento XML (ADA) que se quer transformar e pelas templates na stylesheet XSLT. As expresses XPath includas nas templates so as responsveis pela denio de qual a template que aplicada a determinado nodo. Por isso, o XPath um assunto central que preciso dominar para se poder trabalhar com XSL. Em termos funcionais, a utilizao do Xpath em XSL pode ter uma srie de objectivos: Seleco de nodos para processamento; Especicao de condies permitindo diferentes modos de processamento de um mesmo nodo; Gerao de texto a ser includo na rvore nal (ADA resultante). Muitas das operaes envolvidas nestes objectivos envolvem escolhas baseadas no valor de um elemento, no valor de um atributo ou numa srie de outros factores. O XPath fornece-nos a funcionalidade para fazer aquelas escolhas numa sintaxe que no XML.
c FCA - EDITORA DE INFORMTICA 57

XML e XSL: da Teoria Prtica

O XPath uma sintaxe usada para descrever partes de um documento XML. Com o XPath, possvel referenciar o primeiro elemento aluno, o atributo regime de aluno, todos os elementos nome cujo contedo contm Jos e muitas outras variaes. Uma stylesheet XSLT usa expresses XPath em dois atributos, match e select, que esto associados a vrios elementos do XSLT e que permitem guiar a transformao do documento. O XPath foi desenvolvido para ser utilizado como valor de um atributo num documento XML. A sua sintaxe uma mistura da linguagem de expresses, normalmente utilizada noutras linguagens de programao (como 23 7 contador) com a linguagem para a especicao do caminho numa estrutura de directorias como a usada nos sistemas Unix ou Windows (como /poema/titulo). Adicionalmente, o XPath fornece ainda um conjunto de funes para manipulao de texto, Namespaces, e outras funcionalidades normalmente necessrias na transformao de um documento. Outro pormenor importante que preciso reter que o XPath trabalha com a verso do documento XML processada pelo parser, isto , as entidades no texto foram expandidas e as seces especiais de texto (CDATA) foram convertidas para texto. Assim, no h maneira de saber se um nodo textual na ADA estava no documento original como uma entidade ou uma seco CDATA.

3.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 sete tipos de nodos: o nodo raiz (um por documento); nodos elemento; nodos atributo; nodos texto; nodos comentrio; nodos instruo de processamento;
58 c FCA - EDITORA DE INFORMTICA

XML Path Language (XPath)

nodos namespace. Vamos reutilizar a seguinte instncia do poema (j apresentado no ex. 24), para exemplicar os vrios tipos de nodos:
<?xml version="1.0" encoding="iso-8859-1"?> <!-- Poema anotado de acordo com poema.xsd --> <poema tipo="soneto"> <titulo>"Soneto J Antigo"</titulo> <autor>(lvaro de Campos)</autor> <corpo> <quadra> <verso>Olha, <nome>Daisy</nome>: quando eu morrer tu hs-de</verso> <verso>dizer aos meus amigos a de <lugar>Londres</lugar>,</verso> <verso>embora no o sintas, que tu escondes</verso> <verso>a grande dor da minha morte. Irs de</verso> </quadra> <quadra> ... <terno> <verso>embora no o saibas, que morri...</verso> <verso>Mesmo ele, a quem eu tanto julguei amar,</verso> <verso>nada se importar... Depois vai dar </verso> </terno> <terno> ... </terno> </corpo> <data>(1922)</data> </poema>

3.1.1

Nodo raiz

Em XPath, o nodo raiz o nodo que contm o documento inteiro. No nosso caso, o nodo raiz contm o elemento poema, mas no o elemento soneto. Numa
c FCA - EDITORA DE INFORMTICA 59

XML e XSL: da Teoria Prtica

expresso XPath, o nodo raiz sempre representado por /. Ao contrrio dos outros nodos, o nodo raiz no tem um nodo pai e tem pelo menos um nodo lho, o nodo que representa o documento. O nodo raiz tambm pode conter comentrios e instrues de processamento que estejam fora do elemento que representa o documento. Na instncia do poema, h uma instruo de processamento de nome xml e um comentrio (posicionado antes do elemento poema) que esto nestas circunstncias e que so lhos do nodo raiz. O valor textual do nodo raiz corresponde concatenao de todos os nodos texto existentes na sua descendncia.

3.1.2

Nodos elemento

Todos os elementos no documento XML original so representados por um nodo. No caso do poema, a rvore ter nodos deste tipo para o elemento poema, titulo, autor, corpo, etc. Os lhos de um nodo elemento podem ser nodos texto, nodos elemento, nodos comentrio e nodos instruo de processamento que ocorrem nesse elemento no documento original. O valor textual de um nodo elemento a concatenao do texto deste nodo e de todos os seus lhos pela ordem em que estes aparecem no documento. Como j foi referido, todas as referncias a entidades foram expandidas; no se pode manipular entidades gerais ou carcter em XPath.

3.1.3

Nodos atributo

Um nodo atributo tem sempre um pai que um nodo elemento. No nosso exemplo, o nodo elemento correspondente ao elemento poema pai de um nodo atributo com nome tipo e valor soneto. Este tipo de nodos tem, no entanto, algumas funcionalidades distintas dos outros tipos de nodos: Apesar de um nodo elemento ser o pai dos seus nodos atributos, estes no so lhos do seu pai. Os lhos de um nodo elemento so os elementos texto, elemento, comentrio e instruo de processamento contidos no elemento correspondente do documento original. Se se quiser seleccionar os nodos atributo tem de se indicar explicitamente. Mais tarde veremos que tratar os
60 c FCA - EDITORA DE INFORMTICA

XML Path Language (XPath)

elementos e os atributos separadamente d jeito e o que normalmente se pretende fazer. Em circunstncias normais, o processador de XPath cria um nodo atributo para todos os atributos instanciados no documento original e para os atributos que tenham um valor por omisso declarado no DTD ou Schema (isto, claro, s se o processador tiver capacidade para analisar um DTD ou Schema).

3.1.4

Nodos texto

Os nodos texto so os mais simples, apenas contm o texto do elemento correspondente. Se no documento original existirem referncias a entidades estas sero resolvidas antes de o nodo ser criado, um nodo texto contm apenas texto puro. Alm disso, um nodo texto contm o mximo de texto possvel o que faz com que um nodo destes no tenha irmos do seu tipo na rvore documental.

3.1.5

Nodos comentrio

Um nodo comentrio tambm muito simples, contm apenas texto. O texto de um nodo comentrio contm todo o contedo do comentrio original excepto as marcas <!- e ->.

3.1.6

Nodos instruo de processamento

Um nodo instruo de processamento tem duas partes, um nome e um valor textual. O valor textual tudo o que aparece a seguir ao nome excepto a marca de fecho ?>.

3.1.7

Nodos namespace

Os nodos deste tipo raramente so utilizados nas folhas de estilo XSL. Estes nodos existem principalmente para benefcio do processador que tem de diferenciar elementos pertencentes a diferentes namespaces. As declaraes de namespaces nas instncias XML apesar de corresponderem tecnicamente a atributos, so tratadas em XPath como nodos do tipo namespace (uma declarao como:
c FCA - EDITORA DE INFORMTICA 61

XML e XSL: da Teoria Prtica

xmlns:autor="http://www.autor.pt", seria guardada num nodo do tipo namespace).

3.2

XPath como selector de nodos

Alguns comandos do XSLT utilizam um selector para seleccionar um nodo ou um conjunto de nodos que sero alvo de uma transformao. O selector uma expresso XPath e esta a utilizao mais comum do XPath em XSLT.

3.2.1

Contexto

Outro conceito importante em XPath o contexto. Tudo aquilo que se faz em XPath relativo ao contexto. Se estabelecermos uma analogia com um sistema de cheiros e directorias num sistema operativo como o Unix ou o Windows, o contexto corresponder directoria corrente. Nesta analogia, podemos ver a ADA como uma rvore de directorias e o contedo dos seus nodos como cheiros. Neste livro, o contexto um nodo da rvore documental abstracta a partir do qual uma expresso XPath avaliada. Quando se trabalha num sistema operativo, a maior parte das vezes, executam-se comandos na directoria corrente. O mesmo acontece em XSLT, muitas vezes, o selector corresponder ao contexto actual, o que permitir a sua supresso.

3.2.2

Selectores Simples

A seguir, descrevem-se alguns dos operadores mais simples que podem ser usados em expresses XPath: / no incio, selecciona o nodo raiz da ADA; no meio de uma expresso, funciona apenas como separador de dois nveis da rvore. . representa o contexto actual; selecciona o nodo corrente. .. selecciona o pai do nodo correspondente ao contexto actual.
62 c FCA - EDITORA DE INFORMTICA

XML Path Language (XPath)

Estes operadores podem combinar-se em expresses XPath mais complexas. Por exemplo: /poema/corpo/quadra esta expresso selecciona todos os nodos do tipo quadra que so lhos de nodos corpo, que so lhos do nodo poema (s h um, o elemento raiz do documento), que, por sua vez, lho do nodo raiz da ADA (/). ./verso/nome esta expresso selecciona todos os nodos do tipo nome que so lhos de nodos verso, que, por sua vez, so lhos do nodo corrente ou contexto actual. ../titulo esta expresso selecciona todos os nodos do tipo titulo que so lhos do nodo pai do nodo corrente ou contexto actual. Eis algumas expresses XPath, tendo como base de aplicao o poema, e uma breve descrio de cada uma: / Selecciona o nodo raiz da ADA que, no caso do poema, tem trs nodos lho: um nodo elemento (poema), um nodo instruo de processamento (contendo a declarao XML) e um nodo comentrio. /poema/corpo/quadra/verso Selecciona todos os versos das quadras.

3.2.3

Selectores Relativos e Selectores Absolutos

H dois tipos de expresses em XPath, absolutas e relativas. Uma expresso absoluta sempre iniciada pela indicao do nodo raiz da ADA: /. Uma expresso absoluta pode ser avaliada em qualquer momento mesmo quando o contexto actual no a raiz do documento. Uma expresso relativa aquela que tem em conta o contexto actual. H vantagens e desvantagens associadas a estes dois tipos de expresses. Enquanto uma expresso absoluta facilita a vida ao processador de XSL, tambm complica a vida ao programador dicultando a reutilizao. Para uma expresso relativa, podemos dizer exactamente o inverso. Esta questo ilustra-se com o exemplo seguinte.
c FCA - EDITORA DE INFORMTICA 63

XML e XSL: da Teoria Prtica

Exemplo 26: Expresses absolutas e expresses relativas Considere de novo a instncia do poema apresentada no incio do captulo e observe as seguintes expresses XPath:
(e1) (e2) /poema/corpo/quadra/verso verso

A primeira expresso absoluta e selecciona apenas os elementos verso que so lhos de elementos quadra que, por sua vez, so lhos de elementos corpo que tero de ser lhos do elemento principal poema. A segunda expresso relativa e vai seleccionar os elementos verso sempre que estes possam ser seleccionados, o que equivale a dizer que estes elementos sero seleccionados sempre que o contexto actual corresponder a um elemento quadra ou terno. Como veremos adiante a segunda expresso mais universal e se os versos das quadras e dos ternos tiverem de sofrer a mesma transformao, esta expresso permitir seleccion-los de uma s vez.

3.2.4

Seleccionar: para alm de elementos

At agora, o resultado das expresses utilizadas foi sempre um elemento ou um conjunto de elementos. Mas, como vimos atrs, um documento XML contm outras coisas para alm dos elementos. Nas seces seguintes, mostra-se como que se podem seleccionar e manipular essas outras entidades. Seleco de Atributos Para seleccionar um atributo, usa-se o carcter @ como prexo do nome do atributo. No nosso caso do poema, selecciona-se o tipo deste com a seguinte expresso: /poema/@tipo.
64 c FCA - EDITORA DE INFORMTICA

XML Path Language (XPath)

Se o contexto actual correspondesse ao nodo poema, a expresso de seleco podia ser reduzida seguinte expresso relativa: @tipo

Seleco do texto dum elemento Para seleccionar o contedo textual de um determinado elemento, preciso utilizar uma funo selectora do XPath de nome text() que devolve o contedo textual de um determinado nodo do tipo elemento (lembrar que, se o nodo ao qual a funo aplicada for um nodo intermdio, o texto devolvido corresponde concatenao do contedo de todos os nodos do tipo texto pertencentes sua descendncia). Eis algumas expresses possveis para o caso do poema: /poema/titulo/text() selecciona o contedo textual do ttulo do poema. /poema/text() selecciona o contedo textual do poema inteiro.

Seleco de Comentrios e Instrues de Processamento O XPath possui mais algumas funes de seleco, duas das quais permitem seleccionar nodos do tipo comentrio e nodos do tipo instruo de processamento: comment() e processing-instruction(). A utilizao destes selectores ser sempre muito espordica pois, normalmente, a informao colocada em comentrios ou instrues de processamento tem um m muito especco. Mas uma utilizao possvel seria a inteno de visualizar os comentrios no documento transformado. Voltando ao nosso caso de estudo: /comment() selecciona o comentrio inicial, que, como est fora do elemento principal poema, lho da raiz. /processing-instruction() selecciona a declarao XML.
c FCA - EDITORA DE INFORMTICA 65

XML e XSL: da Teoria Prtica

3.2.5

Selectores Complexos

Alm dos selectores j discutidos, o XPath possui quatro selectores mais complexos: * O selector representado pelo asterisco selecciona todos os elementos no contexto corrente. Este selector selecciona apenas nodos do tipo elemento. Nodos do tipo atributo, texto, comentrio e instruo de processamento no so seleccionados. @* A expresso composta pelo selector de atributo e pelo asterisco selecciona todos os atributos no contexto actual. node() A funo selectora node() selecciona todos os nodos no contexto actual independentemente do tipo. // A dupla barra de diviso, quando utilizada no meio de uma expresso XPath, indica que entre as duas barras podem ocorrer zero ou mais elementos. Por exemplo, a expresso "//verso" selecciona todos os versos do poema quer sejam lhos de quadra ou terno. A seguir apresentam-se alguns exemplos que usam combinaes dos vrios selectores apresentados: /poema/corpo/*/verso selecciona os versos independentemente de serem lhos de quadra ou terno. //nome selecciona todos os nodos elemento de nome "nome" em qualquer ponto da rvore documental. //@* selecciona todos os atributos de todos os nodos. //* selecciona todos os nodos do tipo elemento. //node() selecciona todos os nodos de qualquer tipo. //comment() selecciona todos os comentrios presentes no documento. //quadra/text() selecciona o contedo textual das duas quadras.
66 c FCA - EDITORA DE INFORMTICA

XML Path Language (XPath)

Com estes exemplos, encerra-se a primeira parte do XPath. A segunda parte, iniciase j na seco seguinte e introduz um conceito novo e importante: o eixo de navegao na rvore documental abstracta.

3.3

Eixos de Navegao

At agora, foi possvel seleccionar elementos, atributos, texto, comentrios, com algumas expresses XPath simples, na maioria dos casos, explorando a relao pailho entre elementos. No entanto, em muitas aplicaes, necessrio seleccionar nodos segundo uma perspectiva diferente, como por exemplo: Todos os nodos ancestrais do nodo corrente (o pai, o av, ...). Todos os nodos descendentes do nodo corrente. Todos os nodos irmos precedentes ( esquerda) ou sequentes ( direita) do nodo corrente. Para este tipo de selecces, o XPath disponibiliza um mecanismo que designaremos por eixo de navegao. Ao todo, o XPath tem treze eixos de navegao que se descrevem e ilustram com exemplos a seguir. Este conceito fulcral no XPath e conveniente que seja bem explicado. Para isso, podemos armar que qualquer expresso XPath usa uma determinada relao entre elementos para "encaminhar" a seleco ao longo duma rvore documental. a esta relao subjacente expresso que chamamos eixo de navegao. Nas expresses discutidas at ao momento, este conceito j estava presente, s que, uma vez que a relao utilizada era a de pailho, a mais comum, o XPath, permite-nos abreviar omitindo o eixo de navegao para este caso. Para se utilizar um eixo de navegao numa expresso XPath, indica-se o nome do eixo seguido de dois sinais de dois pontos (::) seguido do nome do elemento que se quer seleccionar. Por exemplo e atendendo ao ponto anterior sobre as expresses abreviadas, a expresso quadra/verso equivalente a child::quadra/child::verso.
c FCA - EDITORA DE INFORMTICA 67

XML e XSL: da Teoria Prtica

A seguir, listam-se os eixos de navegao disponveis no XPath, descrevendo-se sucintamente cada um deles: child Selecciona os lhos do nodo corrente. Como j foi dito, a omisso do eixo de navegao corresponde indicao implcita deste eixo. Nos nodos lho do nodo corrente esto includos os nodos elemento, comentrio, instruo de processamento e textuais. Os nodos do tipo atributo e namespace no so abrangidos pela seleco deste eixo. parent Selecciona o nodo pai do nodo corrente, se existir (se estivermos posicionados na raiz o resultado devolvido uma lista vazia de nodos). Este eixo pode ser abreviado com a utilizao do selector dois pontos (..). A expresso parent::verso e a expresso ../verso so equivalentes. self Selecciona o nodo corrente. Este eixo pode tambm ser abreviado com a utilizao do ponto (.). A expresso self::* e a expresso . so equivalentes. attribute Selecciona os atributos do nodo corrente. Se o nodo corrente no for do tipo elemento, o resultado ser uma lista vazia. Este eixo tambm pode ser abreviado com o selector de atributos j apresentado @. A expresso /poema/attribute::tipo e a expresso /poema/@tipo produzem o mesmo resultado. ancestor Selecciona todos os ancestrais do nodo (pai, av, ...) at raiz. ancestor-or-self Este eixo tem um comportamento igual ao anterior, s que lista resultante acrescenta o nodo corrente. descendant Selecciona todos os descendentes do nodo corrente (os lhos, os netos, ...). Como j vimos noutras situaes, so abrangidos por esta seleco os nodos do tipo elemento, comentrio, instruo de processamento e texto. Os nodos do tipo atributo e namespace no so abrangidos. descendant-or-self Este eixo tem um comportamento igual ao anterior, s que lista resultante acrescenta o nodo corrente. preceding-sibling Selecciona todos os irmos precedentes do nodo corrente. Por outras palavras, selecciona todos os nodos que tm o pai do nodo corrente e que aparecem antes do nodo corrente no documento XML. Se o nodo corrente for do tipo atributo ou namespace, o resultado ser uma lista vazia.
68 c FCA - EDITORA DE INFORMTICA

XML Path Language (XPath)

following-sibling Selecciona todos os irmos sequentes do nodo corrente. Por outras palavras, selecciona todos os nodos que tm o pai do nodo corrente e que aparecem depois do nodo corrente no documento XML. Se o nodo corrente for do tipo atributo ou namespace, o resultado ser uma lista vazia. preceding Selecciona todos os nodos que aparecem antes do nodo corrente no documento, excepto os nodos ancestrais e os nodos atributo e namespace. following Selecciona todos os nodos que aparecem depois do nodo corrente no documento, excepto os nodos descendentes e os nodos atributo e namespace. namespace Selecciona os nodos namespace do nodo corrente. Caso o nodo corrente no corresponda a um elemento, o resultado ser uma lista vazia. Nos restantes captulos do livro, surgiro exemplos prticos onde estes eixos de navegao sero utilizados para resolver problemas prticos. No entanto, cam aqui alguns exemplos didcticos de utilizao de expresses com eixos sobre o poema. Para cada expresso ei indicado o resultado ri .
(e1.1) /child::poema/child::corpo/child::quadra/child::* (e1.2) /poema/corpo/quadra/* (r1) so seleccionados, para cada quadra, todos os nodos filho

(e2.1) /poema/corpo/quadra/child::lugar (e2.2) /poema/corpo/quadra/lugar (r2) so seleccionados, para cada quadra, todos os nodos filho de nome lugar (e3.1) parent::lugar (e3.2) ../lugar (r3) sempre que o nodo corrente fr lugar, selecciona o nodo pai

c FCA - EDITORA DE INFORMTICA 69

XML e XSL: da Teoria Prtica (e4) quadra/ancestor::*

(r4) sempre que o nodo corrente fr quadra, selecciona os nodos ancestrais, o resultado a lista: [corpo,poema,/]

(e5)

quadra/preceding-sibling::*

(r5) se o nodo corrente fr a segunda quadra, o resultado ser a primeira quadra

(e6)

quadra/following-sibling::*

(r6) se o nodo corrente fr a segunda quadra, o resultado ser composto pelos dois ternos

Na prxima seco, vamos tratar outro dos conceitos fundamentais do XPath, os predicados. Estes vo permitir que o utilizador especique critrios de seleco muito especcos.

3.4

Predicados

Um predicado pode ser denido como um ltro que restringe os nodos seleccionados por uma expresso XPath. Os predicados so avaliados em tempo de execuo e do como resultado um valor booleano (verdadeiro ou falso). Se, para um determinado nodo, o resultado da avaliao do predicado for verdadeiro, esse nodo seleccionado. Em termos sintcticos, um predicado especicado dentro de parntesis rectos. Por exemplo:
//quadra/verso[2]

Esta expresso selecciona o segundo verso das quadras do poema. H vrias coisas, que se discutem a seguir, que podem surgir num predicado.
70 c FCA - EDITORA DE INFORMTICA

XML Path Language (XPath)

Nmeros Um predicado constitudo apenas por um nmero selecciona os nodos que tm essa posio particular. Por exemplo, a expresso
//quadra[1]/verso[2]

selecciona o segundo verso da primeira quadra do poema. Na realidade, este tipo de predicados corresponde a uma abreviatura do teste da posio do elemento. Sem abreviaturas a expresso acima seria:
//quadra[position()=1]/verso[position()=2]

Atributos Um predicado constitudo por uma seleco de atributo verdadeiro se esse atributo existir no elemento corrente. Eis alguns exemplos comuns:
/poema[@tipo] selecciona o poema mas s se este tiver o atributo tipo instanciado

//*[@*] selecciona qualquer elemento que tenha um qualquer atributo instanciado

Funes Um predicado pode conter invocaes de funes do XSLT (sero discutidas na prxima seco). Por exemplo:
quadra[last()] selecciona a ltima quadra do contexto corrente

verso[position() mod 2 = 0] selecciona os versos do contexto corrente que se encontram nas posies pares

Combinadores de predicados O XPath tem ainda alguns operadores que permitem combinar predicados. o caso dos operadores booleanos and e or e do operador de unio |. Eis alguns exemplos:
c FCA - EDITORA DE INFORMTICA 71

XML e XSL: da Teoria Prtica verso[(position() mod 2 = 0) or (position()=last())] verso[1|3]

Na prxima seco, depois de se apresentar algumas funes do XPath, apresentamse alguns predicados mais complexos.

3.5

Funes

At ao momento, possvel concluir que o XPath uma linguagem poderosa no que concerne seleco de nodos numa rvore documental abstracta. No entanto, existem expresses de seleco que no possvel especicar com os mecanismos discutidos at agora. Para essas situaes a norma prope a utilizao de algumas funes (quase todas implementadas nos processadores de XSL discutidos neste livro). As funes do XPath podem ser divididas em quatro categorias. A seguir apresentamse, para cada categoria, a lista de funes existentes juntamente com uma breve descrio. Funes para manipulao de listas de nodos Agrupamos nesta categoria as funes que realizao clculos sobre a rvore documental abstracta. position() D como resultado um nmero correspondente posio do nodo na rvore documental ou, no caso de estar a ser aplicada ao resultado duma operao de ordenao, a posio na lista ordenada. last() D como resultado um nmero correspondente ao total de nodos existentes no nvel da rvore do nodo corrente (se for usada num predicado permite seleccionar o ltimo nodo desse nvel uma vez que o nmero de nodos de um determinado nvel igual posio do ltimo nodo nesse nvel). count(xpath-exp) D como resultado o nmero de nodos seleccionados pela expresso XPath dada como argumento. Por exemplo:
count(//verso) conta o nmero de versos no poema

72 c FCA - EDITORA DE INFORMTICA

XML Path Language (XPath) count(//*) conta o nmero de elementos no poema count(quadra[1]/ancestor::*) conta o nmero de ancestrais da primeira quadra d o nvel da rvore em que a quadra se encontra

id(identicador) D como resultado o nodo que tem um atributo do tipo ID com valor igual a identificador. Funes para manipulao de strings Nesta categoria, esto as funes que permitem manipular texto. Como o utilizador experimentado poder constatar muitas delas so habituais nas linguagens de programao ou em sistemas operativos da famlia do Unix. concat(str1,str2,...) D como resultado uma string resultante da concatenao das vrias strings argumento. starts-with(str1,str2) Retorna um valor booleano verdadeiro se str1 comear por str2. contains(str1,str2) Retorna um valor booleano verdadeiro se str1 contiver str2. substring(str,num,comp) Retorna uma string que se extrai da string argumento comeando na posio num e de comprimento comp. substring-before(str1,str2) Retorna uma substring da primeira string argumento composta pelos caracteres anteriores primeira ocorrncia da segunda string argumento. substring-after(str1,str2) Retorna uma substring da primeira string argumento composta pelos caracteres posteriores primeira ocorrncia da ssegunda string argumento. string-length(str) Retorna o nmero de caracteres na string. normalize-space(str) Retorna a string argumento com o espao normalizado: so retirados os espaos do incio e do m, e, todas as sequncias de caracteres brancos no meio da string so substitudas por um nico espao em branco. translate(str1,str2,str3) Retorna a primeira string argumento (str1) com as ocorrncias de caracteres de str2 pelo respectivo carcter (na mesma posio) de str3.
c FCA - EDITORA DE INFORMTICA 73

XML e XSL: da Teoria Prtica

Funes booleanas Nesta categoria, agruparam-se as funes que produzem um resultado booleano como resultado. boolean(arg) Converte o argumento, que pode ser qualquer coisa, num valor booleano. not(bool-exp) Retorna o valor booleano inverso da expresso booleana argumento. true() Retorna o valor booleano verdadeiro. false() Retorna o valor booleano falso. lang(str) Retorna verdadeiro se a lngua do documento for igual lngua indicada no argumento. string(arg) Converte o seu argumento, que pode ser de qualquer tipo, numa string. Esta funo tem uma aplicao curiosa e til: quando aplicada a um elemento cujo contedo esteja vazio, devolve o valor booleano falso o que nos fornece uma maneira de testar elementos vazios. Funes numricas Por m, nesta categoria, agruparam-se as funes que nos permitem realizar clculos aritmticos com o contedo dos elementos. number(arg) Converte o seu argumento, que pode ser de qualquer tipo, num nmero. Se o argumento for omitido a funo aplicada ao nodo corrente. sum(xpath-exp) Retorna o resultado da soma da converso para nmero de todos os elementos seleccionados pela expresso argumento. Se um dos nodos tiver um contedo que no seja nmero o valor retornado NaN (Not a Number). oor(num) Retorna o maior inteiro menor ou igual ao argumento. ceiling(num) Retorna o inteiro mais pequeno que no menor que o argumento. round(num) Retorna o inteiro mais prximo do argumento.

3.6

Exemplos de expresses XPath

A seguir, apresenta-se uma lista de exemplos, onde se combinam todos os conceitos, operadores e funes discutidos at aqui. Nos exemplos que se seguem, no
74 c FCA - EDITORA DE INFORMTICA

XML Path Language (XPath)

consideramos nenhuma instncia XML em particular, por isso usamos nomes de elementos ctcios como AAA, BBB ou CCC. /AAA Selecciona o nodo lho da raiz com nome AAA. /AAA/CCC Selecciona nodos de nome CCC lhos do nodo principal AAA que lho da raiz. //BBB Selecciona todos os nodos de nome BBB existentes na rvore documental. //DDD/BBB Selecciona todos os nodos de nome BBB que sejam lhos de nodos DDD posicionados em qualquer ponto da rvore documental. /AAA/CCC/DDD/* Selecciona todos os nodos lhos de nodos DDD que, por sua vez, so lhos de nodos CCC que so lhos do nodo principal AAA que lho da raiz. /*/*/*/BBB Selecciona todos os nodos BBB posicionados no quarto nvel da rvore documental. //* Selecciona todos os nodos do tipo elemento existentes na rvore documental. /AAA/BBB[1] Selecciona o primeiro lho com nome BBB do nodo AAA que lho da raiz. /AAA/BBB[last()] Selecciona o ltimo lho de nome BBB do nodo AAA que lho da raiz. //BBB[@ident] Selecciona todos os nodos com nome BBB que tenham um atributo de nome ident instanciado. //BBB[@*] Selecciona todos os nodos com nome BBB que tenham pelo menos um atributo instanciado. //BBB[not(@*)] Selecciona todos os nodos com nome BBB que no tm nenhum atributo instanciado. //BBB[@ident=b1] Selecciona todos os nodos com nome BBB que tenham um atributo de nome ident instanciado com o valor b1.
c FCA - EDITORA DE INFORMTICA 75

XML e XSL: da Teoria Prtica

//BBB[normalize-space(@nome)=bbb] Selecciona todos os nodos com nome BBB que tenham um atributo de nome nome cujo valor normalizado (sem espaos no m e no incio e com as sequncias de caracteres brancos reduzidas a um espao em branco) seja igual a bbb. //*[count(BBB)=2] Selecciona todos os nodos da rvore documental que tenham exactamente dois lhos com nome BBB. //*[count(*)=2] Selecciona todos os nodos da rvore documental que tenham exactamente dois lhos. //*[name()= BBB] Selecciona todos os nodos da rvore documental com nome igual a BBB. //*[starts-with(name(), B)] Selecciona todos os nodos da rvore documental cujo nome se inicie por B. //*[contains(name(),C)] Selecciona todos os nodos da rvore documental cujo nome contenha o carcter C. //*[string-length(name())=3] Selecciona todos os nodos da rvore documental cujo nome seja constitudo por 3 caracteres. //*[string-length(name()) &lt; 3] Selecciona todos os nodos da rvore documental cujo nome seja constitudo por menos de 3 caracteres. //BBB | //CCC Selecciona todos os nodos na rvore documental com nome BBB ou CCC. /descendant::* Selecciona todos os nodos descendentes do nodo raiz. //CCC/descendant::* Selecciona todos os nodos descendentes de nodos com nome CCC. //CCC/descendant::*/DDD Selecciona todos os nodos descendentes de nodos com nome CCC e cujo nome seja DDD. Termina aqui este captulo sobre XPath. No prximo captulo, introduz-se a construo de folhas de estilo XSLT e veremos como e onde que o XPath se integra no processamento de um documento XML.
76 c FCA - EDITORA DE INFORMTICA

Você também pode gostar