[jdom-interest] Bug regarding attributes local name using JDOMResult?

Mattias Jiderhamn mattias.jiderhamn at expertsystem.se
Thu Nov 10 01:53:44 PST 2005

Hi list.
I am having trouble using the XSL transformer of Caucho Resin 3 
(http://www.caucho.com/resin-3.0) together with JDOM. The problem 
occurs when using attributes without namespace and outputting to a 
JDOMResult. On the one hand this worked fine with Resin 2, on the 
other hand Resin 3 seems to follow the specification more closely, so 
I'm not quite sure whether the problem lies with Resin or JDOM.

The point of problem is in org.jdom.input.SAXHandler.startElement(). 
Here it is assumed that the local name of the attribute is equal to 
the QName, if no namespace/prefix is used. (Line numbers from 1.0 release)

536:            if (!attQName.equals(attLocalName)) {
537:                String attPrefix = attQName.substring(0, 

This works fine with Resin 2 and Xalan.

Although the documentation for org.xml.sax.Attributes.getLocalName() 

    Returns: The local name, or the empty string if Namespace 
processing is not being performed, or null if the index is out of range.

So Resin 3 returns the emtpy string in this case, which causes 
"java.lang.StringIndexOutOfBoundsException: String index out of 
range: -1" on line 537 above. Below you will find a self contained example.

So, does JDOM need to take into account that the local name can be 
blank? Or is this a bug with Resin 3?


import org.jdom.transform.JDOMResult;
import org.jdom.transform.JDOMSource;
import org.jdom.Element;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import java.io.IOException;
import java.io.StringReader;

public class XslProblemServlet extends HttpServlet {
   protected void service(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException {
     try {
       TransformerFactory transformerFactory = 
       StreamSource streamSource = new StreamSource(new StringReader(
           "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" +
           "<xsl:stylesheet version=\"1.0\" 
xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n" +
           "  <xsl:template match=\"/\">\n" +
           "    <bar><child myAttribute=\"myValue\" /></bar>\n" +
           "  </xsl:template>\n" +
       Transformer transformer = 

       JDOMSource source = new JDOMSource(new org.jdom.Document(new 
       JDOMResult result = new JDOMResult();
       transformer.transform(source, result);
     catch(Exception ex) {
       throw new ServletException(ex);

   Mattias Jiderhamn
   Expert Systems

<mailto:mattias.jiderhamn at expertsystem.se>mattias.jiderhamn at expertsystem.se
   Web: <http://www.expertsystem.se/>www.expertsystem.se
   Skype: <callto://mattiasj78>mattiasj78
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.jdom.org/pipermail/jdom-interest/attachments/20051110/0bb9fe6d/attachment.htm

More information about the jdom-interest mailing list