You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cocoon.apache.org by Robin Green <gr...@hotmail.com> on 2000/10/20 22:16:21 UTC
[C1 AND C2] Explanation of Redundant Namespace Prefixes
"Per Kreipke" <pe...@onclave.com> wrote:
>Ok, so the bug isn't in the esql taglib, the extra namespace attributes are
>coming from the xsp processor itself, in xsp-java.xsl. The following block
>adds the code that generates the namespace attributes:
>
> <!-- Add namespace declarations -->
> <xsl:for-each select="namespace::*">
> ((Element) xspCurrentNode).setAttribute(
> "xmlns:<xsl:value-of select="local-name(.)"/>",
> "<xsl:value-of select="."/>"
> );
> </xsl:for-each>
>
>I still don't think the objects shown below need namespace declarations on
>each of them. Where are the namespaces that are being copied here coming
>from?
I can explain this. The XSLT specification specifies two relevant things
here:
1. Sufficient namespace declarations must be output in the output document
in order for the namespaces that are _used_ in the output document to still
be declared (even if the tags holding the original namespace declarations
are not copied).
2. Templates CANNOT match on xmlns: attributes at all. If you try, it won't
match. I quote:
"The built-in template rule for namespace nodes is also to do nothing. There
is no pattern that can match a namespace node; so, the built-in template
rule is the only template rule that is applied for namespace nodes."
(Namespace nodes == the representation of xmlns: attributes [okay SAX does
not have a tree of nodes, but you get the meaning], and should not be
confused with the namespace axis, which is what the above code is matching
on. See M. Kay, "XSLT Programmers Reference".) This seems like a stupid
restriction to me, but it's in the spec, and it's possible to workaround it,
so it has to be adhered to. I would guess that it was probably specced this
way in order to enforce a separation of concerns, so that only the XSLT
processor would have to worry about preserving needed namespace declarations
(which could be non-trivial, but could be completely automated - or so the
spec writers thought!), not the stylesheet author.
However, think about this for a second - the XSLT processor is NOT
outputting the "real" XML - the Java code it is generating, is doing that!
The output document of Xalan, in this case, is a Java source file wrapped in
ONE dummy element, which is ignored to make it into a compilable Java source
file.
Because the spec writers did not apparently take into account the fact that
XSLT might be used to generate programming language source code which would
generate XML (after all - on the face of it - it does seem like a stupid
idea, if you put yourself in the shoes of someone who's never used Cocoon or
XSP), that is why we have this problem.
This illustrates a problem with XSLT - it is called "Extensible Stylesheet
Transformations", and designed for that purpose - yet clearly people are
advocating using it, and depending on using it, for things which have
nothing to do with style, because it is in many ways such an eminently
suitable tool.
Anyway. In C1, Ricardo first implemented a hackaround so that if you needed
namespace declarations preserved, you used xsp: for them instead of xmlns:.
Since this was non-standards-compliant he improved it, in 1.8 and 2.0alpha,
to pick up all namespaces used automatically.
The 1.8 "solution" is really bad because it outputs namespace declarations
in lots of elements (perhaps all). The 2.0alpha solution, though different,
seems also to emit redundant declarations.
The best solution seems to be to scrap those methods and instead:
1) Record all namespace declarations in a Map.
2) Record only the namespaces that will be outputted _explicitly_
(namespaces used by support classes are their responsibility, so we only
have to worry about the generated code).
3) Look up (2) in the (1) Map to generate the declarations, so that unused
declarations are ommitted.
4) Output these declarations only in the page root element, since that will
apply throughout the whole document.
None of this can be done in XSLT directly, but it doesn't need to be, we can
just do it in Java.
(Of course in Cocoon 1 think Hashtable instead of Map.)
_________________________________________________________________________
Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com.
Share information about yourself, create your own public profile at
http://profiles.msn.com.