Subject: Re: [xsl] Determining uniqueness based on mulitple element values From: Tim Lewis <lewist@xxxxxxxxxxx> Date: Mon, 16 Dec 2002 08:42:18 -0500 |
Joerg, This is the second time you've saved me. Thanks, Tim Joerg Heinicke wrote: > Hello Tim, > > the error is in your for-each loop. You use the != operator instead of > not(). > > preceding-sibling::car/make != 'Dodge' is true, if there exists *one* > <car>, which *is not* a Dodge. > > not(preceding-sibling::car/make = 'Dodge') is true if there exists *no* > car, which *is* a Dodge. > > Furthermore there is the problem that the comparisons for make, model > and year can be done to different cars. In the following example car 3 > will be filtered out, because a car exists with the same make and model > and another one with the same year: > > <car> > <make>Chevy</make> > <model>Malibu</model> > <year>1985</year> > </car> > <car> > <make>Dodge</make> > <model>Charger</model> > <year>1979</year> > </car> > <car> > <make>Chevy</make> > <model>Malibu</model> > <year>1979</year> > </car> > > Your code corrected and optimized can look like: > > <xsl:for-each select="carlist/dealership"> > <xsl:for-each select="car"> > <xsl:if test="not(preceding-sibling::car[make = current()/make and > model = current()/model and year = current()/year])"> > <tr> > <td> > <xsl:if test="position() = 1"> > <xsl:value-of select="../@name"/> > </xsl:if> > </td> > <td><xsl:value-of select="make"/></td> > <td><xsl:value-of select="model"/></td> > <td><xsl:value-of select="year"/></td> > </tr> > </xsl:if> > </xsl:for-each> > </xsl:for-each> > > I prefer the grouping via keys: > > <xsl:key name="cars" match="car" use="concat(../@name, make, model, year)"/> > > and later in the template: > > <xsl:for-each select="carlist/dealership"> > <xsl:for-each select="car[generate-id() = generate-id(key('cars', > concat(../@name, make, model, year)))]"> > <tr> > <td> > <xsl:if test="position() = 1"> > <xsl:value-of select="../@name"/> > </xsl:if> > </td> > <td><xsl:value-of select="make"/></td> > <td><xsl:value-of select="model"/></td> > <td><xsl:value-of select="year"/></td> > </tr> > </xsl:for-each> > </xsl:for-each> > > This is mostly simpler and faster. > > Regards, > > Joerg > > > <xsl:for-each select="carlist/dealership"> > > <xsl:for-each select="./car"> > > <xsl:choose> > > <xsl:when test="position() = 1"> > > <tr> > > <td><xsl:value-of select="../@name"/></td> > > <td><xsl:value-of select="./make"/></td> > > <td><xsl:value-of select="./model"/></td> > > <td><xsl:value-of select="./year"/></td> > > </tr> > > </xsl:when> > > <xsl:when test="./make != ./preceding-sibling::car/make or ./model > > != ./preceding-sibling::car/model or ./year != > > ./preceding-sibling::car/year"> > > <tr> > > <td></td> > > <td><xsl:value-of select="./make"/></td> > > <td><xsl:value-of select="./model"/></td> > > <td><xsl:value-of select="./year"/></td> > > </tr> > > </xsl:when> > > <xsl:otherwise /> > > </xsl:choose> > > </xsl:for-each> > > </xsl:for-each> > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Determining uniqueness ba, Joerg Heinicke | Thread | [xsl] dynamic table hading XSL-FO, Lee, Insoo |
RE: [xsl] APOSTROPHE in select="..., Jarno . Elovirta | Date | Re: [xsl] APOSTROPHE in select="..., David Carlisle |
Month |