[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

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


Subject: Re: [xsl] copy-of "canonicalization" behavior in Xalan (Java)
From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx>
Date: Fri, 23 Jul 2004 05:36:55 -0700 (PDT)

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