[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] Does the count() function require access to the whole subtree?

Subject: Re: [xsl] Does the count() function require access to the whole subtree?
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxx>
Date: Sun, 12 Jan 2014 15:58:14 -0500


I think the confusion here is because we are talking about two different

Within the context of node $n, count($n) would be an inspection
operation. Dimitre points out that we know the answer would be 1
(statically), but this isn't always the case, for example, for
count($n[expr]. If expr can also be found by inspection -- say in the
case of count($n[starts-with(local-name(),'c'))], we are okay.

It's traversing the subtree rooted at $n that's not an inspection
operation; this requires access to the nodes under $n, so it would be
an absorption operation. So from context $n, count($n/some/path) is
not going to be streamable unless we allow it to "absorb" $n in doing
so -- not because of the count(), but because of the traversal.

Just winging it here, but this makes sense doesn't it?

Cheers, Wendell

BTW, Dimitre, remember that for some nodes, count(..) returns 0..,. :-)
Wendell Piez | http://www.wendellpiez.com
XML | XSLT | electronic publishing
Eat Your Vegetables

On Sun, Jan 12, 2014 at 2:27 PM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
>> Michael, doesn't the count() function require access to the whole subtree?
How would a count be conducted by sitting at the top of a subtree? Perhaps you
meant to say that the count() function is an absorption operation?
> If you are evaluating count() or exists() on a sequence of nodes S, then
when you encounter a node N that is a member of this sequence you know its
impact on the result as soon as you see its start tag; you do not need to look
at its subtree. This makes it different from, say, sum() or "=". This means
that the existence of overlapping nodes within S is no problem for count() or
exists(), whereas it is a problem for sum() or "=".
> Michael Kay
> Saxonica

Current Thread