RE: [xsl] copy-of "canonicalization" behavior in Xalan (Java)

Subject: RE: [xsl] copy-of "canonicalization" behavior in Xalan (Java)
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Fri, 23 Jul 2004 14:43:21 +0100
Attributes and namespaces are quite different things in the data model, and
it's expressly stated in the language spec that you can't create namespaces
by trying to create an attribute with an "xmlns:" name.

XSLT 2.0 has an xsl:namespace instruction that allows dynamic construction
of namespace nodes.

Michael Kay

> -----Original Message-----
> From: Mukul Gandhi [mailto:mukul_gandhi@xxxxxxxxx] 
> Sent: 23 July 2004 13:37
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] copy-of "canonicalization" behavior in Xalan (Java)
> 
> I wrote this stylesheet
> 
> <?xml version="1.0"?> 
> <xsl:stylesheet
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> version="1.0">
>  
> <xsl:output method="xml" /> 
>  
> <xsl:template match="node()"> 
>    <xsl:copy>
>      <xsl:attribute
> name="xmlns:{substring-before(name(),':')}">
>        <xsl:value-of select="namespace-uri()" />
>      </xsl:attribute>
>      <xsl:for-each select="@*">
>        <xsl:attribute name="{name()}">
>          <xsl:value-of select="." />
>        </xsl:attribute>
>      </xsl:for-each>      
>      <xsl:apply-templates />
>    </xsl:copy>
> </xsl:template>
>   
> </xsl:stylesheet>
> 
> When it is applied to the given XML, Xalan produces
> error 
> "Could not resolve namespace prefix: xmlns. The node
> will be ignored."
> 
> My questions are
> 1) Is it possible to generate attribute names like
> xmlns:something (i.e. how to escape special meaning of
> xmlns: in XSLT for namespaces)
> 2) If this is possible, then is it architecturally
> correct?
> 
> Regards,
> Muku
> 
> --- Matthew McKennirey <mmckennirey@xxxxxxxxxxxxxx>
> wrote:
> > The copy-of element when processed by Xalan (Java)
> > appears to canonicalize the output, rather than
> > output the source tree exactly.
> > 
> > For specific nodes in the source tree I would like
> > to create an identical copy in the result tree,
> > including redundant namespace
> > declarations.
> > 
> > Assume a source document like:
> > 
> > <foo:root xmlns:foo="http://abc.org/foo#";
> > xmlns:xyz="http://xyzinc.com/xyz#";>
> > 	<foo:parent xmlns:foo="http://abc.org/foo#";>
> > 		<foo:child xmlns:foo="http://abc.org/foo#";>more
> > text</foo:child>
> > 		<xyz:child xmlns:xyz="http://xyzinc.com/xyz#";>yet
> > more text</xyz:child>
> > 	</xyz:parent>
> > </foo:root>
> > 
> > The namespace declarations on the parent and child
> > nodes are redundant (their namespace prefixes have
> > been bound to a namespace on
> > the root node).
> > 
> > When I use copy-of, such as in the simple template
> > below, in XML Spy using its built in XSLT processor
> > the result tree is an exact
> > and complete copy of the source tree, redundant
> > namespace declarations and all, as I would expect.
> > 
> > <xsl:template match ="/">
> >   <xsl:copy-of select="(.)"/>
> > </xsl:template>
> > 
> > (I have simplified the template in the extreme to
> > make it clear.)
> > 
> > When I run the same template with the Xalan (Java)
> > XSLT processor, which uses a SAX parser, I get a
> > "cleaned", canonical form of the
> > source tree as my result, with all redundant
> > namespace declarations removed.
> > 
> > This may appear to be a benefit, but I later
> > manipulate parts of the result tree (which is much
> > more complex than the simple
> > example) as separate XML fragments and at that point
> > the namespace declarations are in fact no longer
> > redundant but critical.
> > 
> > I have not been able to find anything in the Xalan
> > documentation which suggests a way to avoid this
> > canonicalization - perhaps its a
> > SAX issue? Is there a way to force Xalan to make an
> > exact copy of the source tree, warts and all?
> > 
> > 
> > Thanks
> 
> 
> 
> 	
> 		
> __________________________________
> Do you Yahoo!?
> Vote for the stars of Yahoo!'s next ad campaign!
> http://advision.webevents.yahoo.com/yahoo/votelifeengine/

Current Thread