Very noob question about XSLT, I think

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • bladebuddy
    New Member
    • Jun 2010
    • 2

    #1

    Very noob question about XSLT, I think

    I am trying to organize the toy (sample) data set below, so that each year appears only once and each artist appears only once within each year. I've created the XSLT so that the year only appears once, but I don't know how to repeat that within the year for the artist. Can someone provide a clue?

    In the example, in 1987 Otis Redding should appear only once with both Titles listed. In 1995, Kenny Rogers should appear only once with both titles listed.

    === Current XSLT: Displays artists sorted by year ====
    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!-- Edited by XMLSpy® -->
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="cdlist" match="cd" use="year" /> 
    <xsl:template match="/">
      <html>
      <body>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th>Year</th>
            <th>Artist</th>
            <th>Title</th>
          </tr>
         <!-- Loop through the catalog year by year -->
         <xsl:for-each select="//cd[generate-id(.)=generate-id(key('cdlist', year))]"> 
         <!-- Sort by Year in ascending order -->
         <xsl:sort select="year" order="ascending"/>
         <!-- Display all cd entries for a given year -->
         <xsl:for-each select="key('cdlist', year)">
         <!-- Sort Primary Key by Artist name in ascending order -->
         <xsl:sort select="artist" order="ascending"/>
         <tr>
            <xsl:choose>
                 <xsl:when test="position()=1">
                     <td><xsl:value-of select="year"/></td>
                 </xsl:when>
                 <xsl:otherwise>
                     <td></td>
                 </xsl:otherwise>
            </xsl:choose>
            <td><xsl:value-of select="artist"/></td>
            <td><xsl:value-of select="title"/></td>
          </tr>
          </xsl:for-each>
          </xsl:for-each>
        </table>
      </body>
      </html>
    </xsl:template>
    </xsl:stylesheet>
    === Sample DataSet ===
    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!-- Edited by XMLSpy® -->
    <catalog>
    	<cd>
    		<title>Empire Burlesque</title>
    		<artist>Bob Dylan</artist>
    		<country>USA</country>
    		<company>Columbia</company>
    		<price>10.90</price>
    		<year>1985</year>
    	</cd>
    	<cd>
    		<title>Hide your heart</title>
    		<artist>Bonnie Tyler</artist>
    		<country>UK</country>
    		<company>CBS Records</company>
    		<price>9.90</price>
    		<year>1988</year>
    	</cd>
    	<cd>
    		<title>Greatest Hits</title>
    		<artist>Dolly Parton</artist>
    		<country>USA</country>
    		<company>RCA</company>
    		<price>9.90</price>
    		<year>1982</year>
    	</cd>
    	<cd>
    		<title>Still got the blues</title>
    		<artist>Gary Moore</artist>
    		<country>UK</country>
    		<company>Virgin records</company>
    		<price>10.20</price>
    		<year>1990</year>
    	</cd>
    	<cd>
    		<title>Eros</title>
    		<artist>Eros Ramazzotti</artist>
    		<country>EU</country>
    		<company>BMG</company>
    		<price>9.90</price>
    		<year>1997</year>
    	</cd>
    	<cd>
    		<title>One night only</title>
    		<artist>Otis Redding</artist>
    		<country>UK</country>
    		<company>Polydor</company>
    		<price>10.90</price>
    		<year>1998</year>
    	</cd>
    	<cd>
    		<title>Sylvias Mother</title>
    		<artist>Joe Cocker</artist>
    		<country>UK</country>
    		<company>CBS</company>
    		<price>8.10</price>
    		<year>1973</year>
    	</cd>
    	<cd>
    		<title>Maggie May</title>
    		<artist>Rod Stewart</artist>
    		<country>UK</country>
    		<company>Pickwick</company>
    		<price>8.50</price>
    		<year>1990</year>
    	</cd>
    	<cd>
    		<title>Romanza</title>
    		<artist>Andrea Bocelli</artist>
    		<country>EU</country>
    		<company>Polydor</company>
    		<price>10.80</price>
    		<year>1996</year>
    	</cd>
    	<cd>
    		<title>When a man loves a woman</title>
    		<artist>Percy Sledge</artist>
    		<country>USA</country>
    		<company>Atlantic</company>
    		<price>8.70</price>
    		<year>1987</year>
    	</cd>
    	<cd>
    		<title>Black angel</title>
    		<artist>Kenny Rogers</artist>
    		<country>EU</country>
    		<company>Mega</company>
    		<price>10.90</price>
    		<year>1995</year>
    	</cd>
    	<cd>
    		<title>1999 Grammy Nominees</title>
    		<artist>Many</artist>
    		<country>USA</country>
    		<company>Grammy</company>
    		<price>10.20</price>
    		<year>1999</year>
    	</cd>
    	<cd>
    		<title>For the good times</title>
    		<artist>Kenny Rogers</artist>
    		<country>UK</country>
    		<company>Mucik Master</company>
    		<price>8.70</price>
    		<year>1995</year>
    	</cd>
    	<cd>
    		<title>Big Willie style</title>
    		<artist>Joe Cocker</artist>
    		<country>USA</country>
    		<company>Columbia</company>
    		<price>9.90</price>
    		<year>1997</year>
    	</cd>
    	<cd>
    		<title>Tupelo Honey</title>
    		<artist>Van Morrison</artist>
    		<country>UK</country>
    		<company>Polydor</company>
    		<price>8.20</price>
    		<year>1971</year>
    	</cd>
    	<cd>
    		<title>Soulsville</title>
    		<artist>Joe Cocker</artist>
    		<country>Norway</country>
    		<company>WEA</company>
    		<price>7.90</price>
    		<year>1996</year>
    	</cd>
    	<cd>
    		<title>The very best of</title>
    		<artist>Cat Stevens</artist>
    		<country>UK</country>
    		<company>Island</company>
    		<price>8.90</price>
    		<year>1990</year>
    	</cd>
    	<cd>
    		<title>Stop</title>
    		<artist>Sam Brown</artist>
    		<country>UK</country>
    		<company>A and M</company>
    		<price>8.90</price>
    		<year>1988</year>
    	</cd>
    	<cd>
    		<title>Bridge of Spies</title>
    		<artist>T`Pau</artist>
    		<country>UK</country>
    		<company>Siren</company>
    		<price>7.90</price>
    		<year>1987</year>
    	</cd>
    	<cd>
    		<title>Private Dancer</title>
    		<artist>Tina Turner</artist>
    		<country>UK</country>
    		<company>Capitol</company>
    		<price>8.90</price>
    		<year>1983</year>
    	</cd>
    	<cd>
    		<title>Midt om natten</title>
    		<artist>Kim Larsen</artist>
    		<country>EU</country>
    		<company>Medley</company>
    		<price>7.80</price>
    		<year>1983</year>
    	</cd>
    	<cd>
    		<title>Pavarotti Gala Concert</title>
    		<artist>Luciano Pavarotti</artist>
    		<country>UK</country>
    		<company>DECCA</company>
    		<price>9.90</price>
    		<year>1991</year>
    	</cd>
    	<cd>
    		<title>The dock of the bay</title>
    		<artist>Otis Redding</artist>
    		<country>USA</country>
    		<company>Atlantic</company>
    		<price>7.90</price>
    		<year>1987</year>
    	</cd>
    	<cd>
    		<title>Picture book</title>
    		<artist>Simply Red</artist>
    		<country>EU</country>
    		<company>Elektra</company>
    		<price>7.20</price>
    		<year>1985</year>
    	</cd>
    	<cd>
    		<title>Red</title>
    		<artist>The Communards</artist>
    		<country>UK</country>
    		<company>London</company>
    		<price>7.80</price>
    		<year>1987</year>
    	</cd>
    	<cd>
    		<title>Unchain my heart</title>
    		<artist>Joe Cocker</artist>
    		<country>USA</country>
    		<company>EMI</company>
    		<price>8.20</price>
    		<year>1987</year>
    	</cd>
    	<cd>
    		<title>Another dock of the bay</title>
    		<artist>Otis Redding</artist>
    		<country>USA</country>
    		<company>Atlantic</company>
    		<price>7.90</price>
    		<year>1987</year>
    	</cd>
    </catalog>
    Last edited by Dormilich; Jun 18 '10, 10:09 AM. Reason: Please use [code] tags when posting code
  • jkmyoung
    Recognized Expert Top Contributor
    • Mar 2006
    • 2057

    #2
    There's a couple of ways. The easiest way to integrate with your current code is probably to make a second key:
    <xsl:key name="cdlist2" match="cd" use="concat(yea r,artist)"/>

    And then in place of the artist cell have:
    Code:
    <xsl:choose> 
         <xsl:when test="generate-id(.)=generate-id(key('cdlist2',concat(year,artist)))"> 
             <td><xsl:value-of select="artist"/></td> 
         </xsl:when> 
         <xsl:otherwise> 
             <td></td> 
         </xsl:otherwise> 
    </xsl:choose>

    Comment

    • bladebuddy
      New Member
      • Jun 2010
      • 2

      #3
      Originally posted by jkmyoung
      There's a couple of ways. The easiest way to integrate with your current code is probably to make a second key:
      <xsl:key name="cdlist2" match="cd" use="concat(yea r,artist)"/>

      And then in place of the artist cell have:
      Code:
      <xsl:choose> 
           <xsl:when test="generate-id(.)=generate-id(key('cdlist2',concat(year,artist)))"> 
               <td><xsl:value-of select="artist"/></td> 
           </xsl:when> 
           <xsl:otherwise> 
               <td></td> 
           </xsl:otherwise> 
      </xsl:choose>
      Perfect. Does exactly what I was asking for. Thanks.

      Comment

      Working...