From cfaff4165f266dc2273989c9a62f3fd31c1f57ec Mon Sep 17 00:00:00 2001 From: Huibo SHI Date: Tue, 18 Mar 2014 18:41:08 +0100 Subject: [PATCH] ajoute l'evaluation d'attributes --- src/query_tree.ml | 2 +- src/table.ml | 45 ++++++++++++++++++++++++++++----------------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/query_tree.ml b/src/query_tree.ml index 018036b..1599c4c 100644 --- a/src/query_tree.ml +++ b/src/query_tree.ml @@ -63,7 +63,7 @@ and compile_step_list p = let open Xpath.Ast in match a with Self -> Self - | Attribute -> assert false + | Attribute -> Parent | Child -> Parent | Descendant b -> if not b then (Ancestor false) diff --git a/src/table.ml b/src/table.ml index 91bb85e..6da21c5 100644 --- a/src/table.ml +++ b/src/table.ml @@ -105,52 +105,63 @@ and eval_star tree ls lr = let keep_elements t l = List.filter (fun n -> match Naive_tree.kind t n with - | Element | Text | Document -> true | _ -> false) l + | Element | Text | Document | Attribute -> true | _ -> false) l + +let keep_attributs t l = + List.filter (fun n -> match Naive_tree.kind t n with + | Attribute ->true | _ -> false) l let rec eval_axis tree ls a = let open Xpath.Ast in - let res = - (* let ls = List.sort ( fun a b -> compare (Naive_tree.preorder tree a ) (Naive_tree.preorder tree b ) ) ls in ़crir dans la log!!!!!*) match a with - Self -> ls + Self -> keep_elements tree ls - | Attribute -> assert false + | Attribute -> let lfc = eval_move tree ls Firstchild in + let lc = eval_star tree lfc [Nextsibling] in + keep_attributs tree lc | Child -> let lfc = eval_move tree ls Firstchild in - eval_star tree lfc [Nextsibling] + let lc = eval_star tree lfc [Nextsibling] in + keep_elements tree lc | Descendant c -> let lfc = eval_move tree ls Firstchild in let ls2 = eval_star tree lfc [Firstchild;Nextsibling] in - - (* List.merge (compare_node tree) (if c then ls else []) - (List.merge (compare_node tree) ls2 ls)*) - + let ldes = if not c then ls2 else List.merge (compare_node tree) ls2 ls + in + keep_elements tree ldes | FollowingSibling -> let lnexts = eval_move tree ls Nextsibling in - eval_star tree lnexts [Nextsibling] + let lfs = eval_star tree lnexts [Nextsibling] in + keep_elements tree lfs | Parent -> let lprevs = eval_star tree ls [Prevsibling] in - eval_move tree lprevs Revfirstchild + let lp = eval_move tree lprevs Revfirstchild in + keep_elements tree lp | Ancestor b -> let ls2 = eval_star tree ls [Revfirstchild;Prevsibling] in let ls3 = eval_move tree ls2 Revfirstchild in + let lac = if not b then ls3 else List.merge (compare_node tree ) ls3 ls + in + keep_elements tree lac | PrecedingSibling -> let ls2 = eval_star tree ls [Prevsibling] in - eval_move tree ls2 Prevsibling + let lps = eval_move tree ls2 Prevsibling in + keep_elements tree lps | Preceding -> let ls2 = eval_axis tree ls (Ancestor true) in let ls3 = eval_axis tree ls2 PrecedingSibling in - eval_axis tree ls3 (Descendant true) + let lp = eval_axis tree ls3 (Descendant true) in + keep_elements tree lp | Following -> let ls2 = eval_axis tree ls (Ancestor true) in let ls3 = eval_axis tree ls2 FollowingSibling in - eval_axis tree ls3 (Descendant true) - in - keep_elements tree res + let lf = eval_axis tree ls3 (Descendant true) in + keep_elements tree lf + -- 2.17.1