You can simulate your own mode-mechanism by passing a param and checking for that param in every template, just like that:
<xsl:template match="/">
<xsl:apply-templates>
<xsl:with-param name="mode">mode1</xsl:with-param>
</xsl:apply-templates>
<xsl:apply-templates>
<xsl:with-param name="mode">mode2</xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="text()" />
<xsl:template match="condition1">
Matches in every mode.
</xsl:template>
<xsl:template match="condition2">
<xsl:param name="mode" />
<xsl:choose>
<xsl:when test="$mode = 'mode1' or $mode = 'mode2'">
Matches in Mode 1 and Mode 2
</xsl:when>
<xsl:when test="$mode = 'mode3'">
Matches in Mode 3
</xsl:when>
<xsl:otherwise>Matches all other Modes</xsl:otherwise>
</xsl:choose>
</xsl:template>
You could advance things even further by automatically generating XSL-T. Says: If you want some syntactic sugar or feature XSL 1.0 lacks you can extend your Stylesheet and write an XSL-T which translates the functionality into XSL 1.0.
For example, use your existing templates but instead of using mode as an XSL-T attribute introduce your own element, say <your:mode>
and annotate existing templates. Another XSL-T might then transform that extended version into XSL 1.0 by simply copying contents and reproducing templates as needed, or into a format like shown in the example above.
It's quite tricky but works pretty well.