I'm using xalan-j 2.7.0; testing using the ApplyXPathDOM sample code. ==== Sample XML document:
=== <?xml version="1.0" encoding="utf-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <ns:registerOfferResponse xmlns:ns="http://biz.aol.com/schema/2006-12-18"> <ns:result>0</ns:result> </ns:registerOfferResponse> </soapenv:Body> </soapenv:Envelope> === Using the XPath //ns:result generates the error: "Prefix must resolve to a namespace: ns" If I move the declaration to the top-level element in the xml document, as in === <?xml version="1.0" encoding="utf-8"?> <soapenv:Envelope xmlns:ns="http://biz.aol.com/schema/2006-12-18" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <ns:registerOfferResponse> <ns:result>0</ns:result> </ns:registerOfferResponse> </soapenv:Body> </soapenv:Envelope> === then the XPath //ns:result works fine. I get the same error as before if "ns" is declared in the Body element. It apears that the XPath processing requires the namespace to be defined only in the top-level element, whereas AIUI XML allows the namespace to be defined on first use of an namespace. Is this correct? If so, is there any way to tell xalan to use the namespace declarations from child elements? BTW, I have seen a work-round, which is to use the query: //*[local-name()='result' and namespace-uri()='http://biz.aol.com/schema/2006-12-18' ] but that is really messy. S///