default_filname = "project/documentation.fodt" : string; /* require ptrvalid */ /* local scope doc ptr */ XmlNode = type { tag: string; attrs: [string]; content: string}. Tree = type(Leaf) Tree [Leaf; [Tree(Leaf)]]; XmlTree = Tree(XmlNode); children = function: (tree: xmlNodePtr)->XmlTree { childrenRaw = tree[xmlChildrenNode]: [xmlNodePtr], linkedlist(next, null); map (childrenRaw->childRaw: xmlNodePtr) { Tree[childRaw[name] children(childRaw)] } } document = function: (filename: string)->XmlTree { docRaw = xmlParseFile(docname.c_str()) : xmlDocPtr; nodeRaw= xmlDocGetRootElement(docRaw) : xmlNodePtr; Tree [nodeRaw[name] children(nodeRaw)); } query = function: (tree: XmlTree) [string, string] { 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 [] ; node + children; } test = function: ()->num { data = query(document(default_filename)): [string, string]; exists(data, "pgess1"). }