I think you want $PromoCode rather than just PromoCode.
Also, don't do
<xsl:variable name="x">
<xsl:value-of select="y"/>
</xsl:variable>
which creates a result tree fragment, when you only want a string. Instead do
<xsl:variable name="x" select="y"/>
I saw one stylesheet recently that ran 5 times faster after making this change - and why write 3 lines of code where 1 will do?
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference