JAXP: XSLTC transformer swallows empty namespace declaration which is necessary to undeclare default namespace

Joe Wang huizhe.wang at oracle.com
Tue Jul 26 21:13:55 UTC 2016


Hi Daniel,

I tried your xsl, but I got the same result using either JDK 8 or a 
recent JDK 9 (jdk9dev) build:

<?xml version="1.0" encoding="UTF-8"?><root xmlns="ns1"><test 
xmlns="ns2"><b><c/></b></test><test><b 
xmlns="ns2"><c/></b></test><test><b><c/></b></test><test><b><c/></b></test><test><b><c/></b></test><test/></root>

For the issue with regard to empty namespace, please open a bug and 
let's fix it.

Thanks,
Joe

On 7/26/16, 10:32 AM, Daniel Fuchs wrote:
> Hi Christoph,
>
> I was at first a bit suspicious of your proposed patch, but
> I applied it and played with it and could not fault it.
> Now I tend to believe this is the correct thing to do (though
> that's not my area of expertise).
>
> I tried it with a bit more elaborate content in the "transform"
> template:
>
> ------------------------------ XSL ----------------------------
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> version="1.0">
> <xsl:template match="/">
> <root xmlns="ns1">
> <xsl:call-template name="transform"/>
> </root>
> </xsl:template>
> <xsl:template name="transform">
> <test xmlns="ns2"><b xmlns="ns2"><c xmlns=""></c></b></test>
> <test xmlns="ns1"><b xmlns="ns2"><c xmlns=""></c></b></test>
> <test><b><c xmlns=""></c></b></test>
> <test xmlns=""><b><c xmlns=""></c></b></test>
> <test xmlns="ns1"><b><c xmlns=""></c></b></test>
> <test xmlns=""/>
> </xsl:template>
> </xsl:stylesheet>
> ---------------------------------------------------------------
>
> and that gave me the content I expected (ignoring the double
> xmlns declaration which seems to be another bug):
>
>
> -- Formatted result with your patch (newlines added manually) --
> <?xml version="1.0" encoding="UTF-8"?>
> <root xmlns="ns1" xmlns="ns1">
> <test xmlns="ns2" xmlns="ns2"><b><c xmlns="" xmlns=""></c></b></test>
> <test><b xmlns="ns2" xmlns="ns2"><c xmlns="" xmlns=""></c></b></test>
> <test xmlns="" xmlns=""><b><c></c></b></test>
> <test xmlns="" xmlns=""><b><c></c></b></test>
> <test><b><c xmlns="" xmlns=""></c></b></test>
> <test xmlns="" xmlns=""></test>
> </root>
> ---------------------------------------------------------------
>
> This seems a more correct result than what the JDK currently does:
>
> ------------------ Current JDK 9/dev ---------------------------
> <?xml version="1.0" encoding="UTF-8"?>
> <root xmlns="ns1" xmlns="ns1">
> <test xmlns="ns2" xmlns="ns2"><b><c></c></b></test>
> <test><b xmlns="ns2" xmlns="ns2"><c></c></b></test>
> <test><b><c></c></b></test>
> <test><b><c></c></b></test>
> <test><b><c></c></b></test>
> <test></test>
> </root>
> ---------------------------------------------------------------
>
> where the empty default namespace declaration always disappears,
> even at line 4 in the element <c>!
>
> Hope this helps,
>
> -- daniel
>
> On 22/07/16 11:38, Langer, Christoph wrote:
>> Hi,
>>
>> I have a customer reporting the following phenomena which I believe 
>> is an issue.
>>
>> Consider the following xsl:
>>
>> ---------------------XSL---------------------
>> <?xml version="1.0" encoding="UTF-8"?>
>> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
>> version="1.0">
>> <xsl:template match="/">
>> <root xmlns="ns1">
>> <xsl:call-template name="transform"/>
>> </root>
>> </xsl:template>
>> <xsl:template name="transform">
>> <test xmlns=""/>
>> </xsl:template>
>> </xsl:stylesheet>
>> ---------------------End of XSL---------------------
>>
>>
>> This is the XML snippet where the XSL gets applied (just a dummy):
>> <?xml version="1.0" encoding="UTF-8"?><aaa></aaa>
>>
>> The result with the current XSLTC is:
>> <?xml version="1.0" encoding="UTF-8"?><root xmlns="ns1"><test/></root>
>> But this would not undeclare the default namespace "ns1" from the 
>> element named "root" for the element named "test" which was the 
>> intention of the xsl. So I believe it should be:
>> <?xml version="1.0" encoding="UTF-8"?><root xmlns="ns1"><test 
>> xmlns=""/></root>
>>
>> Looking at the coding I came up with the following: 
>> http://cr.openjdk.java.net/~clanger/webrevs/xsltc-namespaceissue/ 
>> With that, XSLTC would also emit the namespace attribute for an empty 
>> namespace. It works for my example but I'm not sure if it is the 
>> right thing to do or if it breaks things at other places and violates 
>> specs elsewhere.
>>
>> Comparing with the Apache Xalan, I can see that the Apache XSLTC 
>> matches the JDK XSLTC behavior to suppress the namespace declaration 
>> but the interpretative transformer 
>> (org.apache.xalan.processor.TransformerFactoryImpl) would emit the 
>> namespace attribute.
>>
>> Please give me some comments before I open a Bug...
>>
>> Thanks a lot in advance
>> Christoph
>>
>


More information about the core-libs-dev mailing list