But in the XPath data model, namespace declarations are 
"namespace nodes", 
and XSLT appears to have no mechanism for explicitly generating a 
namespace node into the output document.
That's true, but you can COPY a namespace node. So there's the
workaround
<xsl:variable name="temp">
  <xsl:element name="{$prefix}:local" namespace="{$uri}"/>
</xsl:variable>
<xsl:copy-of select="xx:node-set($temp)//namespace::*"/>
Am I missing something obvious? Or is there a gap in the XSLT design?
There is a gap in 1.0, the xsl:namespace instruction in XSLT 2.0 plugs
it.
Michael Kay
Software AG
home: Michael(_dot_)H(_dot_)Kay(_at_)ntlworld(_dot_)com
work: Michael(_dot_)Kay(_at_)softwareag(_dot_)com 
 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list