|
|
Re: [Fwd: Re: Why does Doctype change processing of a document]: msg#00014
|
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)
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 [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):
A QName
in the node test is expanded into an 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 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
| Ferdinand Soethe <ferdinand@xxxxxxxxxx>
02/05/2007 02:14 PM
|
|
To
| xalan-j-users@xxxxxxxxxxxxxx
|
|
cc
|
|
|
Subject
| [Fwd: Re: Why does Doctype change processing
of a document] |
|
-------- Original Message --------
Subject: Re: Why does Doctype change processing of a document
Date: Wed, 02 May 2007 20:03:38 +0200
From: Ferdinand Soethe <ferdinand@xxxxxxxxxx>
To: Larry Trammell <larryt@xxxxxxxxxxxxx>
References:
<22A20AD271DB4949836F85AACBB90A770892A0@xxxxxxxxxxxxxxxxxxxxxxxx>
Thanks to all of you for helping me understand my mistake. At least I
know what is going wrong now.
Adding xmlns:xhtml="http://www.w3.org/1999/xhtml" to my stylesheet
worked well but added all those ugly xhtml:... to the generated elements.
So I declared xhtml as default namespace
xmlns="http://www.w3.org/1999/xhtml" to make them disappear.
Which worked really well in this template and let to the resulting
document being free of xhtml:...
> <xsl:stylesheet
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
> version="1.0" >
>
> <!-- toolbox for copying everything over to the target
-->
> <xsl:import href="">
>
> <!-- Match html, disregard the namespace -->
> <xsl:template match="/*[local-name()='html']">
> <xsl:apply-templates select="*[local-name()='body']"/>
> </xsl:template>
>
> <!-- Match body, disregard namespace -->
> <xsl:template match="/*[local-name()='html']/*[local-name()='body']">
> <div class="content">
> <xsl:apply-templates/>
> </div>
> </xsl:template>
except for the div-element.
Has anyone the patience to explain?
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?
And when I change the style-sheet to
> <xsl:stylesheet
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
> version="1.0" exclude-result-prefixes="xhtml">
>
> <!-- toolbox for copying everything over to the target
-->
> <xsl:import href="">
>
> <!-- Match html, disregard the namespace -->
> <xsl:template match="/*[local-name()='html']">
> <xsl:apply-templates select="*[local-name()='body']"/>
> </xsl:template>
>
> <!-- Match body, disregard namespace -->
> <xsl:template match="/*[local-name()='html']/*[local-name()='body']">
> <div class="content">
> <xsl:apply-templates/>
> </div>
> </xsl:template>
>
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.
Best regards,
Ferdinand Soethe
|
| |