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///

Reply via email to