Add option -nw control the wrapping of results in an <xml_result/> node.
[SXSI/xpathcomp.git] / src / nodeSet.ml
index 944f85c..fc0bb0e 100644 (file)
@@ -24,7 +24,7 @@ module type S =
     val iter : ( elt -> unit) -> t -> unit
     val fold : ( elt -> 'a -> 'a) -> t -> 'a -> 'a
     val length : t -> int
-    val serialize : string -> Tree.t -> t -> unit
+    val serialize : string -> bool -> Tree.t -> t -> unit
 
   end
 
@@ -52,7 +52,13 @@ module Count : S with type t = int =
     let fold _ _ _ = failwith "fold not implemented"
     let map _ _ = failwith "map not implemented"
     let length x = x
-    let serialize _ _ _ = ()
+    let serialize f b _ x =
+      let o = open_out f in
+      if not b then output_string o "<xml_result>\n";
+      output_string o (string_of_int x);
+      output_char o '\n';
+      if not b then output_string o "</xml_result>\n";
+      close_out o
   end
 
 type  clist =
@@ -117,13 +123,13 @@ module Mat : S with type t = Tree.node mat =
       if Tree.tag tree t == tag then t
       else Tree.tagged_descendant tree t tag
 
-    let fst_element tree t =
+(*
+  let fst_element tree t =
       let tag = Tree.tag tree t in
-      let t = if Ptset.Int.mem tag
-         (Ptset.Int.remove Tag.document_node (Tree.element_tags tree))
-       then t
-       else Tree.first_element tree t
-      in Tree.first_element tree t
+      if tag == Tag.document_node then
+        Tree.first_element tree t
+      else t
+*)
 
     let element_fold f tree t acc =
       let rec loop node acc =
@@ -133,17 +139,11 @@ module Mat : S with type t = Tree.node mat =
          let acc' = loop (Tree.first_element tree node) acc in
            loop (Tree.next_element tree node) acc'
       in
-       loop (fst_element tree t) acc
+      let t' = Tree.first_element tree t in loop t' acc
 
     let element_iter f tree t =
-      let rec loop node =
-       if node != Tree.nil then begin
-         f node;
-         loop (Tree.first_element tree node);
-         loop (Tree.next_element tree node)
-       end
-      in
-      let t' = fst_element tree t in loop t'
+      let newf = fun e () -> f e in
+      element_fold newf tree t ()
 
     let tag_fold f tree t tag acc =
       let rec loop close node acc =
@@ -192,17 +192,19 @@ module Mat : S with type t = Tree.node mat =
 
     let length l = l.length
 
-    let serialize name v l =
+    let serialize name v l =
       let fd, finish =
        if name = "-" then Unix.stdout, ignore
        else
          Unix.openfile name [ Unix.O_WRONLY; Unix.O_TRUNC; Unix.O_CREAT ] 0o666,
          Unix.close
       in
-      ignore (Unix.write fd "<xml_result>\n" 0 13);
-      iter (fun node -> Tree.print_xml v node fd) l;
-      Tree.flush v fd;
-      ignore (Unix.write fd "</xml_result>\n" 0 14);
+      if not b then ignore (Unix.write fd "<xml_result>\n" 0 13);
+      if l.length > 0 then begin
+       iter (fun node -> Tree.print_xml v node fd) l;
+       Tree.flush v fd;
+      end;
+      if not b then ignore (Unix.write fd "</xml_result>\n" 0 14);
       finish fd
 
   end