Hi all, Apologies if this has been asked before but it is driving me mad. I am happily able to evaluate non-namespaced XPath expressions using either an InputSource or a document context element. I can evaluate namespaced expressions using the InputSource, but it doesn't work if I evaluate a namespaced expression passing an Element as a context node.
Take the example file from http://xml.apache.org/xalan-j/xpath_apis.html#namespacecontext <?xml version='1.0'?> <foo:document xmlns:foo="http://apache.org/foo" xmlns:bar=" http://apache.org/bar"> <bar:element>MyBar</bar:element> </foo:document> I want to evaluate "/foo:document/bar:element", which should return "MyBar". I use the following code: package test; import java.util.Iterator; import javax.xml.XMLConstants; import javax.xml.namespace.NamespaceContext; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory ; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.InputSource; public class NamespaceTest { public static void main(String[] argv) throws Exception { String doc = " namespace.xml"; String xPath = "/foo:document/bar:element"; // Parse the doc independently to get the root Element DocumentBuilderFactory fct = DocumentBuilderFactory.newInstance (); DocumentBuilder builder = fct.newDocumentBuilder(); Document document = builder.parse("file:" + doc); Element rootElement = document.getDocumentElement(); // Setup the namespace context XPathFactory factory = XPathFactory.newInstance(); XPath xp = factory.newXPath(); NamespaceContext ctx = new MyNamespaceContext(); xp.setNamespaceContext(ctx); // Create an InputSource of the file InputSource is = new InputSource(doc); // This works String resultString1 = xp.evaluate(xPath,is); // This doesn't String resultString2 = xp.evaluate (xPath,rootElement); System.out.println("RES1=" + resultString1); System.out.println("RES2=" + resultString2); } } class MyNamespaceContext implements NamespaceContext { public String getNamespaceURI(String prefix) { if (prefix.equals("foo")) return "http://apache.org/foo"; else if ( prefix.equals("bar")) return "http://apache.org/bar"; else return XMLConstants.NULL_NS_URI; } public String getPrefix(String namespace) { if (namespace.equals("http://apache.org/foo")) return "foo"; else if (namespace.equals(" http://apache.org/bar")) return "bar"; else return null; } public Iterator getPrefixes(String namespace) { return null; } } When I execute this (against Xalan 2.7.0), resultString1 returns "MyBar" correctly, resultString2 is set as empty string. Surely they should both return the correct result? Interestingly, if I use the exact same code to evaluate a namespace-free expression, both versions work fine. Is this a bug, or am I doing something stupid with the rootElement I am passing in? Any and all assistance greatly appreciated, Jason