Add a kind element to the node tree. Improve support for XPath by
[tatoo.git] / src / xpath / ast.ml
index d70227b..64c6c8d 100644 (file)
@@ -14,7 +14,7 @@
 (***********************************************************************)
 
 (*
 (***********************************************************************)
 
 (*
-  Time-stamp: <Last modified on 2013-03-04 16:24:20 CET by Kim Nguyen>
+  Time-stamp: <Last modified on 2013-03-13 10:59:20 CET by Kim Nguyen>
 *)
 
 open Utils
 *)
 
 open Utils
@@ -30,7 +30,7 @@ and axis = Self | Attribute | Child
            | PrecedingSibling
            | Preceding | Following
 
            | PrecedingSibling
            | Preceding | Following
 
-and test = QNameSet.t
+and test = QNameSet.t * Tree.Common.NodeKind.t
 
 and binop = Eq | Neq | Lt | Gt | Lte | Gte | Or | And | Add | Sub | Mult | Div | Mod
 and unop =  Neg
 
 and binop = Eq | Neq | Lt | Gt | Lte | Gte | Or | And | Add | Sub | Mult | Div | Mod
 and unop =  Neg
@@ -52,7 +52,6 @@ let star =
   QNameSet.complement (
     QNameSet.from_list [ QName.text;
                          QName.document;
   QNameSet.complement (
     QNameSet.from_list [ QName.text;
                          QName.document;
-                         QName.cdata_section;
                          QName.comment])
 
 
                          QName.comment])
 
 
@@ -128,18 +127,24 @@ and print_axis fmt a = pp fmt "%s" begin
   | Following -> "following"
 end
 
   | Following -> "following"
 end
 
-and print_test fmt ts =
-  try
-    pp fmt "%s" (List.assoc ts
-                   [ text,"text()";
-                     node,"node()";
-                     star, "*" ] )
-  with
-    Not_found -> pp fmt "%s"
-      (if QNameSet.is_finite ts
-       then QName.to_string (QNameSet.choose ts)
-       else "<INFINITE>"
-      )
+and print_test fmt (ts,kind) =
+  let open Tree.Common.NodeKind in
+    match kind with
+      Text -> pp fmt "%s" "text()"
+    | Element | Attribute ->
+        pp fmt "%s" begin
+          if ts == star then "*"
+          else QName.to_string (QNameSet.choose ts)
+        end
+    | Comment -> pp fmt "%s" "comment()"
+    | ProcessingInstruction ->
+        pp fmt "processing-instruction(%s)"
+          begin
+            if ts == star then ""
+            else "'" ^ (QName.to_string (QNameSet.choose ts)) ^ "'"
+          end
+    | Node -> pp fmt "%s" "node()"
+    | Document -> pp fmt "%s" "<DOCUMENT>"
 
 and print_expr fmt = function
 | Number (`Int(i)) -> pp fmt "%i" i
 
 and print_expr fmt = function
 | Number (`Int(i)) -> pp fmt "%i" i
@@ -171,7 +176,8 @@ and print_expr fmt = function
 
 
 let invert_axis = function
 
 
 let invert_axis = function
-| Self | Attribute as a -> a
+| Self -> Self
+| Attribute -> Parent (* Improve *)
 | Child -> Parent
 | Descendant (b) -> Ancestor (b)
 | FollowingSibling -> PrecedingSibling
 | Child -> Parent
 | Descendant (b) -> Ancestor (b)
 | FollowingSibling -> PrecedingSibling