At the risk of over-elaborating, here is one way of thinking about assembling these filters:
Two steps
- Gathering one or more harvests, and
- using the set operators to ask for the overlap or combination of multiple harvests, or to subtract one harvest from another
Gathering a harvest by alternating outline steps with filters
Gathering each harvest involves a longer or shorter series of alternations:
Outline axis then filter,
then outline axis then filter,
etc …
Each harvest begins with an outline axis, even if we don’t specify one.
Often we will start with //
(= anywhere in the whole outline),
and if we don’t specify a starting outline axis, the default will automatically be /
(= the level 1 [top level] lines, for example single #
headers)
After the outline axis, we can add a boolean filter, using brackets if it helps:
//(@start > "2014-09-30" or @done)
And after the filter, we can further refine or extend the harvest, from where we have got to so far, with another outline axis step, and a further filter.
//(not @done)/descendant-or-self::*"
The filter in this example is just a *
(= anything) but it could be a more restrictive filter:
//(not @done)/descendant-or-self::(@start < "2015-09-30")
and we can go on adding alternating outline axis steps and filter steps until we have exactly the harvest that we want,
and then finally use set operators to get the combination or difference/overlap of this harvest with any other harvests which we have assembled.