There was a problem in my xpath expression. /foo:doc/name should be /foo:doc/foo:name , however fixing that was not sufficient.
I upgraded to Xalan 2.5 D1, and that helped. In other words, ApplyXPathDOM, with NO code modifications, under Xalan 2.5 D1, with the file
<?xml version="1.0"?> <foo:doc xmlns:foo="http://foo.org"> <foo:name first="David" last="Marston"/> <foo:name first="David" last="Bertoni"/> <foo:name first="Donald" last="Leslie"/> <foo:name first="Emily" last="Farmer"/> <foo:name first="Joseph" last="Kesselman"/> <foo:name first="Myriam" last="Midy"/> <foo:name first="Paul" last="Dick"/> <foo:name first="Stephen" last="Auriemma"/> <foo:name first="Scott" last="Boag"/> <foo:name first="Shane" last="Curcuru"/> </foo:doc>
and the invocation java ApplyXPathDOM fooprefix.xml /foo:doc/foo:[EMAIL PROTECTED]'David']
WORKS.
But when I tried complicating things a bit, I still get errors.
-- fooprefix.xml --
<?xml version="1.0"?> <foo:doc xmlns:foo="http://foo.org"> <in:section name="ls" xmlns:in="http://junky.com"> <in:index id="crud"> <ls:names xmlns:ls="http://namesls.org"> <ls:name first="David" last="Marston"/> <ls:name first="David" last="Bertoni"/> <ls:name first="Donald" last="Leslie"/> <ls:name first="Emily" last="Farmer"/> <ls:name first="Joseph" last="Kesselman"/> <ls:name first="Myriam" last="Midy"/> <ls:name first="Paul" last="Dick"/> <ls:name first="Stephen" last="Auriemma"/> <ls:name first="Scott" last="Boag"/> <ls:name first="Shane" last="Curcuru"/> </ls:names> </in:index> </in:section> </foo:doc>
Now when I try running:
java ApplyXPathDOM fooprefix.xml /foo:doc/in:[EMAIL PROTECTED]'ls']
I still get
Exception in thread "main" org.w3c.dom.DOMException: Prefix must resolve to a namespace: in
at org.apache.xpath.domapi.XPathEvaluatorImpl.createExpression(XPathEval
uatorImpl.java:210)
ONE way to get around this is to put all my namespace xmlns attributes into the top node - then it runs through.
We are not too happy with this solution either!
And more strange things:
-- The DOMException from the xpath expression below says: Prefix must resolve to namespace: in
/foo:doc/in:[EMAIL PROTECTED]"ls"]
-- I thought maybe I should put in a predicate in for the namespace, so I tried a few possibilities:
/foo:doc/in:[EMAIL PROTECTED]'ls'[EMAIL PROTECTED]:in='http://junky.com']
and still get the same error.
I tried moving the xmlns:in predicate "up" to foo:doc, like this: /foo:[EMAIL PROTECTED]:in="http://junky.com"]/in:[EMAIL PROTECTED]'ls']
When there are single quotes around http://junky.com,
I get the same error about the namespace : in , but when I put double quotes around http://junky.com , I get
Exception in thread "main" org.w3c.dom.DOMException: Prefix must resolve to a namespace: http
which I thought was really strange.
So what is the correct way to xpath through namespaces?
Thanks for helping!
-- Susan
