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,
attQName.indexOf(":"));
This works fine with Resin 2 and Xalan.
Although the documentation for org.xml.sax.Attributes.getLocalName() (see
http://java.sun.com/j2se/1.5.0/docs/api/org/xml/sax/Attributes.html#getLocalName(int
)) says
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 =
TransformerFactory.newInstance();
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" +
"</xsl:stylesheet>"));
Transformer transformer =
transformerFactory.newTransformer(streamSource);
JDOMSource source = new JDOMSource(new
org.jdom.Document(new Element("foo")));
JDOMResult result = new JDOMResult();
transformer.transform(source,
result);
}
catch(Exception ex) {
throw new ServletException(ex);
}
}
}
Mattias Jiderhamn
Expert Systems
Mail:
mattias.jiderhamn@expertsystem.se
Web:
www.expertsystem.se
Skype:
mattiasj78