xsl:if
стреляет. Ваша проблема - область действия переменной.
<xsl:if test="1 = 1"><!--should always fire-->
<xsl:variable name="color" select='"red"'/>
</xsl:if>
Переменная color
будет видна только в теле xsl:if
, а не где-либо еще, поэтому ее нельзя использовать в другом месте.
Решение состоит в том, чтобы изменить его на это и поместить условие в объявление переменной
<xsl:variable name="color">
<xsl:if test="1 = 1">
<xsl:text>red</xsl:text>
</xsl:if>
</xsl:variable>
Вы можете заменить это на xsl:choose
, если у вас есть несколько вариантов цвета.