+
+
+ let tagged_foll t tag =
+ if tag = Tag.attribute || tag = Tag.pcdata then failwith "tagged_foll"
+ else match t with
+ | { doc=d; node=Node(NC n) } -> { t with node = norm (tagged_foll d n tag) }
+ | { doc=d; node=Node(SC (_,n)) } when is_nil n -> { t with node= Nil }
+ | { doc=d; node=Node(SC (_,n)) } ->
+ let nnode =
+ if tag_id d n == tag then n
+ else
+ let n' = tagged_desc d n tag in
+ if is_nil n' then tagged_foll d n tag
+ else n'
+ in {t with node= norm nnode}
+ | _ -> { t with node=Nil }
+
+
+ let tagged_desc t tag =
+ if tag = Tag.attribute || tag = Tag.pcdata then failwith "tagged_desc"
+ else match t with
+ | { doc=d; node=Node(NC n) } -> { t with node = norm (tagged_desc d n tag) }
+ | _ -> { t with node=Nil }
+
+
+ let tagged_next t tag =
+ if tag = Tag.attribute || tag = Tag.pcdata then failwith "tagged_next"
+ else match t with
+ | { doc=d; node=Node(NC n) } -> { t with node = norm (tagged_next d n tag) }
+ | { doc=d; node=Node(SC (_,n)) } -> { t with node = norm (tagged_next d n tag) }
+ | _ -> { t with node=Nil }
+
+ let subtree_tags t tag =
+ match t with
+ { doc = d; node = Node(NC n) } -> subtree_tags d n tag
+ | _ -> 0
+
+
+
+ let has_tagged_foll t tag = is_node (tagged_foll t tag)
+ let has_tagged_desc t tag = is_node (tagged_desc t tag)
+