- From: Gregor Karlinger <gregor.karlinger@iaik.at>
- Date: Mon, 8 Jul 2002 18:41:22 +0200
- To: <merlin@baltimore.ie>
- Cc: "'Joseph M. Reagle Jr. \(Joseph M. Reagle Jr.\)'" <reagle@w3.org>, "'XMLSigWG'" <w3c-ietf-xmldsig@w3.org>
- Message-ID: <004001c2269e$51454e60$2305a8c0@iaik.at>
Merlin, > r/gregor.karlinger@iaik.at/2002.07.08/12:48:30 > >I have the following comment on the current XPath filter 2.0 draft: > > > >The first bullet of the inner list in the performance paragraph in > >section 3.4 says: > > > > "Any time a node is encountered that is in any evaluated node > > set S, update Z ..." > > > >I think this is incorrect. The flag Z must be updated for > each node of the input node set. <merlin> > I think that the flag Z can only change state if a node from > a filter node set is encountered. </merlin> Merlin, maybe I misunderstand what is said in the draft, but let me work out the specified algorithm with the following example: Sample input: <Root><Select/><DontSelect/></Root> Transform params: single intersect filter, xpath="//Select" Step 1: For each XPath expression X, in sequence, evaluate the expression and store the resulting node set, S We only have one filter, whose node set S is {Elem(Select)} Filter("Intersect", {Elem(Select)}) Step 2: Prepend a node set consisting of just the document node, along with the operation union. So we have another filter Filter("Union", {Doc} Step 3: Create a new, empty filter node set. OK, denote it FilterNodeSet({}) After the first three init steps we have the following setting: InputDocument({Doc, Elem{Root}, Elem{Select}, Elem{DontSelect}) FilterList ( Filter("Union", {Doc} Filter("Intersect", {Elem(Select)}) ) FilterNodeSet({}) FlagZ(undefinded) Step 4: Iterate through the input document in document order, adding each node that is encountered to the filter node set F if a flag Z is true. This flag is computed as follows: Any time a node is encountered that is in any evaluated node set S, update Z ... first iteration: Doc - Doc is in first filter node set, therefore update flag Z: - Last "Union" filter is our first filter - Doc is not in subsequent expanded "Intersect" filter node set => FlagZ(false) - Doc will not make it in the FilterNodeset => FilterNodeSet({}) second iteration: Elem(Root) - Elem(Root) is in no filter node set, so do not update FlagZ => FlagZ(false) - Elem(Root) will not make it in the FilterNodeset => FilterNodeSet({}) third iteration: Elem(Select) - Elem(Select) is in the second filter node set, therefore update flag Z: - Last "Union" filter is our first filter - Elem(Select) is in the subsequent expandend "Intersect" filter node set => FlagZ(true) - Elem(Select) is our first member of FilterNodeSet => FilterNodeSet({Elem(Select)}) fourth iteration: Elem(DontSelect) - Elem(DontSelect) is in no filter node set, so do not update FlagZ => FlagZ(true) - Elem(DontSelect) will make it in the FilterNodeset, since FlagZ is still true. => FilterNodeSet({Elem(Select), Elem(DontSelect)}) So, if this interpretation of the specified algorithm is correct, we have a FilterNodset({Elem(Select), Elem(DontSelect)}, although the intention of the filter should be to select Elem(Select) only. Am I missing something here? Regards, Gregor
Received on Monday, 8 July 2002 12:44:51 UTC