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

ML FULL - Computação UFCG