We have a function like this:

private void subFonts(SVGDocument doc) {
    final XPathResult res = (XPathResult) ((XPathEvaluator) 
doc).evaluate(".//*[local-name()=\"text\"]",
            doc.getRootElement(), null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, 
null);
    for (Node node = res.iterateNext(); node != null; node = res.iterateNext()) 
{

This used to work with Batik 1.14, but broke when we upgraded to 1.17.
Under 1.17, this throws a NullPointerException in res.iterateNext(); because 
res's iterator is null.
I've investigated a little bit and found that the implementation of 
AbstractDocument.XPathExpr.evaluate has changed, and the code path for 
ORDERED_NODE_ITERATOR_TYPE creates a

new Result((Node) xpath.evaluate(contextNode, XPathConstants.NODE), type);

(AbstractDocument.java line 2259 in the 1.17 release)
The iterator of a Result is only set when the constructor is called with a 
NodeList, not a Node, so while I'm not certain that this is the problem, it 
does seem suspicious.
I'm pretty sure that an XPathResult should support iteration when evaluate is 
called with ORDERED_NODE_ITERATOR_TYPE, so I do believe that our code was 
correct and 1.14 had the correct behavior here.

Reply via email to