An alternative solution without variables:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:for-each select="//Products/Item">
<tr>
<td><xsl:value-of select="@ItemColor" /></td>
<td><xsl:value-of select="//Desciptions/Color[@ColorName=current()/@ItemColor]/@ColorId"/></td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
current() retrieves the context node of the scope surrounding the select attribute, i.e. the node currently selected by the for-each element in this case. Here's another solution, using an XSLT key element. This approach is very useful when there's a large number of things to lookup in.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:key name="color-name-to-id" match="//Desciptions/Color/@ColorId" use="../@ColorName"/>
<xsl:template match="/">
<xsl:for-each select="//Products/Item">
<tr>
<td><xsl:value-of select="@ItemColor" /></td>
<td><xsl:value-of select="key('color-name-to-id', @ItemColor)"/></td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p