XmlNode = type { tag: string; attrs: [string]; content: string}. Tree = type(Leaf) Tree [Leaf; [Tree(Leaf)]]. XmlTree = Tree(XmlNode). query = function(tree: XmlTree): [XmlTree] { children : context(children) = case default [] case (tree[0]: NeedChildren(childrenFilters), ApplyTransform(transFilters)) { loop fold (tree[1]->child: Tree(Leaf) | childrenFilters; []->accum). {accum + traverse(child): cases(transFilters) }; } node = case (node.tag == "style:style"; class = node[attrs, "style:name"]; exists(class, ParaKnownClasses)) { [class, node[attrs, "style:display-name"]]; } case default [] ; Tree[node children] | node + children } /* traverse = function(trees: [XmlTree]) : [XmlTree] loop fold(trees->tree: Tree; []->acc) acc + traverse(tree) */