When giving a default parameter or a constant value, make sure that you remember the single quotes around it. Otherwise the processor will go and look up for the element.
For example, the following parameter was meant to give a directory prefix to our filename.
<xsl:with-param name="prefix" select="../"/>
But this was treated as an XPath expression that looked at the parent node. Instead we should've used
<xsl:with-param name="prefix" select="'../'"/>
The XSL processor will correctly not throw any error, so it may be difficult to spot where the error occurs.
I must've been looking at too much HTML. When using parameters, I would give the two attributes as name and value, instead of name and select.
This will correctly set the variable colour to 'red',
<xsl:variable name="colour" select="'red'"/>
But this will not set colour at all, and leave it empty
<xsl:variable name="colour" value="'red'"/>
Solutions to this are to check for the value attribute in the XSL document. For some reason my XSL parser, Saxon, doesn't complain when I add junk attribute into the XSL elements.