GERÊNCIA DE DADOS SEMIESTRUTURADOS Nome:
Data: 03/10/2014
PROVA 001 – XML, DTD, XPATH e XQUERY
Considere o fragmento do documento XML a seguir, referente à “Acidentes de Trabalho por
Atividade Econômica (CNAE 2.0)”, de 2006 a 2012, registrados pela Previdência Social e
disponível no portal http://www.dados.gov.br:
<?xml version="1.0" encoding="ISO-8859-1"?>
<viewrecord>
<nodes>
<node>
<variavel
<variavel
<variavel
<variavel
<variavel
<variavel
<variavel
</node>
...
</nodes>
</viewrecord>
nome="Ano">2006</variavel>
nome="CNAE">9999:Ignorado</variavel>
nome="Motivo/Situação">Típico-Com Cat</variavel>
nome="Qte Acidentes">10941</variavel>
nome="Situação">Com Cat Registrada</variavel>
nome="GrupoCnae">IGNORADO</variavel>
nome="GrCnaeLetra">IGNORADO</variavel>
1. Escreva c o n s u l t a s X P a t h q u e : a ) a p r e s e n t e o c ó d i g o e n o m e ( ú n i c o ) d e
cada classe CNAE; b) apresente quantos anos são considerados no
documento XML; c) apresente quais anos são considerados. Inclua na
respostas o resultado (parcial) obtido com a consulta. DICA: pode usar
a função distinct-values() [ 1.0 ponto ].
a)
distinct-values(//variavel[@nome='CNAE'])
R:
9999:Ignorado 0111:Cultivo de Cereais 0112:Cultivo de Algodão Herbáceo
e de Outras...
b)
count(distinct-values(//variavel[@nome='Ano']))
R:
7
c)
distinct-values(//variavel[@nome='Ano'])
R:
2006 2007 2008 2009 2010 2011 2012
1 GERÊNCIA DE DADOS SEMIESTRUTURADOS 2. Utilizando uma expressão FLWOR, escreva u m a c o n s u l t a X Q u e r y q u e c r i e u m a
nova estrutura XML, em ordem alfabética decrescente de ano/CNAE,
conforme o modelo [ 2.0 pontos ].
MODELO RESULTADO:
<acidentes>
<acidente>
<ano> 2006</ano>
<cnae> 9999:Ignorado</cnae>
<motivo> Típico-Com Cat</motivo>
<qtde> 10941</qtde>
<situacao> Com Cat Registrada</situacao>
<grupoCnae>IGNORADO</grupoCnae>
<grCnaeLetra> IGNORADO </grCnaeLetra >
</acidente>
...
</acidentes>
R:
<acidentes> {
for $x in //node
order by $x/variavel[@nome='Ano'] descending,
$x/variavel[@nome='CNAE'] descending
return
<acidente>
<ano>{data($x/variavel[@nome='Ano'])}</ano>
<cnae>{data($x/variavel[@nome='CNAE'])}
</cnae>
<motivo>{data($x/variavel[@nome='Motivo/
Situação'])}</motivo>
<qtde>{data($x/variavel[@nome='Qte
Acidentes'])}</qtde>
<situacao>{data($x/variavel[@nome=
'Situação'])}</situacao>
<grupoCnae>{data($x/variavel[@nome=
'GrupoCnae'])}</grupoCnae>
<grupoCnaeLetra>{data($x/variavel[@nome=
'GrCnaeLetra'])}</grupoCnaeLetra>
</acidente>
} </acidentes>
2 GERÊNCIA DE DADOS SEMIESTRUTURADOS 3. Sobre o documento XML criado na questão 2, escreva c o n s u l t a s X P a t h q u e
apresentem as seguintes estatísticas: a) o total de acidentes
referentes ao CNAE 9700; b) a média de acidentes com situação “Sem
Cat Registrada”; c) Maior número de acidentes em um registro; d)
Quantidade de CNAEs com o menor número de acidentes. Apresente
também o resultado obtido com a consulta. [ 2.0 pontos ]. DICA: Use a
função contains(). Pode ser necessário mais de um XPath para
responder alguma pergunta.
a)
sum(//acidente[contains(cnae,"9700")]/qtde)
R: 228
b)
avg(//acidente[situação = "Sem Cat Registrada"]/qtde)
R: 224.23316498316498
c)
max(//qtde)
R: 41009
d)
min(../qtde)
count(distinct-values(//cnae[../qtde = 1]))
R: 536
4. Sobre o documento XML criado na questão 2, escreva c o n s u l t a s X P a t h q u e
apresentem: a) o total geral de registros sobre acidentes do ano 2012;
b) a quantidade total de acidentes com situação igual a “Com Cat
Registrada” no ano de 2006. Mostre os resultados [ 1.0 ponto ].
a)
count (//acidente[ano = 2012])
R: 2620
b)
sum(//acidente[situacao = "Com Cat Registrada" and ano =
"2006"]/qtde)
R: 3.730886E6
3 GERÊNCIA DE DADOS SEMIESTRUTURADOS 5. Sobre o documento XML criado na questão 2, escreva u m a c o n s u l t a X Q u e r y q u e
gere o resultado como uma tabela HTML, no formato indicado abaixo,
apresentando o total de acidentes a cada ano, por CNAE ordenado de
forma crescente [ 3.0 pontos ]. DICA: Primeiro (for) selecione cada
ocorrência de ano. Depois, selecione os CNAEs únicos daquele ano.
Em seguida, no (let), faça o agrupamento das quantidades. Ordene por
ano e CNAE. Só então, monte o resultado (tabela).
ANO
2012
...
CNAE
9999:Ignorado
...
QUANTIDADE
123.123
...
R:
<table border='1'>
<tr>
<td>Ano</td>
<td>CNAE</td>
<td>QUANTIDADE</td>
</tr> {
for $ano in distinct-values(//acidente/ano)
for $cnae in distinct-values(//acidente[ano =
$ano]/cnae)
let $acidente := //acidente[ano = $ano and cnae =
$cnae]
let $quantidade := sum(//acidente[ano = $ano and
cnae = $cnae]/qtde)
order by $ano, $cnae
return <tr>
<td>{data($ano)}</td>
<td>{data($cnae)}</td>
<td>{data($quantidade)}</td>
</tr>
}
</table>
Ano
2006
2006
2006
...
CNAE
0111:Cultivo de Cereais
0112:Cultivo de Algodão Herbáceo e de Outras
0113:Cultivo de Cana-De-Açúcar
...
QUANTIDADE
839
141
8081
...
4 GERÊNCIA DE DADOS SEMIESTRUTURADOS 6. Escreva u m a D T D p a r a v a l i d a r o a r q u i v o X M L g e r a d o n a q u e s t ã o 2 a c i m a
(não esqueça das cardinalidades) [ 1.0 ponto ].
<!ELEMENT acidentes (acidente+)>
<!ELEMENT acidente (ano, cnae, motivo, qtde, situacao, grupoCnae,
grCnaeLetra)>
<!ELEMENT ano (#PCDATA)>
<!ELEMENT cnae (#PCDATA)>
<!ELEMENT motivo (#PCDATA)>
<!ELEMENT qtde (#PCDATA)>
<!ELEMENT situacao (#PCDATA)>
<!ELEMENT grupoCnae (#PCDATA)>
<!ELEMENT grCnaeLetra (#PCDATA)>
As respostas devem ser colocadas em um arquivo texto, nomeado como PROVA001-BSI11SeuNome, o qual será enviado para o professor conforme instruções em sala.
Boa prova!
5 
Download

GERÊNCIA DE DADOS SEMIESTRUTURADOS