xsl-list
[Top] [All Lists]

Re: First element with given attribute values

2004-04-11 07:29:33
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(_dot_)Mailhot(_at_)laPoste(_dot_)net>
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[(_at_)name=(_dot_)/@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/