Re: [xsl] First element with given attribute values

Subject: Re: [xsl] First element with given attribute values
From: Mukul Gandhi <mukulgandhi2003@xxxxxxxxxxx>
Date: Sun, 11 Apr 2004 15:29:33 +0100 (BST)
Hi Nicolas,
  This is a grouping problem. The following XSL is one
possible solution -

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml" version="1.0"
encoding="UTF-8" indent="yes"/>
<xsl:key name="x" match="foo"         
use="concat(@name,'+',@version)"/>

<xsl:template match="/root">
<root>
  <xsl:for-each select="foo">
    <xsl:if test="generate-id(.) =
generate-id(key('x', concat(@name,'+',@version))[1])">
      <xsl:copy-of select="." />
    </xsl:if>
  </xsl:for-each>
</root>
</xsl:template>

</xsl:stylesheet>

When the above XSL is applied to the XML -
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <foo name="a" version="1"/>
   <foo name="b" version="1"/>
   <foo name="a" version="1"/>
   <foo name="b" version="2"/>
   <foo name="c" version="1"/>
   <foo name="b" version="1"/>
   <foo name="b" version="1"/>
</root>

, the output received is -
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <foo name="a" version="1" />
  <foo name="b" version="1" />
  <foo name="b" version="2" />
  <foo name="c" version="1" />
</root>

Regards,
Mukul

 --- Nicolas Mailhot <Nicolas.Mailhot@xxxxxxxxxxx>
wrote: > Hi,
> 
>    I find that very often I end up with lists of
> elements like:
> 
> <foo name="a" version="1"/>
> <foo name="b" version="1"/>
> <foo name="a" version="1"/>
> <foo name="b" version="2"/>
> <foo name="c" version="1"/>
> <foo name="b" version="1"/>
> <foo name="b" version="1"/>
> 
>   Which I need to trim, keeping only the first
> element with an unique
> attibute value, or unique attribute values. For
> example, if I only
> wanted the first element with an unique name,version
> pair this would
> give :
> 
> <foo name="a" version="1"/>
> <foo name="b" version="1"/>
> <foo name="b" version="2"/>
> <foo name="c" version="1"/>
> 
> Is there a clean way to do it ?
> 
> <xsl:template match="foo[@name=./@name and
> @version=./@version][1]">
> 
> only matches the first
> 
> <foo name="a" version="1"/>
> 
> Cheers,
> 
> -- 
> Nicolas Mailhot
> 

> ATTACHMENT part 2 application/pgp-signature
name=signature.asc
 

________________________________________________________________________
Yahoo! India Matrimony: Find your partner online. http://yahoo.shaadi.com/india-matrimony/

Current Thread