xsl-list
[Top] [All Lists]

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

2007-12-18 07:22:28


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


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--