Thank you Erin... I'm sure your comments will keep two of us very busy thinking for a while. Oh, the pain! Would you say that a reasonable solution to Ferdinand's problem of sometimes namespace-decorated, sometimes not-decorated tags, could be: when generating literal elements, generate them with a specified namespace, e.g. <xhtml:div> etc. and then use exclude-result-prefixes for that specified namespace? (I'll ignore the irony that in order to omit the namespace, you specify it.)
-----Original Message----- From: Erin Harris [mailto:[EMAIL PROTECTED] Sent: Wednesday, May 02, 2007 1:32 PM To: Ferdinand Soethe Cc: xalan-j-users@xml.apache.org Subject: Re: [Fwd: Re: Why does Doctype change processing of a document] Hi, > except for the div-element The div element is a literal element so all of the currently in scope namespaces get copied to literal elements in the output document (unless they have already been copied to a parent element). From the XSLT 1.0 Specification, Section 7.7.1 Literal Result Elements ( <http://www.w3.org/TR/xslt#literal-result-element> http://www.w3.org/TR/xslt#literal-result-element) The created element node will also have a copy of the namespace nodes that were present on the element node in the stylesheet tree with the exception of any namespace node whose string-value is the XSLT namespace URI (http://www.w3.org/1999/XSL/Transform), a namespace URI declared as an extension namespace (see <http://www.w3.org/TR/xslt#extension-element> [14.1 Extension Elements]), or a namespace URI designated as an excluded namespace. > And also: I expected to be able to do away with /*[local-name()='html'] > now that xhtml is default namespace. But it doesn't work that way. Why? The default namespace is not used when matching nodes. From the XPath 1.0 Specification, Section 2.3 Node Tests ( <http://www.w3.org/TR/xpath#node-tests> http://www.w3.org/TR/xpath#node-tests): A <http://www.w3.org/TR/REC-xml-names#NT-QName> QName in the node test is expanded into an <http://www.w3.org/TR/xpath#dt-expanded-name> expanded-name using the namespace declarations from the expression context. This is the same way expansion is done for element type names in start and end-tags except that the default namespace declared with xmlns is not used: if the <http://www.w3.org/TR/REC-xml-names#NT-QName> QName does not have a prefix, then the namespace URI is null (this is the same way attribute names are expanded). > and try to remove xhtml with exclude-result-prefixes then things turn > around. div will no longer have a namespace attribute while all the > copied element do. Misterious really. The copied elements are in the http://www.w3.org/1999/xhtml namespace in the input document so the way copy works is that it makes sure that those elements are also in that namespace in the output document. Because you excluded the namespace it no longer appears on the <div> element (which I assume is the parent of the copied nodes) so now it must appear on the copied nodes themselves since there is no ancestor which has declared the namespace. If you don't want any namespace declarations showing up at all in the output document then you will probably have to do your own copy such as: <xsl:template match="*"> <xsl:element name="{local-name()}"> <xsl:apply-templates select="*|@*|text()|processing-instruction()|comment()"/> </xsl:element> </xsl:template> <xsl:template match="@*|text()|processing-instruction()|comment()"> <xsl:copy> <xsl:apply-templates select="*|@*|text()|processing-instruction()|comment()"/> </xsl:copy> </xsl:template> Thanks. Erin Harris