1º semestre
Mini‐Projecto 1
Entrega a 14 de Outubro de 2010 através do sistema IST/Fénix
Os dois URLs que se listam de seguida correspondem a dois documentos XML
codificando informação sobre programas de televisão. Note‐se que os dois
documentos XML codificam informação semelhante, embora de formas diferentes.
1.
http://gibson.tagus.ist.utl.pt/~bmartins/tv‐shows‐info.xml
2.
http://gibson.tagus.ist.utl.pt/~bmartins/new‐tv‐shows‐info.xml
Utilizando o software para processamento de documentos XML, introduzido nas aulas
de laboratório, resolva os seguintes exercícios práticos.
Exercício 1
Escreva o(s) documento(s) XSD (XML Schema Definition) que permite(m) validar o
documento XML de nome tv‐shows‐info.xml. Tenha em atenção que este documento
XML faz utilização de dois espaços de nomes diferentes (i.e., dois namespaces). Tenha
ainda em especial atenção os seguintes factos:
• O atributo score do elemento <review> deve ser um número real.
• Os atributos episodes dos elementos <director>, <actor> e <writer>
devem ser números inteiros positivos.
• Os elementos correspondentes aos criativos dos programas de televisão (e.g., os
elementos <directors>, <actors> ou <writers>) são opcionais e podem
ser apresentados em qualquer ordem.
• O conteúdo textual do elemento <sinopsis> têm um tamanho máximo de
10.000 caracteres.
• O conteúdo textual dos atributos period dos elementos <director>,
<actor> e <writer>, quando definidos, devem obrigatoriamente obedecer a
um padrão que corresponde a duas sequências de quatro algarismos separadas
pelo símbolo “-“ ou, em alternativa, a uma única sequência de quatro algarismos.
• O conteúdo textual dos atributos id dos elementos <director>, <actor> e
<writer>, caso estejam definidos, devem ser únicos dentro de cada elemento
<directors>, <actors> e <writers> (i.e., ao representar os programas de
televisão apenas se descreve cada actor, escritor ou realizador uma única vez).
• O atributo reviewer-id do elemento <author> é obrigatório e o seu
conteúdo corresponde sempre a um URL bem formado.
• O atributo sentiment-analysis do elemento <review> corresponde a
uma cadeia de caracteres com um de dois valores possíveis, “pos” ou “neg”.
• Os atributos position dos elementos <director>, <actor> e <writer>
são opcionais e, quando presentes, correspondem sempre a números inteiros.
• Para cada programa, o elemento <company> repete‐se no máximo 5 vezes.
Exercício 2
Usando o documento XML de nome tv‐shows‐info.xml, resolva as seguintes alíneas:
1.1 – Apresente expressões XPath que permitam responder às seguintes necessidades
de informação com base no documento XML:
a. Seleccionar o título de todas as séries onde “Chris Carter” escreveu pelo menos
um episódio ou onde “David Duchovny” participa como actor.
b. Seleccionar o nome dos criadores de todas as séries onde a média das
pontuações dadas pelos espectadores seja superior a 9.5.
c. Quais os criadores das séries de TV do género de comédia, cuja produção esteja a
cargo da empresa “20th Century Fox Television”.
1.2 – Apresente expressões XQuery FLWOR que permitam responder às seguintes
necessidades de informação com base no documento XML:
a. Retornar o título de todas as séries de TV em que um dos criadores seja também
o criador da série “The Simpsons”.
b. Retornar os realizadores distintos, ordenados pela pontuação média das reviews
para as suas séries de TV. O resultado da XQuery desenvolvida neste exercício
deve incluir os nomes dos diferentes realizadores, em conjunto com as
respectivas pontuações médias.
c. Para cada realizador distinto, retornar o número de séries de TV diferentes em
que ele estive envolvido (enquanto realizador), em conjunto com o número de
actores distintos com quem ele trabalhou. O resultado deve ser apresentado no
formato que se exemplifica abaixo, onde os nomes dos realizadores surgem por
ordem descendente do número de séries por si realizadas.
<directors>
<director name="David Nutter" num-shows="6" num-actors="1611"/>
<director name="Michael Zinberg" num-shows="5" num-actors="716"/>
<!-- lista de outros realizadores -->
</directors>
Exercício 3
Escreva uma XSLT para converter o documento XML de nome tv‐shows‐info.xml num
documento XHTML contendo uma tabela com os seguintes campos:
Show name Avg. score
Main writer
Lead actor
sinopsis
SHOW X
2.2
Writer Name
Actor Name
This show is
...
A XSLT que efectua a transformação para o formato XHTML deve seleccionar, do
documento XML de origem, apenas os programas de televisão associados à empresa
produtora “Imagine Entertainment”. Na coluna “Avg. score” deve‐se apresentar a
pontuação média das várias reviews feitas sobre cada programa. Nas colunas “Main
writer” e “Lead actor” deve‐se apresentar, respectivamente para cada show, os
escritores e os actores que estiveram envolvidos em mais episódios.
A XSLT deve ainda apresentar o nome do programa de televisão em maiúsculas e os
nomes dos actores e escritores de forma capitalizada (i.e., com a primeira letra de
cada palavra em maiúsculas). Finalmente, a coluna sinopsis deve apresentar um
resumo do programa de televisão com um máximo de 200 caracteres, colocando a
cadeira de caracteres “...” sempre que o texto original tiver de ser reduzido.
Exercício 4
Apresente uma expressão XQuery que aceda aos dados do documento XML com nome
new‐tv‐shows‐info.xml (i.e., o segundo documento XML de exemplo indicado no início
do enunciado deste mini‐projecto) e que produza como resultado um novo
documento XML que, codificando a mesma informação, seja bem formado e válido de
acordo com a XSD desenvolvida no Exercício 1.
A transformação deve preservar a informação original ao máximo. No entanto, todos
os elementos e atributos do formato XML original (i.e., a representação XML do
documento new‐tv‐shows‐info.xml) que contenham informação que não é usada no
formato definido pela XSD deverão ser ignorados aquando da transformação.
Exercício 5
Efectue a criação de uma base de dados XML através do software introduzido nas
aulas de laboratório (i.e., o Qizx). De seguida, efectue o carregamento dos dados
contidos no documento XML de nome tv‐shows‐info.xml, para a base de dados (BD).
Finalmente, apresente instruções XQuery Update para cada um dos seguintes casos:
1. Modificar o documento XML na BD por forma a remover os elementos e
atributos que são facultativos de acordo com a XSD desenvolvida no Exercício
1. Note‐se que uma solução 100% correcta para este exercício deve obter
dinamicamente os nomes dos elementos que são facultativos.
2. Modificar o documento XML na BD por forma a representar as pontuações de
review numa escala de 0 a 5, em lugar de numa escala entre 0 e 10.
3. Modificar o documento XML na BD por forma a que todos os nomes de actores,
escritores ou realizadores sejam apresentados em maiúsculas.
4. Modificar o documento XML na BD por forma a adicionar um novo elemento
XML que codifique a informação sobre o programa de televisão descrito na
seguinte tabela. Considere que todos os criativos (i.e., actores, escritores e
realizadores) estiveram envolvidos na totalidade dos episódios.
Nome do programa
Spartacus: Blood and Sand
Empresa produtora
Starz,
Criador
Steven S. DeKnight
Escritores
Aaron Helbing, Todd Helbing
Realizadores
Michael Hurst, Rick Jacobson
Actores
Andy Whitfield, Lucy Lawless, John
Hannah, Peter Mensah, Manu
Bennett
Período exibição
2010 ‐ 1 temporada apenas
Episódios
13
Sinopse
The series follows the life of the
historical figure of Spartacus
(played by Andy Whitfield), a
Thracian gladiator who from 73 to
71 BC led a major slave uprising
against the Roman Republic.
Género
Action, Drama, Historical
Entrega do mini‐projecto de Gestão e Tratamento de Informação
A resolução do mini‐projecto deve ser entregue via Fénix sob a forma de um ficheiro
com a extensão .zip, até às 07:59 do dia estipulado para a entrega (i.e., antes da aula
teórica da disciplina de Gestão e Tratamento de Informação).
O ficheiro .zip deve conter os ficheiros de texto com as soluções (e.g., documentos
XML, XSD, XSLT ou ficheiros de texto com as interrogações XPath/XQuery) para cada
uma das perguntas/alíneas individuais deste enunciado.
Na aula de teórica logo após a entrega electrónica, deve ainda ser entregue ao corpo
docente um relatório com a resolução das várias perguntas, segundo o template
fornecido na página da disciplina. O relatório deve ter uma folha de rosto ou um
cabeçalho identificando claramente qual o número do grupo e quais os números de
aluno dos 3 elementos do grupo. Para cada pergunta, e alem de listar a respectiva
solução para o problema, o relatório deve ainda indicar claramente qual o nome do
ficheiro que contem a sua resolução.
Não serão aceites trabalhos entregues via e‐mail, nem trabalhos onde o relatório
não obedece às regras estipuladas.
Resoluções para as perguntas do mini‐projecto 1
Pergunta 1
A solução desta pergunta envolve o desenvolvimento de dois documentos XML
Schema, um com os elementos XML correspondentes ao namespace com URL
http://gibson.tagus.ist.utl.pt/~bmartins/namespace‐reviews e outro com os elementos
do namespace http://gibson.tagus.ist.utl.pt/~bmartins/namespace‐tvshows.
Documento reviews.xsd
<?xml version="1.0" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews" xmlns:ns2="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews" xmlns:ns1="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows">
<xs:element name="text" type="xs:string"/> <xs:element name="author">
<xs:complexType mixed="true" >
<xs:attribute name="reviewer-id" type="xs:anyURI" use="required"/> </xs:complexType> </xs:element> <xs:element name="review"> <xs:complexType > <xs:sequence> <xs:element ref="ns2:author"/> <xs:element ref="ns2:text" /> </xs:sequence> <xs:attribute name="sentiment-analysis" > <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="pos"/> <xs:enumeration value="neg"/> </xs:restriction> </xs:simpleType> </xs:attribute>
<xs:attribute name="score" type="xs:double" use="required"/> </xs:complexType> </xs:element> <xs:element name="reviews"> <xs:complexType> <xs:sequence> <xs:element ref="ns2:review" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Documento tvshows.xsd
<?xml version="1.0" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows" xmlns:ns2="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews" xmlns:ns1="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows"> <xs:import namespace="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews" schemaLocation="exercicio1-2.xsd"/> <xs:element name="sinopsis"> <xs:simpleType >
<xs:restriction base="xs:string"><xs:maxLength value="10000"/></xs:restriction> </xs:simpleType> </xs:element> <xs:simpleType name="periodType"> <xs:restriction base="xs:string" > <xs:pattern value="[0-9]{4}(\-[0-9]{4})?"/> </xs:restriction> </xs:simpleType> <xs:element name="companies"> <xs:complexType> <xs:sequence>
<xs:element name="company” minOccurs="0" maxOccurs="5"> <xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/> <xs:attribute name="id" type="xs:anyURI"/>
</xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="creator"> <xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/> <xs:attribute name="id" type="xs:anyURI" use="required"/> </xs:complexType>
</xs:element>
<xs:element name="creators"> <xs:complexType>
<xs:sequence>
<xs:element ref="ns1:creator" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="directors"> <xs:complexType> <xs:sequence>
<xs:element ref="ns1:director" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence>
</xs:complexType>
<xs:unique name="directorId">
<xs:selector xpath=".//ns1:directors/*"/><xs:field xpath="@id"/> </xs:unique>
</xs:element>
<xs:element name="director"> <xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/> <xs:attribute name="position" type="xs:integer"/>
<xs:attribute name="episodes" type="xs:nonNegativeInteger"/> <xs:attribute name="period" type="ns1:periodType" />
<xs:attribute name="id" type="xs:anyURI" use="required" /> </xs:complexType>
<xs:element name="writers"> <xs:complexType>
<xs:sequence>
<xs:element ref="ns1:writer" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence>
</xs:complexType>
<xs:unique name="writerId">
<xs:selector xpath=".//ns1:writers/*"/><xs:field xpath="@id"/> </xs:unique>
</xs:element>
<xs:element name="writer"> <xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/> <xs:attribute name="position" type="xs:integer"/>
<xs:attribute name="episodes" type="xs:nonNegativeInteger"/> <xs:attribute name="period" type="ns1:periodType"/>
<xs:attribute name="id" type="xs:anyURI" use="required"/> </xs:complexType>
</xs:element>
<xs:element name="actors"> <xs:complexType>
<xs:sequence>
<xs:element ref="ns1:actor" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence>
</xs:complexType>
<xs:unique name="actorId">
<xs:selector xpath=".//ns1:actors/*"/><xs:field xpath="@id"/> </xs:unique>
</xs:element>
<xs:element name="actor"> <xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/> <xs:attribute name="position" type="xs:integer"/>
<xs:attribute name="episodes" type="xs:nonNegativeInteger" /> <xs:attribute name="period" type="ns1:periodType"/>
<xs:attribute name="id" type="xs:anyURI"/> </xs:complexType>
</xs:element>
<xs:element name="genres"> <xs:complexType>
<xs:sequence>
<xs:element name="genre minOccurs="0" maxOccurs="unbounded">
<xs:complexType><xs:attribute name="name" type="xs:string" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="tvshows"> <xs:complexType> <xs:sequence>
<xs:element name="tvshow" minOccurs="0" maxOccurs="unbounded"> <xs:complexType>
<xs:sequence>
<xs:element name="show-title" type="xs:string"/> <xs:element ref="ns1:companies"/>
<xs:element ref="ns1:creators"/>
<xs:choice minOccurs="0" maxOccurs="3">
<xs:element ref="ns1:directors" minOccurs="0" maxOccurs="1"/> <xs:element ref="ns1:writers" minOccurs="0" maxOccurs="1"/> <xs:element ref="ns1:actors" minOccurs="0" maxOccurs="1"/> </xs:choice>
<xs:element ref="ns1:sinopsis"/> <xs:element ref="ns1:genres"/>
<xs:element ref="ns2:reviews" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Pergunta 2.1.A
declare namespace ns = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows"; declare namespace ns2 = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews"; doc("http://gibson.tagus.ist.utl.pt/~bmartins/tv-shows-info.xml")//
ns:tvshow[.//ns:writer/@name="Chris Carter" or
.//ns:actor/@name="David Duchovny"]/ns:show-title/text()
Pergunta 2.1.B
declare namespace ns = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows"; declare namespace ns2 = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews"; doc("http://gibson.tagus.ist.utl.pt/~bmartins/tv-shows-info.xml")//
ns:tvshow[avg(.//ns2:review/@score) > 9.5]//ns:creator/data(@name)
Pergunta 2.1.C
declare namespace ns = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows"; declare namespace ns2 = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews"; distinct-values(doc("http://gibson.tagus.ist.utl.pt/~bmartins/tv-shows-info.xml")// ns:tvshow[.//ns:company/@name="20th Century Fox Television"
and .//ns:genre/@name="Comedy"]//ns:creator/@name)
Pergunta 2.2.A
declare namespace ns = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows"; declare namespace ns2 = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews"; let $doc := doc("http://gibson.tagus.ist.utl.pt/~bmartins/tv-shows-info.xml")
for $a in $doc//ns:tvshow[.//ns:show-title="The Simpsons"]//ns:creator for $b in $doc//ns:tvshow[.//ns:creator/@name=$a/@name]//ns:show-title return $b
Pergunta 2.2.B
declare namespace ns = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows"; declare namespace ns2 = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews"; let $doc := doc("http://gibson.tagus.ist.utl.pt/~bmartins/tv-shows-info.xml")
for $a in distinct-values($doc//ns:tvshow//ns:director/@name)
let $b := avg ( $doc//ns:tvshow[.//ns:director/@name=$a]//ns2:review/@score ) order by $b descending
return <director name="{$a}" score="{$b}" />
Pergunta 2.2.C
declare namespace ns = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows"; declare namespace ns2 = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews"; <directors>
{
let $doc := doc("http://gibson.tagus.ist.utl.pt/~bmartins/tv-shows-info.xml") for $a in distinct-values($doc//ns:director/@name)
let $c1 := count ( $doc//ns:tvshow[.//ns:director/@name = $a] ) let $c2 := count ( distinct-values (
$doc//ns:tvshow[.//ns:director/@name = $a]//ns:actor/@name)) order by $c1 descending
return <director name="{$a}" num-shows="{$c1}" num-actors="{$c2}" /> }
Pergunta 3
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows" xmlns:ns2="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews" version="2.0"> <xsl:template match="/"> <html> <head></head> <body> <table border="1"> <tr> <th>Show Name</th> <th>Avg Score</th> <th>Main Writer</th> <th>Lead Actor</th> <th>Sinopsis</th> </tr> <xsl:for-each select="/ns:tvshows/ns:tvshow[ns:companies/ns:company/@name = 'Imagine Entertainment']"> <tr> <td style="text-transform: uppercase;"> <xsl:value-of select="ns:show-title/text()"/> </td> <td><xsl:value-of select="sum(./ns2:reviews/ns2:review/@score) div count(./ns2:reviews/ns2:review)"/> </td> <td style="text-transform: capitalize;"> <xsl:for-each select="./ns:writers/ns:writer"><xsl:sort data-type="number" order="descending" select="@episodes"/> <xsl:if test="position()=1"> <xsl:value-of select="data(@name)"/> </xsl:if> </xsl:for-each> </td> <td style="text-transform: capitalize;"> <xsl:for-each select="./ns:actors/ns:actor">
<xsl:sort data-type="number" order="descending" select="@episodes"/> <xsl:if test="position()=1"> <xsl:value-of select="data(@name)"/> </xsl:if> </xsl:for-each> </td> <td>
<xsl:if test="string-length(string(./ns:sinopsis)) <= 200"> <xsl:value-of select="./ns:sinopsis/text()"/>
</xsl:if>
<xsl:if test="string-length(string(./ns:sinopsis)) > 200">
<xsl:value-of select="concat(substring(./ns:sinopsis/text(), 0, 200),'...')"/> </xsl:if> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Pergunta 4
<tvshows xmlns="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows" xmlns:ns2="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews"> { for $d in doc("http://gibson.tagus.ist.utl.pt/~bmartins/new-tv-shows-info.xml")//tvshow return <tvshow><show-title> { data($d/@title) } </show-title> <companies/>
<creators>{
for $i in $d//creative[./@title = "creator"]
return <creator name="{data($i/@name)}" id="{data($i/@id)}"/> }</creators>
<writers>{
for $o in $d//creative[./@title = "writer"]
return <writer name="{data($o/@name)}" id="{data($o/@id)}"/>} </writers>
<actors>{
for $o in $d//creative[./@title = "actor"]
return <actor name="{data($o/@name)}" id="{data($o/@id)}"/>} </actors>
<directors>{
for $o in $d//creative[./@title = "director"]
return <director name="{data($o/@name)}" id="{data($o/@id)}"/>} </directors>
<genres>{
for $p in $d//show-genre return <genre name="{ data( $p/@name ) }"/>} </genres>
<sinopsis>{$d//summary/text()}</sinopsis> <ns2:reviews>{
for $y in $d//review return
<ns2:review score="{$y/@score}" >
<ns2:author reviewer-id="{ $y/@reviewer-id }">{data($y/@reviewer-name)}</ns2:author>
<ns2:text> {$y/text()} </ns2:text> </ns2:review> }</ns2:reviews> </tvshow> } </tvshows>
Pergunta 5.1
declare namespace ns = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows"; declare namespace ns2 = "http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews"; let $e := for $d in (doc("tvshows.xsd") ,
doc("reviews.xsd"))
//xs:element[./@minOccurs = "0"] return ( $d/@ref , $d/@name ) let $a := for $d in (doc("tvshows.xsd") , doc("reviews.xsd"))
//xs:attribute[not(./@use = "required")] return ($d/@ref,$d/@name) for $ndn in (xs:string($e) , xs:string($a)) ,
$nd in collection("/")/doc("tv-shows-info.xml")//ns:tvshow//node() where local-name($ndn) = $nd
return delete node $t
Pergunta 5.2
declare namespace ns="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows"; declare namespace ns2="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews"; for $x in collection("/")/doc("tv-shows-info.xml")//ns2:review
Pergunta 5.3
declare namespace ns="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows"; declare namespace ns2="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews"; declare updating function local:converte-maiusculas( $nd ) {
replace value of node $nd with upper-case($nd) }; ( for $v in collection("/")/doc("tv-shows-info.xml")//ns:writers/ns:writer/@name return local:converte-maiusculas($v) , for $z in collection("/")/doc("tv-shows-info.xml")//ns:actors/ns:actor/@name return local:converte-maiusculas($z) , for $y in collection("/")/doc("tv-shows-info.xml")//ns:directors/ns:director/@name return local:converte-maiusculas($y) )
Pergunta 5.4
declare namespace ns="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-tvshows" declare namespace ns2="http://gibson.tagus.ist.utl.pt/~bmartins/namespace-reviews" for $x in collection("/")/doc("tv-shows-info.xml")//ns:tvshows return insert node <tvshow>
<show-title>Spartacus: Blood and Sand</show-title> <companies>
<company name="Starz"/> </companies>
<creators>
<creator name="Steven S. DeKnight"/> </creators>
<writers>
<writer name="Aaron Helbing" episodes="13" period="2010"/> <writer name="Todd Helbing" episodes="13" period="2010"/> </writers>
<directors>
<director name="Michael Hurst" episodes="13" period="2010" /> <director name="Rick Jacobson" episodes="13" period="2010"/> </directors>
<actors>
<actor name="Andy Whitfield" episodes="13" period="2010"/> <actor name="Lucy Lawless" episodes="13" period="2010"/> <actor name="John Hannah" episodes="13" period="2010"/> <actor name="Peter Mensah" episodes="13" period="2010"/> <actor name="Manu Bennett" episodes="13" period="2010"/> </actors>
<sinopsis>The series follows the life of the historical figure of Spartacus (played by Andy Whitfield), a Thracian gladiator who from 73 to 71 BC led a major slave uprising against the Roman Republic.</sinopsis>
<genres> <genre name="Action"/> <genre name="Drama"/> <genre name="Historical"/> </genres> </tvshow> as last into $x