Duplicate XSLT Output

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • thomas

    Duplicate XSLT Output

    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:styleshe et
    version="1.0"
    xmlns:xsl="http ://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>

    <xsl:param name="text1" />

    <xsl:template match="/">

    <html>

    <head>
    <link rel="stylesheet " type="text/css" href="mystyle.c ss" />
    <title>Result s</title>
    </head>

    <body>

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

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

    <tr>
    <th class="head">Ar tist</th>
    <th class="head">So ng</th>
    <th class="head">Ch ord</th>
    <th class="head">Mi di</th>
    </tr>

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

    <tr>
    <td><xsl:appl y-templates select="./artist"/></td>
    <td><xsl:appl y-templates select="./song"/></td>
    <xsl:variable name="link1"><x sl:apply-templates
    select="./chord"/></xsl:variable>
    <td><a href="{$link1}" target="_blank" >view</a></td>
    <xsl:variable name="link2"><x sl: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:appl y-templates select="./artist"/></td>
    <td><xsl:appl y-templates select="./song"/></td>
    <xsl:variable name="link1"><x sl:apply-templates
    select="./chord"/></xsl:variable>
    <td><a href="{$link1}" target="_blank" >view</a></td>
    <xsl:variable name="link2"><x sl: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="javascrip t: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.t xt</chord>
    <midi>media/gerry_rafferty_-_baker_street.m id</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_junctio n.txt</chord>
    <midi>media/squeeze_-_up_the_junctio n.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>


  • Volkm@r

    #2
    Re: Duplicate XSLT Output

    thomas wrote:[color=blue]
    > 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)]">
    > [...][/color]

    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

    Comment

    Working...