sebb
2007-09-03 14:14:51 UTC
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///
====
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///