xml-xmlbeans-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Grant Kushida" <Grant.Kush...@Overture.com>
Subject XPath + Namespaces
Date Mon, 19 Jul 2004 23:40:42 GMT
I'm having trouble using XMLBeans and XPath to select nodes from a document which uses namespaces.
I'm using the 1.0.3 binary tarball build.

I have a simple schema, which looks something like:
  <a:workbench xmlns:a="http://blah.com/a">
    <a:value name="foo"/>
    <a:value name="bar"/>

I'd like to write xpaths such as:
  //a:value 		- get all values
  //a:value[@exact='foo'] 	- get all values named 'foo'

However, using the documented syntax:
  declare namespace a='http://blah.com/a' //a:value[@exact='foo']

does not return any results. Omitting the 'declare namespace' section does not return anything

After some investigation into the xmlbeans code (org.apache.xmlbeans.impl.store.Path), it
seems that xpaths with namespaces and/or predicates get handled via Jaxen's XPath engine,
instead of the internal xmlbeans engine.

Using Jaxen directly, you'd have to call org.jaxen.BaseXPath.addNamespace() to define namespaces
programmatically - there does not seem to be a way to do this within the xpath String expression
itself. But, the PathImpl/XBeansDelegate classes don't allow for any additional parameters,
and also don't specify a generic way to define namespaces with each Xpath engine implementation.

So, I worked (alright, hacked) around the problem by calling addNamespace() on org.apache.xmlbeans.impl.xpath.jaxen.XBeansXPathAdv,
which subclasses org.jaxen.BaseXPath. However, since I had no way to pass namespaces in, and
was too lazy to parse strings, I just added my own namespace which is fine for my purposes.

How is this supposed to work? Seems to me that you should be able to pass in a prefix-uri
Map in XMLOptions, perhaps using setLoadAdditionalNamespaces(), or parse the 'declare namespace'
from the xpath string. Either way, the PathImpl/XBeansDelegate infrastructure would have to
handle that specifically for each XPath implementation. 

Or is there another way to do this?

View raw message