···11+open Types
22+33+module Prefix_map = Map.Make (String)
44+type t = string Prefix_map.t
55+66+let init ~(reserved : xmlns_attr list) =
77+ List.fold_left
88+ (fun env (attr : xmlns_attr) -> Prefix_map.add attr.prefix attr.xmlns env)
99+ Prefix_map.empty reserved
1010+1111+let xmlns_attr_of_qname (q : xml_qname) : xmlns_attr option =
1212+ match q.xmlns with
1313+ | None -> None
1414+ | Some xmlns -> Some {prefix = q.prefix; xmlns}
1515+1616+let xmlns_attr_is_new (attr : xmlns_attr) env : bool =
1717+ match Prefix_map.find_opt attr.prefix env with
1818+ | None -> true
1919+ | Some uri' -> uri' <> attr.xmlns
2020+2121+let extend (bindings : xmlns_attr list) env : t =
2222+ List.fold_left
2323+ (fun env (attr : xmlns_attr) -> Prefix_map.add attr.prefix attr.xmlns env)
2424+ env bindings
2525+2626+let xmlns_attrs_for_elt (elt : 'a xml_elt) env : xmlns_attr list =
2727+ let from_name =
2828+ match xmlns_attr_of_qname elt.name with None -> [] | Some b -> [b]
2929+ in
3030+ let from_attrs =
3131+ elt.attrs |> List.filter_map @@ fun attr -> xmlns_attr_of_qname attr.key
3232+ in
3333+ List.filter (fun attr -> xmlns_attr_is_new attr env) @@ from_name @ from_attrs
+7
lib/xml_names/Xmlns.mli
···11+open Types
22+33+type t
44+55+val init : reserved:xmlns_attr list -> t
66+val xmlns_attrs_for_elt : 'a xml_elt -> t -> xmlns_attr list
77+val extend : xmlns_attr list -> t -> t