Re: Can one _generate_ namespace nodes?
>Can you provide a *small* example, please? Smallest would be a conceptual sketch rather than an example. Let's say we want to insert <xsl:text>foo</xsl:text> into the middle of our output document. One approach is to code it using a "dummy" namespace, and translate that on output to the correct namespace:: <xsl:namespace-alias stylesheet-prefix="newxsl" result-prefix="xsl"/> ... <newxsl:text>foo</newxsl:text> and have XSLT automatically translate the dummy namespace into the "real" xsl namespace. I've tended to prefer this approach for clarity reasons. The downside of the aliasing solution is that it may produce more verbose output. Some XSLT processors -- Xalan in particular -- keep the original prefix and just change the namespace binding. This is actually nice in some ways, since it means you can see which names were generated by the aliasing mechanism. But when you combine that with a serializer which generates namespace declarations at the point where it discovers they were used without having been explicitly declared, that means the output becomes <newxsl:text xmlns:newxsl="http://www.w3.org/1999/XSL/Transform">foo</newxsl:text> ... and that namespace declaration occurs on every one of these generated <newxsl:text/> elements. A fix would be to make sure the newxsl: prefix is bound higher in the generated document, since most serializers are smart enough not to re-declare prefixes already having the proper value. For example, adding a namespace declaration for newxsl: to the root <xsl:stylesheet> element would do the trick. 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. <xsl:attribute> is explicitly prevented from doing so (though the rule as stated is no longer fully effective, given later errata published for the Namespaces REC). Of course there's a workaround for this case <xsl:element name="xsl:text" namespace="http://www.w3.org/1999/XSL/Transform">foo</xsl:element> But aliasing is *not* the only time we might want to explicitly add a namespace declaration. Since prefixes are being used in XPaths, we may find that in order to correctly generate an XPath in an output document we need to generate a declaration for one or more of the prefixes it contains -- and in general, XML serializers do *not* examine the content of strings to try to automatically bind prefixes they contain, since there's no general way to tell (for example) whether "nntp:" is a Namespace Prefix or a URI Scheme. Here too, we need a way to assert a new namespace binding explicitly from the stylesheet... and I haven't yet found a way to express that in XSLT. Am I missing something obvious? Or is there a gap in the XSLT design? ______________________________________ Joe Kesselman, IBM Next-Generation Web Technologies: XML, XSL and more. "may'ron DaroQbe'chugh vaj bIrIQbej" ("Put down the squeezebox and nobody gets hurt.") XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
PURCHASE STYLUS STUDIO ONLINE TODAY!
Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!
Download The World's Best XML IDE!
Accelerate XML development with our award-winning XML IDE - Download a free trial today!
Subscribe in XML format