If you pass in an empty string then that is its value, not the default
of false() however an empty string, used in a boolean context will
coerce to false() so in many cases it will come to the same thing.
<xsl:choose>
<!--<xsl:when test="boolean($permission)"> or -->
<xsl:when test="$permission">
both those are the same thing as test= always has an effective boolean()
aroiund its value to coerce whatever there to a boolean.
easiest is probably to make your default value 'defult' or some such
then you can say
test="$permission != 'default'"