Primeiro Trabalho Prático de GTI Resolução Exercício 1 Considere o seguinte conjunto de notícias extraído da versão HTML do Público Online: Jo rna l Públic o Online - Me dia e Te c no lo g ia - ht t p ://w w 2 .p ub lic o .c lix.p t / 0 7 /0 9 /2 0 0 7 - Pa s s a g e iro s da Air Fra nc e po de m ve r im a g e ns de s a té lite da s s ua s v ia g e ns - Via ja r de a viã o va i de ixa r de se r sinónim o de nã o ve r na da pe la ja ne la a té que se che ga à s im e dia çõe s do a e roporto. A Agê ncia Espa cia l Europe ia (ESA) juntou-se à Air Fra nce e va i ce de r im a ge ns de sa té lite pa ra ilustra r a lgum a s da s rota s da com pa nhia a é re a fra nce sa . (http://w w w .publico.clix .pt/show ne w s.asp?id= 1304319) 0 5 /0 9 /2 0 0 7 - No vo iPo d To uc h - A Apple a pre se ntou hoje a nova linha de iPods. A gra nde Tomando como exemplo o RSS da Figura 1, crie um documento XML que utilize RSS para codificar a informação apresentada acima. Defina ainda, utilizando XSD, um esquema XML para o dialecto RSS utilizado no ficheiro que criou. O esquema deve validar tanto o documento criado como o exemplo da Figura 1. Solução <?xml version="1.0"> <rss xmlns:xsi="" xsi::noNamespaceSchemaLocation="rss.xsd"> <channel> <title>Jornal Público</title> <link>http://www2.publico.clix.pt</link> <description>RSS Feed do Público Online</description> <language>PT</language> <item> <title>Passageiros da Air France podem ver imagens de satélite das suas viagens</title> <link>http://www.publico.clix.pt/shownews.asp?id=1304319</link> <description> Viajar de avião vai deixar de ser sinónimo de não ver nada pela janela até que se chega às imediações do aeroporto. A Agência Espacial Europeia (ESA) juntou-se à Air France e vai ceder imagens de satélite para ilustrar algumas das rotas da companhia aérea francesa.</description> <pubDate>07/09/2007</pubDate> </item> <item> <title>Novo iPod Touch</title> <link>http://www.publico.clix.pt/shownews.asp?id=1304178</link> <description>A Apple apresentou hoje a nova linha de iPods. A grande novidade é o iPod Touch, um modelo inspirado no iPhone, que apresenta um grande ecrã, bem como uma interface sensível ao toque e sem botões físicos.</description> <pubDate>05/09/2007</pubDate> </item> </channel> </rss> Resultado <xml version="1.0"> <xsd:schema xmlns:xsd="" elementFormDefault="qualified"> <xsd:element name="rss> <xsd:complexType> <xsd:sequence> <xsd:element name="channel"> <xsd:complexType> <xsd:sequence> <xsd:element name="title" type="xsl:string" /> <xsd:element name="link" type="xsl:anyURI"/> <xsd:element name="description" type="xsl:string"/> <xsd:element name="language" type="xsl:string"/> <xsd:complexType> <xsd:sequence> <xsd:element name="item" maxOccurs="unbounded"> <xsd:complexType> <xsd:element name="title" type="xsl:string"/> <xsd:element name="link" type="xsl:string"/> <xsd:element name="description" type="xsl:string" minOccurs="0" /> <xsd:element name="pubDate" type="xsl:string" minOccurs="0" /> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:complexType> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="version" type="xsd:string" /> </xsd:complexType> </xsd:element> Exercício 2 Explique nas suas palavras a lógica subjacente e indique o resultado, em termos de um documento XML, das seguintes expressões XQuery quando avaliadas sob o documento RSS da Figura 1. //title for $i in .//item where $i/pubDate() = "2002/5/23" return $i for $a in //channel/item $b in //channel/item where starts-with($a, substring($b,1,5)) return $a/title //channel/item/*[position()<2] Solução //title Selecciona todos os elementos title (i.e. elementos title) for $i in .//item where $i/pubDate() = "2002/5/23" return $i Retorna os elementos item com um elemento filho pubDate cujo conteúdo textual seja 2002/5/23 for $a in //channel/item $b in //channel/item where starts-with($a, substring($b,1,5)) return $a/title Faz o produto cartesiano entre todos os elementos item filhos de um elemento channel com todos os elementos item filhos de um elemento channel. Deste produto cartesiano, selecciona os elementos com um conteúdo textual em que os 5 primeiros caracteres são iguais. O resultado produzido contêm 13 elementos, tendo-se que as repetições correspondem às comparações de um elemento com ele próprio. Solução (cont.) //channel/item/*[position()<2] Selecciona o primeiro elemento filho de um elemento item, que por sua vez seja filho de um elemento channel Exercício 3 Tome como exemplo o ficheiro RSS da Figura 1. Escreva expressões XQuery que permitam recuperar a seguinte informação: Os títulos de todos os artigos de um dado feed RSS. A descrição do terceiro artigo de um dado feed RSS. O URL de um artigo cujo título seja "Title for article 2" ou "Title for article 3". Todos os artigos com a mesma data de publicação. O número de artigos contendo informação sobre a data de publicação. O título dos artigos com data de publicação entre 2001 e 2003. Solução Os títulos de todos os artigos de um dado feed RSS. for $a in doc('file:exemplo-rss.xml')//channel/item return $a/title <?xml version="1.0" encoding="UTF-8"?> <title xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Title for article 1</title> <title xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Title for article 2</title> <title xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Title for article 3</title> <title xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">This is the title for article 4</title> Solução A descrição do terceiro artigo de um dado feed RSS. let $doc := doc('file:exemplo-rss.xml') return $doc//channel/item[3]/description <?xml version="1.0" encoding="UTF-8"?> <description xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">This is the text associated with Article 3.</description> Solução O URL de um artigo cujo título seja "Title for article 2" ou "Title for article 3". for $a in doc('file:exemplo-rss.xml')//channel/item where $a/title = 'Title for article 2' or $a/title = 'Title for article 3' return $a/link <?xml version="1.0" encoding="UTF-8"?> <link xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">http://dei.ist.utl.pt/gti/Article2</link> <link xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">http://dei.ist.utl.pt/gti/Article3</link> Solução Todos os artigos com a mesma data de publicação. let $doc := doc('file:exemplo-rss.xml') for $a in $doc//channel/item, $b in $doc//channel/item where $a/pubDate eq $b/pubDate and $a/title ne $b/title return $a <?xml version="1.0" encoding="UTF-8"?> <item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <title>Title for article 3</title> <link>http://dei.ist.utl.pt/gti/Article3</link> <description>This is the text associated with Article 3.</description> <pubDate>2005/5/15</pubDate> </item> <item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <title>This is the title for article 4</title> <link>http://dei.ist.utl.pt/gti/Article4</link> <description>This is the text associated with Article 4.</description> <pubDate>2005/5/15</pubDate> </item> Solução O número de artigos contendo informação sobre a data de publicação. let $doc := doc('file:exemplo-rss.rss') return count($doc//channel/item[pubDate]) <?xml version="1.0" encoding="UTF-8"?>4 Solução O título dos artigos com data de publicação entre 2001 e 2003. for $a in doc('file:exemplo-rss.xml')//channel/item where starts-with($a/pubDate,'2001') or starts-with($a/pubDate,'2002') or startswith($a/pubDate,'2003') return $a/title <?xml version="1.0" encoding="UTF-8"?> <title xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Title for article 1</title> <title xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Title for article 2</title> Exercício 4 Escreva uma XSLT que permita transformar um feed RSS como o que se apresenta na Figura 1 num ficheiro HTML. O título da página HTML deverá corresponder ao título do canal RSS. De cada artigo deverá ser apresentado o título com um hiperlink para o URL original, a descrição do artigo e a data de publicação. Na resolução do exercício deverá constar o código XSLT e o resultado produzido pela transformação. Solução <?xml version="1.0"> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <head> <title><xsl:value-of select="rss/channel/title" /></title> </head> <body> <xsl:for-each select="rss/channel/item"> <div> <a><xsl:attribute name="href"><xsl:value-of select="link" /></xsl:attribute><xsl:value-of select="title" /></a> <br/> <xsl:value-of select="pubDate"/> <br/> <xsl:value-of select="description"/> <br/> </div> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet> Resultado <html> <head> <title>Example Articles for GTI Course</title> </head> <body> <div> <a href="http://dei.ist.utl.pt/gti/Article2">Title for article 2</a> <br/>2001/8/13<br/> <br/> </div> <div> <a href="http://dei.ist.utl.pt/gti/Article1">Title for article 1</a> <br/> 2002/5/23 <br/> This is the text associated with Article 1. <br/> </div> <div> <a href="http://dei.ist.utl.pt/gti/Article3">Title for article 3</a> <br/> 2005/5/15 <br/> This is the text associated with Article 3. <br/> </div> <div> <a href="http://dei.ist.utl.pt/gti/Article4">This is the title for article 4</a> <br/> 2005/5/15 <br/> This is the text associated with Article 4. <br/> </div> </body> </html> Exercício 5 Escreva uma XQuery que permita transformar um feed RSS como o que se apresenta na Figura 1 num ficheiro HTML. O título da página HTML deverá corresponder ao título do canal RSS. De cada artigo deverá ser apresentado o título com um hiperlink para o URL original, a descrição do artigo e a data de publicação. Os artigos deverão ainda ser ordenados por data de publicação. Na resolução do exercício deverá constar a expressão XQuery e o resultado produzido. Solução <?xml version="1.0" encoding="UTF-8"?> <html> <head> <title>{string(doc('file:example-doc.xml')//channel/title)} </title> </head> <body> { for $i in doc('file:example-doc.xml')//channel/item order by $i/pubDate return <div> <a href="{string($i/link)}">{string($i/title)}</a> <br/> {string($i/pubDate)} <br/> {string($i/description)} <br/> </div> } </body> </html> Resultado <?xml version="1.0" encoding="UTF-8"?> <html> <head> <title>Example Articles for GTI Course</title> </head> <body> <div> <a href="http://dei.ist.utl.pt/gti/Article2">Title for article 2</a> <br/>2001/8/13<br/> <br/> </div> <div> <a href="http://dei.ist.utl.pt/gti/Article1">Title for article 1</a> <br/>2002/5/23<br/>This is the text associated with Article 1.<br/> </div> <div> <a href="http://dei.ist.utl.pt/gti/Article3">Title for article 3</a> <br/>2005/5/15<br/>This is the text associated with Article 3.<br/> </div> <div> <a href="http://dei.ist.utl.pt/gti/Article4">This is the title for article 4</a> <br/>2005/5/15<br/>This is the text associated with Article 4.<br/> </div> </body> </html>