- From: Holger Meuss <meuss@cis.uni-muenchen.de>
- Date: Tue, 26 Feb 2002 14:04:02 +0100 (CET)
- To: "Kay, Michael" <Michael.Kay@softwareag.com>
- Cc: Holger Meuss <meuss@cis.uni-muenchen.de>, www-xpath-comments@w3.org
Hello, Kay, Michael writes: > I look forward to seeing your solution. I think it will inevitably have the > property that you have to break serial processing to some extent: you can't > decide whether a particular <head> element will be selected by the > expression preceding-sibling::head[position()<=3] at the time you read the > <head> element, at best you have to keep a rolling buffer containing the > last three <head> elements encountered, and the final result is the contents > of this butter at the time the original context node is reached. > In fact there are two levels: The syntactic and the processing level. On a syntactic level it is easy to see that e.g. descendant::a/preceding-sibling::b[position()<=3] is equivalent to descendant::b[following-sibling::a][position()>last()-3]. How this is evaluated is not really our cup of tea, but you are right, one needs a rolling buffer. This may result in a little computational overhead compared to the evaluation of the original qualifier. But, consider the location path descendant::a/preceding-sibling::b[position()>last()-3] which can be rewritten to descendant::b[following-sibling::a][position()<=3]. Here, the situation is exactly vice versa, because the second qualifier [position()<=3] can be evaluated without a rolling buffer (in contrast to the first qualifier [position()>last()-3]). It seems to me that the need for a rolling buffer is not raised by the way our rewritten paths look like. But the integration of positional functions still needs some considerations: Our algorithm exploits for one of the two sets of rules the fact that qualifiers commutate, i.e. p[q1][q2]=p[q2][q1]. This is only true if the qualifiers do not contain positional functions. But for the other set of rules (called "general equivalences") there is no problem. Consider /descendant::a[position()=5][preceding-sibling::b] This can be rewritten to: /descendant::a[position()=5][/descendant::b/following-sibling::a==self::a] Yours, Holger
Received on Tuesday, 26 February 2002 08:04:04 UTC