Write a template rule for any attribute
<xsl:template match="*">
<xsl:copy/>
</xsl:template>
and another to change the c attribute
<xsl:template match="c">
<xsl:attribute name="c">bye</xsl:attribute>
</xsl:template>
and then apply-templates to all attributes:
<xsl:template match="node">
<xsl:copy>
<xsl:apply-templates select="@*"/>
</xsl:copy>
</xsl:template>
Alternatively, you can exploit the fact that if you write the same attribute twice, the second one wins:
<xsl:copy-of select="@*"/>
<xsl:attribute name="c">bye</xsl:attribute>
But that doesn't work if you want to delete one attribute.
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference