sylvain 01/06/06 06:19:47 Modified: src/org/apache/cocoon/processor/xsp xsp-java.xsl Log: Restrict namespace attributes to those explicitly declared on elements. This removes the many extraneous declarations when using Saxon (this is already solved in C2). Revision Changes Path 1.27 +33 -2 xml-cocoon/src/org/apache/cocoon/processor/xsp/xsp-java.xsl Index: xsp-java.xsl =================================================================== RCS file: /home/cvs/xml-cocoon/src/org/apache/cocoon/processor/xsp/xsp-java.xsl,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- xsp-java.xsl 2001/01/16 17:40:11 1.26 +++ xsp-java.xsl 2001/06/06 13:19:43 1.27 @@ -5,7 +5,7 @@ The Apache Software License, Version 1.1 ============================================================================ - Copyright (C) @year@ The Apache Software Foundation. All rights reserved. + Copyright (C) 1999-2001 The Apache Software Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: @@ -143,7 +143,9 @@ <!-- Method level declarations should go here... --> - <xsl:apply-templates select="*[not(starts-with(name(.), 'xsp:'))]"/> + <xsl:apply-templates select="*[not(starts-with(name(.), 'xsp:'))]"> + <xsl:with-param name="first-element">true</xsl:with-param> + </xsl:apply-templates> } } </xsl:template> @@ -155,11 +157,17 @@ document.createElement("<xsl:value-of select="@name"/>"); <!-- Add namespace declarations --> + <!-- Filter namespaces already present on the parent element --> + <xsl:variable name="parent-element" select=".."/> <xsl:for-each select="namespace::*"> + <xsl:variable name="ns-prefix" select="local-name(.)"/> + <xsl:variable name="ns-uri" select="string(.)"/> + <xsl:if test="not($parent-element/namespace::*[local-name(.) = $ns-prefix and string(.) = $ns-uri])"> ((Element) xspCurrentNode).setAttribute( "xmlns:<xsl:value-of select="local-name(.)"/>", "<xsl:value-of select="."/>" ); + </xsl:if> </xsl:for-each> xspParentNode.appendChild(xspCurrentNode); @@ -245,6 +253,7 @@ <xsl:template match="*"> + <xsl:param name="first-element">false</xsl:param> xspParentNode = xspCurrentNode; xspNodeStack.push(xspParentNode); xspCurrentNode = @@ -254,12 +263,34 @@ <xsl:apply-templates select="@*"/> <!-- Add namespace declarations --> + <!-- Filter namespaces already present on the parent element --> + <xsl:variable name="parent-element" select=".."/> <xsl:for-each select="namespace::*"> + <xsl:variable name="ns-prefix" select="local-name(.)"/> + <xsl:variable name="ns-uri" select="string(.)"/> + <xsl:if test="not($parent-element/namespace::*[local-name(.) = $ns-prefix and string(.) = $ns-uri])"> ((Element) xspCurrentNode).setAttribute( "xmlns:<xsl:value-of select="local-name(.)"/>", "<xsl:value-of select="."/>" ); + </xsl:if> </xsl:for-each> + + <!-- If first element, declare namespaces that also exist on the parent (i.e. not locally declared), + and filter out "xmlns:xmlns" namespace produced by Xerces+Saxon --> + <xsl:if test="$first-element = 'true'"> + <xsl:for-each select="namespace::*"> + <xsl:variable name="ns-prefix" select="local-name(.)"/> + <xsl:variable name="ns-uri" select="string(.)"/> + <xsl:if test="($ns-prefix != 'xmlns') and $parent-element/namespace::*[local-name(.) = $ns-prefix and string(.) = $ns-uri]"> + ((Element) xspCurrentNode).setAttribute( + "xmlns:<xsl:value-of select="$ns-prefix"/>", + "<xsl:value-of select="$ns-uri"/>" + ); + </xsl:if> + </xsl:for-each> + </xsl:if> + <xsl:apply-templates/> ---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]