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(_dot_)anderson(_at_)technique-group(_dot_)com>
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
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
--~------------------------------------------------------------------
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>
--~--