+and compile_path paths trans states =
+ List.fold_left (fun (aphi, atrans, astates) p ->
+ let phi, ntrans, nstates = compile_single_path p atrans astates in
+ (Ata.SFormula.or_ phi aphi),
+ ntrans,
+ nstates) (Ata.SFormula.false_,trans,states) paths
+
+and compile_single_path p trans states =
+ let steps =
+ match p with
+ | Absolute steps ->
+ (Ancestor false, QNameSet.singleton QName.document, [])::steps
+ | Relative steps -> steps
+ in
+ compile_step_list steps trans states
+and compile_step_list l trans states =
+ match l with
+ [] -> Ata.SFormula.true_, trans, states
+ | (axis, test, elist) :: ll ->
+ let phi0, trans0, states0 = compile_step_list ll trans states in
+ let phi1, trans1, states1 =
+ compile_axis_test axis test phi0 trans0 states0
+ in
+ List.fold_left (fun (aphi, atrans, astates) e ->
+ let ephi, etrans, estates = compile_expr e atrans astates in
+ aphi %% ephi, etrans, estates) (phi1, trans1, states1) elist