Peter, --- Peter Neumcke <[EMAIL PROTECTED]> wrote: > Hi Dimitri, > thanks for your reply. > > In my case, I've got a strict tree of Objects with only on Root > Object. If there was a property on every child called "parent" or something like that, you could use that property instead of the ".." axis.
> As far as I understand it, there's no way to evaluate an XPath > starting with > '../' on a context somewhere down that tree. That's correct. > There's something, I still don't really understand: if '../' can't be > evaluated because there's no way to get the parent node, how is an > absolute > XPath like '/foo/bar' evaluated? Does this involve getting the parent > context or is it evaluated against the current context? The initial slash in the path indicates the root node, not its parent. > What options do I have for a large tree of objects, where relative > XPath-Expressions need to get the parent node? > * always use absolute XPath expressions (I saw that expressions are > cached > using soft references, but isn't this approach rather ineffective?) Right. It's just the last resort for applications that cannot do their own caching of expressions for some reason. > * build my own 'chain of context' and evaluate starting '../' myself, > only > invoke JXPath with cleand up XPath expression This can indeed be done. You would pretty much have to override everything starting with the JXPathContext, because you would need a custom Compiler that would allocate a custom LocationPath, which would then allocate a custom ParentContext. > Did I miss an easy option of customizing JXPath to get the desired > effects? Let me think about adding the notion of a relative context to JXPath itself. This is the second or third time I hear this requirement from different people. Maybe it is time to take it seriously. How about something like: context.getRelativeContext(pointer); Let me think about it. > Thanks for your help, > Peter Thanks for bringing up this issue. - Dmitri > > > > -----Ursprungliche Nachricht----- > > Von: Dmitri Plotnikov [mailto:[EMAIL PROTECTED]] > > Gesendet: Mittwoch, 12. Februar 2003 22:33 > > An: Jakarta Commons Users List > > Betreff: Re: [JXPATH] parentContext not used for XPath starting > with > > '../' > > > > > > Peter, > > > > The parent-child relationship between contexts has nothing to do > with > > the parent-child relationship between beans. The child context > > inherits variables, extension functions, locale etc from the parent > > context, but nothing about the root bean. > > > > In JXPath there is no mechanism for the traversal from the > > root bean to > > its ancestors. > > > > Here's an excerpt from the documentation that explains how > > the parent:: > > axis is implemented: > > > > <quote> > > In DOM/JDOM the definition of a node's parent is clear: a Node > > always points to its parent. XML is a strict tree, so there always > > exactly one parent for every node except the root. > > > > With other models the situation is more complex. The model can > no > > longer be described as a tree. In many cases it is a > > complicated graph > > with many paths to the same node and even referential cycles > > where node > > A is node B's child, but also node B is node A's child. Even if the > > graph is a strict tree, a node of that tree may not have a pointer > to > > its parent. > > > > Because of all these issues, JXPath abandons the static notion > of a > > parent/child relationship in favor of a dynamic one. When an XPath > is > > evaluated, the engine performs a series of searches and > > computations in > > so called evaluation contexts. For example, when the "/foo/bar" > path > > is evaluated, JXPath first looks for a node named "foo" in the root > > evaluation context. If such a node is found, the interpreter forms > a > > new context for the discovered node and searches for a node > > named "bar" > > in that context. > > > > This chain of contexts is used in JXPath to define the > parent-child > > relationship. Parent is the base node of the previous evaluation > > context in the chain. A more appropriate name for the "parent::" > axis > > would then be "step back". > > > > Consider this example. The evaluated path is > > "foo//bar/../baz". In > > the process of evaluating of this path, the engine will walk the > graph > > forming chains of context like "/foo/a/b/c/bar". Once a node with > the > > name "bar" is found, the engine will "step back": in our case it > will > > go back to the "/foo/a/b/c" context and then look for the > > node with the > > name "baz" in that context. > > </quote> > > > > I hope this explanation helps. > > > > - Dmitri > > > > > > --- Peter Neumcke <[EMAIL PROTECTED]> wrote: > > > Hi people, > > > I have a question, which I couldn't answer by reading the docs. > > > > > > What happens, if the XPath uses '../' at the beginning to > > go back one > > > step? > > > Will the parentContext be used to evaluate the XPath? > > > > > > Here's my testcode (adapted from the original test code): > > > > > > public void testRootHandling(){ > > > if (!enabled){ > > > return; > > > } > > > System.out.println("testing root handling start"); > > > JXPathContext context = JXPathContext.newContext(bean); > > > JXPathContext nestedContext = > > > JXPathContext.newContext(context, > > > bean.getNestedBean()); > > > testGetValue(nestedContext, "/boolean", Boolean.FALSE); > > > System.out.println("accessing /boolean in nested context > > > worked!"); > > > testGetValue(nestedContext, "../boolean", Boolean.FALSE); > > > System.out.println("accessing ../boolean in nested > context > > > worked!"); > > > } > > > > > > The corresponding output: > > > test.jxpath: > > > [echo] Running JXPath tests ... > > > [java] .testing root handling start > > > [java] accessing /boolean in nested context worked! > > > [java] E..... > > > [java] Time: 1.578 > > > [java] There was 1 error: > > > [java] 1) > > > testRootHandling(org.virbus.websheet.jxpath.JXPathTestCase) > > > [java] org.apache.commons.jxpath.JXPathException: No value > for > > > xpath: > > > ../boolean > > > [java] at > > > > > org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getVal > > ue(JXPathConte > > > xtReferenceImpl.java:206) > > > [java] at > > > > > org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getVal > > ue(JXPathConte > > > xtReferenceImpl.java:200) > > > [java] at > > > > > org.virbus.websheet.jxpath.JXPathTestCase.testGetValue(JXPathT > > estCase.java:3 > > > 99) > > > [java] at > > > > > org.virbus.websheet.jxpath.JXPathTestCase.testRootHandling(JXP > > athTestCase.ja > > > va:178) > > > [java] at > > > sun.reflect.NativeMethodAccessorImpl.invoke0(Native > > > Method) > > > [java] at > > > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccess > > orImpl.java:39 > > > ) > > > [java] at > > > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMeth > > odAccessorImpl > > > .java:25) > > > > > > > > > It looks like it's possible to go back using '/' at the > beginning, > > > but using > > > '../' doesn't work. Has anyone got some advice? > > > I'm using commons-jxpath-1.0 > > > > > > I'm new to JXPath, so excuse me, if I understood something wrong > or > > > if > > > there's an obvious solution. > > > > > === message truncated === __________________________________________________ Do you Yahoo!? Yahoo! Shopping - Send Flowers for Valentine's Day http://shopping.yahoo.com --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
