XML - Managing Data Exchange/XLink/Answers

XLink Chapter => XLink

XLink Exercises => Exercises

1) Movie Collection

edit

the Schema

edit
<?xml version="1.0" encoding="UTF-8"?>
<!--
    Document   : movies.xsd
    Created on : February 6, 2006
    Author     : Christina Serrano
    Modified   : Billy Timmins
-->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified"
            xmlns:xlink="http://www.w3.org/1999/xlink">
<xsd:element name="movieCollection">     
   <xsd:complexType>
      <xsd:sequence>
         <xsd:element name="movie" type="movieDetails" minOccurs="1" maxOccurs="unbounded"/>
         <xsd:element name="castMember" type="castDetails" minOccurs="1" maxOccurs="unbounded"/>
      </xsd:sequence>
   </xsd:complexType>
</xsd:element>
   <xsd:complexType name="movieDetails">
      <xsd:sequence>
         <xsd:element name="movieTitle" xlink:type="simple"/>
         <xsd:element name="movieSynopsis" type="xsd:string"/>
         <xsd:element name="role" type="roleDetails" minOccurs="1" maxOccurs="unbounded"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="roleDetails">
      <xsd:sequence>
         <xsd:element name="roleIDREF" type="xsd:IDREF"/>
         <xsd:element name="roleType" type="xsd:string"/>         
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="castDetails">
      <xsd:sequence>
         <xsd:element name="castMemberID" type="xsd:ID"/>
         <xsd:element name="castFirstName" type="xsd:string"/>
         <xsd:element name="castLastName" type="xsd:string"/>
         <xsd:element name="castSSN" type="ssnType" minOccurs="0"/>
         <xsd:element name="castGender" type="genderType"/>         
      </xsd:sequence>
   </xsd:complexType>
   <xsd:simpleType name="ssnType">
       <xsd:restriction base="xsd:string">
          <xsd:pattern value="\d{3}-\d{2}-\d{4}"/>
       </xsd:restriction>
   </xsd:simpleType>
   <xsd:simpleType name="genderType">
       <xsd:restriction base="xsd:string">
          <xsd:enumeration value="male"/>
          <xsd:enumeration value="female"/>
       </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>

the Document

edit
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="movies.xsl" type="text/xsl" media="screen"?>
<!--
    Document   : movies.xml
    Created on : February 6, 2006
    Author     : Christina Serrano
    Modified   : Billy Timmins
