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