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>
Download

Solução