Re: [xsl] Removing duplicates where duplicates are determined by the concatenation of two elements

Subject: Re: [xsl] Removing duplicates where duplicates are determined by the concatenation of two elements
From: David Carlisle <davidc@xxxxxxxxx>
Date: Tue, 18 Dec 2007 14:21:45 GMT
I think you just want to use for-each-group

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  

<xsl:template match="persons">
<xsl:copy>
<xsl:for-each-group select="person" group-by="concat(surname,':',first_name)">
  <xsl:text>&#10;</xsl:text>
  <xsl:copy-of select="."/>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>


 saxon9 per.xml per.xsl
<?xml version="1.0" encoding="UTF-8"?><persons>
<person>
<surname>Per</surname><first_name>Hansen</first_name>
</person>
<person>
<surname>Per</surname><first_name>Olsen</first_name>
</person>
<person>
<surname>Jan</surname><first_name>Hansen</first_name>
</person>
<person>
<surname>Ole</surname><first_name>Pedersen</first_name>
</person>
<person>
<surname>jan</surname><first_name>Fredriksen</first_name>
</person>
<person>
<surname>Arne</surname><first_name>Jensen</first_name>
</person></persons>




If you are making variables you normally don't want to do 

   <xsl:variable name="persons">
                                               <xsl:for-each select="//person">
                                                               <xsl:copy-of select="."/>
                                               </xsl:for-each>
                               </xsl:variable>
which is very expensive (// causes a search of the entire document, and
<xsl:copy-of causes all  the elements to be copied
You could use
<xsl:variable name="persons" select="persons/person"/>
to seelct the original elements, not copies.

David

Current Thread