<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div class="moz-cite-prefix">Probably best to nail down the problem
in a bug report first, providing XML input, XSLT stylesheet,
actual and expected XML output to demonstrate the problem.<br>
Now if <a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-8168664">https://bugs.openjdk.org/browse/JDK-8168664</a> describes your
problem:<br>
The Xalan version bundled with the JDK <i>afaik</i> seems to get
occasional security updates and improvements but does not reflect
the latest Xalan version.<br>
Latest Xalan 2.7.3 does not show the problematic behaviour of
JDK-8168664, so a possible workaround would be to not rely on the
XSLT processor bundled with the JDK but instead use Xalan or Saxon
directly.<br>
<br>
Best,<br>
Johannes<br>
<br>
On 23/04/2025 16:03, Hempushpa Sahu wrote:<br>
</div>
<blockquote type="cite"
cite="mid:SJ4PPF6D7B23F3FEA3AEBBD32A4999EB9FA9DBA2@SJ4PPF6D7B23F3F.namprd15.prod.outlook.com">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator"
content="Microsoft Word 15 (filtered medium)">
<style>@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
{font-family:Aptos;}p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:11.0pt;
font-family:"Aptos",sans-serif;
mso-ligatures:standardcontextual;
mso-fareast-language:EN-US;}a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#467886;
text-decoration:underline;}span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Aptos",sans-serif;
color:windowtext;}.MsoChpDefault
{mso-style-type:export-only;
font-size:11.0pt;
mso-fareast-language:EN-US;}div.WordSection1
{page:WordSection1;}</style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
<div class="WordSection1">
<p class="MsoNormal">Problem Description : <o:p></o:p></p>
<p class="MsoNormal">XSLT transformation creating unique
namespace prefixes.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Analysis & Observation : <o:p></o:p></p>
<p class="MsoNormal">The XSLT transformation is generating a new
namespace prefix for every XML element, even when the
namespace value matches that of the parent element. This leads
to large XML file transformations exceeding the file size and
memory limits on our systems.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The behaviour in OpenJDK has remained
consistent since JDK 8; however, the namespace prefix issue is
not something we find optimum.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">During our investigation of the OpenJDK
codebase, we identified defect
<a href="https://bugs.openjdk.org/browse/JDK-8167179"
moz-do-not-send="true" class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8167179</a>,
which was intended to resolve the namespace prefix issue in
the OpenJDK 8 release. However, our testing confirms that the
issue persists across multiple versions, including OpenJDK 8,
11, 17, and 22. Additionally, we found an open bug report <a
href="https://bugs.openjdk.org/browse/JDK-8168664"
moz-do-not-send="true" class="moz-txt-link-freetext">
https://bugs.openjdk.org/browse/JDK-8168664</a> in the
OpenJDK issue tracker referencing a similar problem. Notably,
there has been no recent activity on this bug for several
years<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Suggested Solution:<o:p></o:p></p>
<p class="MsoNormal">Introduced a hashmap, and storing the
unique namespace-url from root node and checking if new url
namespace-url encountered then we will store it in the hashmap
and increment the namespace prefix, else we will not increment
the prefix.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Implemented in existing function
startXslElement() of
src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> else {<o:p></o:p></p>
<p class="MsoNormal"> // Need to generate a prefix?<o:p></o:p></p>
<p class="MsoNormal"> if (namespace != null &&
namespace.length() > 0) {<o:p></o:p></p>
<p class="MsoNormal"> prefix = generatePrefix();<o:p></o:p></p>
<p class="MsoNormal"> qname = prefix + ':' + qname;<o:p></o:p></p>
<p class="MsoNormal"> handler.startElement(namespace,
qname, qname);<o:p></o:p></p>
<p class="MsoNormal">
handler.namespaceAfterStartElement(prefix, namespace);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The above code is changed to <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> else {<o:p></o:p></p>
<p class="MsoNormal"> // Need to generate a prefix?<o:p></o:p></p>
<p class="MsoNormal"> if (namespace
!= null && namespace.length() > 0) {<o:p></o:p></p>
<p class="MsoNormal">
//Check if prefix needs to be incremented.<o:p></o:p></p>
<p class="MsoNormal">
if (!namespaceMap.containsKey(namespace))<o:p></o:p></p>
<p class="MsoNormal">
{<o:p></o:p></p>
<p class="MsoNormal">
namespaceMap.put(namespace,
threadLocalPrefixIndex.get().getAndIncrement());<o:p></o:p></p>
<p class="MsoNormal">
prefix = "ns"+namespaceMap.get(namespace);<o:p></o:p></p>
<p class="MsoNormal">
qname = prefix + ':' + qname;<o:p></o:p></p>
<p class="MsoNormal">
handler.startElement(namespace, qname, qname);<o:p></o:p></p>
<p class="MsoNormal">
handler.namespaceAfterStartElement(prefix,
namespace);<o:p></o:p></p>
<p class="MsoNormal">
}<o:p></o:p></p>
<p class="MsoNormal">
else<o:p></o:p></p>
<p class="MsoNormal">
{<o:p></o:p></p>
<p class="MsoNormal">
//Namespace URI already exist in map.<o:p></o:p></p>
<p class="MsoNormal">
prefix = "ns"+namespaceMap.get(namespace);<o:p></o:p></p>
<p class="MsoNormal">
qname = prefix + ':' + qname;<o:p></o:p></p>
<p class="MsoNormal">
handler.startElement(namespace, qname, qname);<o:p></o:p></p>
<p class="MsoNormal">
handler.namespaceAfterStartElement(prefix,
namespace);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">
}<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Releases:<o:p></o:p></p>
<p class="MsoNormal">OpenJDK 8, 11, 17 & 22 the issue is
seen.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Note:<o:p></o:p></p>
<p class="MsoNormal">Proceeding with this approach, we will need
to update the test files. For instance, we have identified one
test case that validates the namespace prefix in the result -
test/jaxp/javax/xml/jaxp/unittest/transform/NamespacePrefixTest.java<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Next steps: <o:p></o:p></p>
<p class="MsoNormal">We want to take the above-mentioned fix to
OpenJDK.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Please review and suggest if the above
understanding is right and we shall take the fix to OpenJDK.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</blockquote>
<br>
</body>
</html>