module di TreeICG(ElementICG e) { Tree : Leaf | Branch . Leaf = Data @ e. Branch = Data @ e ListOfTree. ListOfTree : Empty | NonEmpty. Empty = . NonEmpty = Tree ListOfTree. } aspect TreeWalker { declare strategy declare traversal declare constraints } // visitor classes end module di ElementICG { Data = Name_ValuePair_List. NameValuePair = Name Value. Name = . Value = . Name_ValuePair_List : Empty | NonEmpty. Empty = . NonEmpty = NameValuePair Name_ValuePair_List. } aspect ElementWalker { declare constraints declare strategy declare traversal } // visitor classes end module di Decide { F = Constraints. Constraints : E | N. E = . N = Constraint Constraints. Constraint = RelNumber Variable Variable. RelNumber = int. Variable = . } aspect Chooser { declare strategy declare constraints declare traversal } end cd XMLSubset implements TreeICG(ElementICG) { XMLDef = A B. A : X | Y common U V. X = Y. map treeMap = for TreeICG { use Tree as XMLDef use Leaf as EmptyTag } map elementMap = for ElementICG { use Data as OpenTag use Data as OpenCloseTag // interesting } }