Duplicate XSLT Output

Discussion in 'XML' started by thomas, May 3, 2005.

  1. thomas

    thomas Guest

    I'm building a guitar website which uses XML and XSLT.
    http://www.madtim67.com/guitar/index.html You can search either by artist or
    song. I used the <xsl:if test="contains(artist ,$text1)"> line which worked
    OK except now I get some duplicate output (go to the website and enter 'a'
    to see what I mean. I included a unique id node in my xml file to make every
    record unique. Is there a way that I can check the output the unique id
    field only once.



    Heres my XSL page

    <?xml version="1.0"?>

    <xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:eek:utput method="html"/>

    <xsl:param name="text1" />

    <xsl:template match="/">

    <html>

    <head>
    <link rel="stylesheet" type="text/css" href="mystyle.css" />
    <title>Results</title>
    </head>

    <body>

    <table class="three" align="center">

    <col width="35%"/>
    <col width="35%"/>
    <col width="15%"/>
    <col width="15%"/>

    <tr>
    <th class="head">Artist</th>
    <th class="head">Song</th>
    <th class="head">Chord</th>
    <th class="head">Midi</th>
    </tr>

    <xsl:for-each select="cat/links[contains(artist,$text1)]">

    <tr>
    <td><xsl:apply-templates select="./artist"/></td>
    <td><xsl:apply-templates select="./song"/></td>
    <xsl:variable name="link1"><xsl:apply-templates
    select="./chord"/></xsl:variable>
    <td><a href="{$link1}" target="_blank">view</a></td>
    <xsl:variable name="link2"><xsl:apply-templates
    select="./midi"/></xsl:variable>
    <td><a href="{$link2}" target="_blank">play</a></td>
    </tr>

    </xsl:for-each>

    <xsl:for-each select="cat/links[contains(song,$text1)]">

    <tr>
    <td><xsl:apply-templates select="./artist"/></td>
    <td><xsl:apply-templates select="./song"/></td>
    <xsl:variable name="link1"><xsl:apply-templates
    select="./chord"/></xsl:variable>
    <td><a href="{$link1}" target="_blank">view</a></td>
    <xsl:variable name="link2"><xsl:apply-templates
    select="./midi"/></xsl:variable>
    <td><a href="{$link2}" target="_blank">play</a></td>
    </tr>

    </xsl:for-each>

    </table>

    <div align="center">
    <a href="javascript:history.go(-1)">Click here to return to search page</a>
    </div>

    </body>

    </html>

    </xsl:template>

    </xsl:stylesheet>



    Heres my XML file

    <cat>
    <links>
    <id>00001</id>
    <artist>gerry rafferty</artist>
    <song>baker street</song>
    <chord>media/gerry_rafferty_-_baker_street.txt</chord>
    <midi>media/gerry_rafferty_-_baker_street.mid</midi>
    </links>
    <links>
    <id>00002</id>
    <artist>men at work</artist>
    <song>down under</song>
    <chord>media/men_at_work_-_down_under.txt</chord>
    <midi>media/men_at_work_-_down_under.mid</midi>
    </links>
    <links>
    <id>00003</id>
    <artist>squeeze</artist>
    <song>up the junction</song>
    <chord>media/squeeze_-_up_the_junction.txt</chord>
    <midi>media/squeeze_-_up_the_junction.mid</midi>
    </links>
    <links>
    <id>00004</id>
    <artist>steve harley</artist>
    <song>make me smile</song>
    <chord>media/steve_harley_-_make_me_smile.txt</chord>
    <midi>media/steve_harley_-_make_me_smile.mid</midi>
    </links>
    </cat>
     
    thomas, May 3, 2005
    #1
    1. Advertising

  2. thomas

    Volkm@r Guest

    thomas wrote:
    > I'm building a guitar website which uses XML and XSLT.
    > http://www.madtim67.com/guitar/index.html You can search either by artist or
    > song. I used the <xsl:if test="contains(artist ,$text1)"> line which worked
    > OK except now I get some duplicate output (go to the website and enter 'a'
    > to see what I mean. I included a unique id node in my xml file to make every
    > record unique. Is there a way that I can check the output the unique id
    > field only once.
    > [...]
    > <xsl:for-each select="cat/links[contains(artist,$text1)]">
    > [...]
    > <xsl:for-each select="cat/links[contains(song,$text1)]">
    > [...]


    Try

    <xsl:apply-templates
    select="cat/links[contains(artist,$text1)]|cat/links[contains(song,$text1)]/">

    instead of that duplicate "xsl:for-each" elements.

    Then, any element "cat/links[...]" should be matched just one time using

    <xsl:template
    match="cat/links[contains(artist,$text1)]|cat/links[contains(song,$text1)]">
    <tr>......................</tr>
    </xsl:template>

    --
    HTH
    Volkm@r
     
    Volkm@r, May 4, 2005
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Stylus Studio
    Replies:
    0
    Views:
    714
    Stylus Studio
    Aug 3, 2004
  2. Benjamin Hillsley
    Replies:
    3
    Views:
    1,700
    Dimitre Novatchev
    Sep 25, 2003
  3. ted
    Replies:
    1
    Views:
    641
    Laurens
    Jan 26, 2004
  4. Mad Scientist Jr
    Replies:
    1
    Views:
    540
    roy axenov
    Jul 20, 2007
  5. ppnair
    Replies:
    0
    Views:
    418
    ppnair
    Oct 11, 2012
Loading...

Share This Page