xsl-list
[Top] [All Lists]

RE: [xsl] Filtering/Removing Truly Duplicate Elements

2007-07-18 12:09:55
Removing duplicates is essentially the same problem as grouping (you group
the elements and then output the first one in each group). So for XSLT 2.0
you can use xsl:for-each-group, or if you really have a very good reason to
stick with 1.0 you can use Muenchian grouping, see
http://www.jenitennison.com/xslt/grouping.

In 2.0 it's

<xsl:for-each-group select="//xs:element" group-by="concat(@name, '|',
@type)">
  <xs:element name="{current-group()[1]/@name}" 
              type="{current-group()[1]/@type}"/> 
</xsl:for-each-group>

Michael Kay
http://www.saxonica.com/ 

-----Original Message-----
From: Wasiq Shaikh [mailto:wasiq911(_at_)hotmail(_dot_)com] 
Sent: 18 July 2007 19:36
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Filtering/Removing Truly Duplicate Elements

Hello everyone,

I have searched everywhere for a similar problem but most 
problems are actually very simple with simple solutions. But 
the techniques are the same. 
Except I cant seem to put differenct peices together. When i 
run my XSL, the desired result is not desired! :)

The Objective:
Remove truly duplicate elements, not just by name but by its 
attributes and attribute values.

The Example:
I have an xml input file (which is actually an XSD) with 
various <xsd:element>'s which may have many attributes.
The attributes I care about are "name" and "type". Below is a 
sample input
file:

<xsd:element name="ABC" type="123" ... >
   <xsd:element name="def" type="456" .../>
   <xsd:element name="ghi" type="456" .../> </xsd:element>

<xsd:element name="ABC" type="456" ...>
   <xsd:element name="ghi">
      <xsd:element name="def" type="456" .../>
      <xsd:element name="def"/>
   </xsd:element>
   <xsd:element name="ABC"/>
   <xsd:element name="ABC"/>
   <xsd:element name="ghi" type="456" .../> </xsd:element>

The desired result should be a flat list of elements:

<uniqueElements>
   <element name="ABC"/>
   <element name="ABC" type="123"/>
   <element name="ABC" type="456"/>
   <element name="def"/>
   <element name="def" type="456"/>
   <element name="ghi"/>
   <element name="ghi" type="456"/>
</uniqueElements>

The order of the result doesn't matter. But understand that 
all those elements are distinctly unique. I'm using Xalan 
Java 2.7/XPath 1.0.

My XSL Logic:
Since i need a flat list i will interate through "//xsd:element".
So, for every element encountered, check to see if there are 
any elements before it with the same name, and same type.

Sounds simple enough! But it isn't. I cant get the right 
combination of conditional logic with correct XPath syntax to 
execute this task. Maybe this task can not be done at all? I 
would like to know first if I'm wasting my time trying to 
figure this out or if there is any hope.

Please help as I'm sure this will benefit anyone else wanting 
to do the same task. Thank you!

Wasiq Shaikh

_________________________________________________________________
Windows Live Hotmail. Even hotter than before. Get a better look now. 
www.newhotmail.ca?icid=WLHMENCA148


--~------------------------------------------------------------------
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>
--~--



--~------------------------------------------------------------------
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>
--~--