let $test := element div0{ attribute id { 4 }, element div1 { attribute id { 3 }, element div1 { attribute id { 2 }, element para { attribute id { 1 }, element child { } } } } }
I want to get the "smallest" div1 for a given child. this is, the <div1 id=2> element. As far as I've understood the answers given here, reverse axes are ordered from the context node, so the expression $test//child/ancestor-or-self::div1[1] will get me what i want, while $test//child/parent() will give me <para id=1> Needless to say, my data is not particularly well behaved :) Thanks! On Wed, Apr 16, 2014 at 3:16 PM, David Rudel <fwqhg...@gmail.com> wrote: > I apologize if I'm being dense, but I don't understand how the nearest > ancestor can be anything other than the parent. Could you please give > an example? > > I just want to make sure I haven't sent you off with the wrong > expression for your intended usage. > > On Wed, Apr 16, 2014 at 8:48 PM, José Tomás Atria <jtat...@gmail.com> > wrote: > > Thank you all for your answers. > > > > I was just tryig to determine if $test/ancestor::element()[1] would be > the > > correct way of getting the nearest ancestor, as I couldn't find whether > axes > > were ordered or not in the xpath specification. > > > > Thanks! > > > > ps: Parent doesn't apply, because the relevant node is not always the > > parent, but the first node with a given name. > > > > > > On Wed, Apr 16, 2014 at 2:45 PM, David Rudel <fwqhg...@gmail.com> wrote: > >> > >> Mr. Atria, > >> You left out a key element from the answer you got from stack overflow. > >> > >> Note that Dimitre's response used a filter expression > >> (path expression) [predicate] > >> > >> not a simple path expression > >> > >> The ()s are critical. > >> > >> $test//child/ancestor-or-self::test[ last() ] > >> > >> is very different from > >> > >> ($test//child/ancestor-or-self::test)[ last() ] > >> > >> The ancestor axis is a reverse axis, but when the xpath expression is > >> complete, the sequence of nodes are then put in document order > >> regardless of what order the last axis had. > >> > >> In any event, I don't understand what is wrong with simply > >> $test/ancestor::element()[1] > >> > >> Perhaps I don't understand your question (which is simpler than the > >> Stack Overflow question you linked to). But if you are just looking > >> for the nearest ancestor element, then it seems that > >> $test/ancestor::element()[1] should give it to you. > > > > > > > > > > -- > > entia non sunt multiplicanda praeter necessitatem > > > > -- > > "A false conclusion, once arrived at and widely accepted is not > dislodged easily, and the less it is understood, the more tenaciously > it is held." - Cantor's Law of Preservation of Ignorance. > -- entia non sunt multiplicanda praeter necessitatem