-->
<movieCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xlink="http://www.w3.org/1999/xlink" xsi:noNamespaceSchemaLocation="movies.xsd">
   <movie>
        <movieTitle xlink:href="http://www.imdb.com/title/tt0317248/"> City of God </movieTitle>
        <movieSynopsis>
          Youth gangs took over the slums of Rio de Janiero during the 1960s and didn't relinquish their 
          stronghold until the mid-1980s. Only a sucker wouldn't have turned to crime and this is exactly 
          how naive teen Rocket views himself. Rocket shoots all of the action with his weapon of choice, 
          a camera.
        </movieSynopsis>
        <role>
            <roleIDREF>ar1</roleIDREF>
            <roleType>Lead Actor</roleType>
        </role>
        <role>
            <roleIDREF>lf1</roleIDREF>
            <roleType>Lead Actor</roleType>
        </role>
        <role>
            <roleIDREF>kf1</roleIDREF>
            <roleType>Lead Actress</roleType>
        </role>   
   </movie>
   <movie>
        <movieTitle xlink:href="http://www.imdb.com/title/tt0395169/"> Hotel Rwanda </movieTitle>
        <movieSynopsis>
          Paul Rusesabagina, the manager of a European-owned hotel in Rwanda, created a secret refugee camp 
          for the Tutsi people during the brutal genocide committed against them by the Hutu people in 1994. His 
          efforts helped to save 1200 lives out of close to a million who were killed.
        </movieSynopsis>
        <role>
            <roleIDREF>dc1</roleIDREF>
            <roleType>Lead Actor</roleType>
        </role>
        <role>
            <roleIDREF>nn1</roleIDREF>
            <roleType>Supporting Actor</roleType>
        </role>
        <role>
            <roleIDREF>so1</roleIDREF>
            <roleType>Lead Actress</roleType>
        </role>             
   </movie> 
   <movie>
        <movieTitle xlink:href="http://www.imdb.com/title/tt0364725/"> Dodgeball </movieTitle>
        <movieSynopsis>
          The story's protagonist, Peter LaFleur, is a charismatic underachiever and proprietor of a rundown gym called
          Average Joe's. Peter's humble gym catches the eye of White Goodman, the power-mullet-sporting, Fu-Manchu-d, 
          egomaniacal owner of Globo Gym, a gleaming monolith of fitness. White intends to take over Average Joe's, and 
          Peter's non-existent bookkeeping is making it all too easy for him. The only way Peter can save Average Joe's 
          is a showdown dodgeball competition against Globo Gym.
        </movieSynopsis>
        <role>
            <roleIDREF>bs1</roleIDREF>
            <roleType>Lead Actor</roleType>
        </role>
        <role>
            <roleIDREF>ct1</roleIDREF>
            <roleType>Lead Actress</roleType>
        </role>
        <role>
            <roleIDREF>vv1</roleIDREF>
            <roleType>Lead Actor</roleType>
        </role>               
   </movie>
   <movie>
        <movieTitle xlink:href="http://www.imdb.com/title/tt0212338/"> Meet the Parents </movieTitle>
        <movieSynopsis>
          Greg Focker is head over heels in love with his girlfriend Pam, and is ready to pop the big question. 
          When his attempt to propose is thwarted by a phone call with the news that Pam's younger sister is 
          getting married, Greg realizes that the key to Pam's hand in marriage lies with her formidable father. 
        </movieSynopsis>
        <role>
            <roleIDREF>bs1</roleIDREF>
            <roleType>Lead Actor</roleType>
        </role>
        <role>
            <roleIDREF>tp1</roleIDREF>
            <roleType>Lead Actress</roleType>
        </role>
        <role>
            <roleIDREF>rd1</roleIDREF>
            <roleType>Lead Actor</roleType>
        </role>            
   </movie>
    <castMember>
        <castMemberID>ar1</castMemberID>
        <castFirstName>Alexandre</castFirstName>
        <castLastName>Rodrigues</castLastName>
        <castSSN>867-34-2949</castSSN>
        <castGender>male</castGender>       
    </castMember>
    <castMember>
        <castMemberID>lf1</castMemberID>
        <castFirstName>Leandro</castFirstName>
        <castLastName>Firmino da Hora</castLastName>
        <castSSN>839-59-8765</castSSN>
        <castGender>male</castGender>       
    </castMember>
    <castMember>
        <castMemberID>kf1</castMemberID>
        <castFirstName>Karina</castFirstName>
        <castLastName>Falcao</castLastName>
        <castSSN>987-34-2958</castSSN>
        <castGender>female</castGender>       
    </castMember>
    <castMember>
        <castMemberID>dc1</castMemberID>
        <castFirstName>Don</castFirstName>
        <castLastName>Cheadle</castLastName>
        <castSSN>849-39-4439</castSSN>
        <castGender>male</castGender>       
    </castMember> 
    <castMember>
        <castMemberID>nn1</castMemberID>
        <castFirstName>Nick</castFirstName>
        <castLastName>Nolte</castLastName>
        <castSSN>233-56-4309</castSSN>
        <castGender>male</castGender>       
    </castMember>  
    <castMember>
        <castMemberID>so1</castMemberID>
        <castFirstName>Sophie</castFirstName>
        <castLastName>Okonedo</castLastName>
        <castSSN>993-23-4958</castSSN>
        <castGender>female</castGender>       
    </castMember>
    <castMember>
        <castMemberID>rd1</castMemberID>
        <castFirstName>Robert</castFirstName>
        <castLastName>De Niro</castLastName>
        <castSSN>489-32-5984</castSSN>
        <castGender>male</castGender>       
    </castMember> 
    <castMember>
        <castMemberID>bs1</castMemberID>
        <castFirstName>Ben</castFirstName>
        <castLastName>Stiller</castLastName>
        <castSSN>590-59-2774</castSSN>
        <castGender>male</castGender>       
    </castMember>
    <castMember>
        <castMemberID>tp1</castMemberID>
        <castFirstName>Teri</castFirstName>
        <castLastName>Polo</castLastName>
        <castSSN>099-37-8765</castSSN>
        <castGender>female</castGender>       
    </castMember>  
    <castMember>
        <castMemberID>vv1</castMemberID>
        <castFirstName>Vince</castFirstName>
        <castLastName>Vaughn</castLastName>
        <castSSN>383-56-2095</castSSN>
        <castGender>male</castGender>       
    </castMember>      
    <castMember>
        <castMemberID>ct1</castMemberID>
        <castFirstName>Christine</castFirstName>
        <castLastName>Taylor</castLastName>
        <castSSN>309-49-4005</castSSN>
        <castGender>female</castGender>       
    </castMember>              
</movieCollection>

the Stylesheet

edit
<?xml version="1.0" encoding="UTF-8"?>
<!--
    Document   : movies.xsl
    Created on : February 6, 2006
    Author     : Christina Serrano
    Modified   : Billy Timmins
-->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xlink="http://www.w3.org/1999/xlink"
                exclude-result-prefixes="xlink"
                version="1.0">
    <xsl:key name="castList" match="castMember" use="castMemberID"/> 
    <xsl:output method="html"/>
    
    <xsl:template match="*[@xlink:type = 'simple' and @xlink:href]">
        <a href="{@xlink:href}">
            <xsl:apply-templates/>
        </a>
    </xsl:template>

    <xsl:template match="/">
        <html>
            <head>
                <title>Movie Collection</title>
            </head>
            <body>
                <h2>Movie Collection</h2>
                <xsl:apply-templates select="movieCollection"/>
            </body>
        </html>
    </xsl:template>
    
    <xsl:template match="movieTitle">
        <a href="{@xlink:href}">
            <xsl:value-of select="."/>
        </a>
    </xsl:template>  
    
    <xsl:template match="movieCollection">
        <xsl:for-each select="movie">
            <hr/>
            <br/>
            <b><xsl:text>Movie Title: </xsl:text></b>
            <xsl:apply-templates select="movieTitle"/>
            <br/>
            <br/>
            <b><xsl:text>Movie Synopsis: </xsl:text></b>            
            <xsl:value-of select="movieSynopsis"/>
            <br/>
            <br/>
            <b><xsl:text>Cast: </xsl:text></b>
            <br/>
            <xsl:for-each select="role">
                <xsl:value-of select="key('castList',roleIDREF)/castFirstName"/>
                 <xsl:text>   </xsl:text>
                <xsl:value-of select="key('castList',roleIDREF)/castLastName"/>               
                <xsl:text>,   </xsl:text>
                <xsl:value-of select="roleType"/>
                <br/>
                <xsl:value-of select="key('castList',roleIDREF)/castGender"/>
                <xsl:text>,   </xsl:text>
                <xsl:value-of select="key('castList',roleIDREF)/castSSN"/>
                <br/>
                <br/>
            </xsl:for-each>                     
        </xsl:for-each>       
    </xsl:template>
</xsl:stylesheet>



XLink Chapter => XLink

XLink Exercises => Exercises