change
<xsl:when test="local-name()='c'">
<xsl:if test="not(@x=1)">
to
<xsl:when test="local-name()='c'">
<xsl:if test="not(@x=1) and (not (d) or d[(_at_)x<7])">
however why match on * and then have a big xsl:choose switch, especially
one using local-name() It's almost always better to use
<xsl:when test="self::c">
rather than
<xsl:when test="local-name()='c'">
and in this case you could just use template matching which would make
it much easier to swap new filters in or out:
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- empty templates for filters -->
<xsl:template match="c[(_at_)x=1 or not(*[not(self::d[(_at_)x>=7)] ])]"/>
<xsl:template match="d[(_at_)x>=7]"/>
David
________________________________________________________________________
This e-mail has been scanned for all viruses by Star Internet. The
service is powered by MessageLabs. For more information on a proactive
anti-virus service working around the clock, around the globe, visit:
http://www.star.net.uk
________________________________________________________________________