Re: [xsl] Stuck with select distinct

Subject: Re: [xsl] Stuck with select distinct
From: "Jay Bryant" <jay@xxxxxxxxxxxx>
Date: Sat, 8 Nov 2008 11:35:51 -0600
Hi, Mark,

You can use multiple predicates, thus:
colours/colour[. != 'Red' and . != 'Blue'][. != 'FFFFFF'][not(. = preceding-sibling::colour)]


or a single joined predicate, thus:
colours/colour[. != 'Red' and . != 'Blue' and . != 'FFFFFF' and not(. = preceding-sibling::colour)]


I threw together the following transform to demonstrate:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>


<xsl:output method="xml" indent="yes"/>

 <xsl:template match="/">
   <colours>
     <xsl:apply-templates/>
   </colours>
 </xsl:template>

<xsl:template match="pages/page">
<xsl:copy-of select="colours/colour[. != 'Red' and . != 'Blue' and . != 'FFFFFF' and not(. = preceding-sibling::colour)]"/>
</xsl:template>


</xsl:transform>

and tested it with Saxon 6.

It produced the following:

<?xml version="1.0" encoding="utf-8"?>
<colours>

<colour>Green</colour>

<colour>Green</colour>

<colour>Green</colour>

</colours>

when run against your example (after I added an outside wrapper element to make it well-formed XML).

HTH

Jay Bryant


----- Original Message ----- From: "Mark Anderson" <mark.anderson@xxxxxxxxxxxxxxxxxxx>
To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Saturday, November 08, 2008 10:36 AM
Subject: [xsl] Stuck with select distinct



Hi All


I'm trying to get a list of distinct items from an XML. I've done this many times using a predicate containing a preceding axis, but this one has got me stumped:

<page>
       <front_back>F</front_back>
       <page_no>1</page_no>
       <colours>
               <colour>Red</colour>
               <rgb>00FFFF</rgb>
               <colour>Green</colour>
               <rgb>00FF00</rgb>
               <colour>Blue</colour>
               <rgb>FFFF00</rgb>
       </colours>
</page>
<page>
       <front_back>F</front_back>
       <page_no>2</page_no>
       <colours>
               <colour>Green</colour>
               <rgb>FFFFFF</rgb>
       </colours>
</page>
<page>
       <front_back>F</front_back>
       <page_no>3</page_no>
       <colours>
               <colour>Green</colour>
               <rgb>00FF00</rgb>
       </colours>
</page>

I need to return a nodeset with a list of DISTINCT colour nodes, that I can then process in a for-each element.

The other conditions for selection are:

   colour is not Red or Blue
   rgb value is not FFFFFF


I somehow need to combine the following predicates (I think)


   colours/colour[. != 'Red' and . != 'Blue']
   colours/rgb[. != 'FFFFFF']
   colours/colour[not(. = preceding-sibling::colour)]

I'm stuck with XSL 1.0 and would like to avoid using keys if possible

Any suggestions greatly appreciated

Regards

Mark

Current Thread