Hi,

The namespace declaration will always get generated if it is used. Exclude 
result prefixes won't do anything in the case that you mention because the 
namespace is used in the output document.  When <xhtml:div> gets put in 
the output document, it needs the namespace declaration for xhtml.

Any time you copy an element or create an element in the output document, 
if it has a namespace associated with it then that namespace declaration 
must also be put in the output document.  So if you are trying to get rid 
of namespace declarations in the output document then you need to make 
sure all of the elements you are creating have no namespace.

Here is an example that produces the same output whether or not the 
namespace declaration in the xml file is there or not:

Stylesheet:

<?xml version="1.0"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
    version="1.0">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="*[local-name()='doc']">
  <out>
    <xsl:apply-templates select="*"/>
  </out>
</xsl:template>

<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>

</xsl:stylesheet>

Input xml (remove the namespace declaration on the doc element to see that 
you still get the same output with or without it):

<?xml version="1.0"?>
<doc xmlns="my.org">
  <a number="1">a1</a>
  <b number="1">b1</b>
  <c number="1">c1</c>
  <a number="2">a2</a>
  <b number="2">b2</b>
</doc>

Thanks.

Erin Harris





Larry Trammell <[EMAIL PROTECTED]> 
02/05/2007 07:21 PM

To
Erin Harris/Toronto/[EMAIL PROTECTED], Ferdinand Soethe <[EMAIL PROTECTED]>
cc
xalan-j-users@xml.apache.org
Subject
RE: [Fwd: Re: Why does Doctype change processing of a document]






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




Reply via email to