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



Reply via email to