Michael Kay wrote:
Namespace declarations in the source document are translated by the XML
parser into namespace nodes, they are not treated by XSLT as attribute
nodes. Therefore, a namespace declaration can never contain an attribute
value template (because it isn't an attribute).
You need to produce in the result tree a namespace node whose name
(=prefix) is "" and whose string value (=namespace URI) is "test". (It's
very confusing that you chose to use the name "prefix" to refer to the
namespace URI!
In XSLT 2.0 you can do this with
<xsl:namespace name=""><xsl:value-of select="@prefix"/></xsl:namespace>
thats what I call a solution. I am switching to Saxon (7.7).
In 1.0 there is no direct way of doing this. The nearest equivalent is:
<xsl:variable name="dummy">
<xsl:element name="e" namespace="{(_at_)prefix}"/>
</xsl:variable>
<xsl:copy select="xx:node-set($dummy)/*/namespace::*[(_dot_)=(_at_)prefix]"/>
This creates a dummy element in the required namespace, and then copies
the required namespace node to the result tree.
this should have been xsl:copy-of, I suppose. In addition, the
"[(_dot_)=(_at_)prefix]" predicate does not match anything. I had to change it to
<xsl:variable name="ns_name" select="@prefix">
<xsl:copy select="xx:node-set($dummy)/*/namespace::*[.=$ns_name]"/>
to get it to work (strange. why?). After doing that, Saxon will indeed
output the namespace node, while Xalan (which behaves the same regarding
the predicate) does not.
thanks,
christian
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list