1:- module(xml, [xml_element/2, modify_element/3]).    2
    3% Select an xml element Element from E
    4xml_element(Element, E) :-
    5    is_list(E) ->
    6        member(Child, E),
    7        xml_element(Element, Child);
    8
    9    Element = E.
   10xml_element(Element, element(_Name, _Attrs, Children)) :-
   11    member(Child, Children),
   12    xml_element(Element, Child).
   13
   14% Pred should only match elements that should be modified
   15% The first matching element in Element will be modified, and the entire structure returned as NewElement.
   16modify_element(Pred, Element, NewElement) :-
   17    is_list(Element) ->
   18        select(Child, Element, TempElement),
   19        modify_element(Pred, Child, NewChild),
   20        select(NewChild, NewElement, TempElement);
   21
   22    call(Pred, Element, NewElement).
   23modify_element(Pred, element(Name, Attrs, Children), element(Name, Attrs, NewChildren)) :-
   24    select(Child, Children, TempChildren),
   25
   26    (
   27        call(Pred, Child, NewElement) -> true;
   28
   29        modify_element(Pred, Child, NewElement)
   30    ),
   31
   32    select(NewElement, NewChildren, TempChildren)