def xmlString = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SearchRS>
<SearchStatus>SUCCESS</SearchStatus>
<Itinerary>
<Name>Joe</Name>
<Ticket>111.11</Ticket>
<Taxes>1.11</Taxes>
</Itinerary>
<Itinerary>
<Name>Bob</Name>
<Ticket>222.22</Ticket>
<Taxes>2.22</Taxes>
</Itinerary>
<Itinerary>
<Name>Joe</Name>
<Ticket>333.33</Ticket>
<Taxes>3.33</Taxes>
</Itinerary>
<Itinerary>
<Itinerary>
<Name>Bob</Name>
<Ticket>444.44</Ticket>
<Taxes>4.44</Taxes>
</Itinerary>
<Name>Joe</Name>
<Ticket>0.0</Ticket>
<Taxes>0.0</Taxes>
</Itinerary>
</SearchRS>"""
def xml = new XmlSlurper().parseText(xmlString)
def names = xml.'**'.findAll {it.name() == 'Name'}.unique()
def map = [:]
names.each { name ->
map[name] = xml.'**'.findAll {it.name() == 'Itinerary' && name == it.Name.text() }.collect { Double.parseDouble(it.Ticket.text()) + Double.parseDouble(it.Taxes.text())}.findAll {it}.with { sum() / size() }
}
println map
ZGVmIHhtbFN0cmluZyA9ICIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPFNlYXJjaFJTPgogICAgPFNlYXJjaFN0YXR1cz5TVUNDRVNTPC9TZWFyY2hTdGF0dXM+CiAgICA8SXRpbmVyYXJ5PgogICAgICAgIDxOYW1lPkpvZTwvTmFtZT4KICAgICAgICA8VGlja2V0PjExMS4xMTwvVGlja2V0PgogICAgICAgIDxUYXhlcz4xLjExPC9UYXhlcz4KICAgIDwvSXRpbmVyYXJ5PgogICAgPEl0aW5lcmFyeT4KICAgICAgICA8TmFtZT5Cb2I8L05hbWU+CiAgICAgICAgPFRpY2tldD4yMjIuMjI8L1RpY2tldD4KICAgICAgICA8VGF4ZXM+Mi4yMjwvVGF4ZXM+CiAgICA8L0l0aW5lcmFyeT4KICAgIDxJdGluZXJhcnk+CiAgICAgICAgPE5hbWU+Sm9lPC9OYW1lPgogICAgICAgIDxUaWNrZXQ+MzMzLjMzPC9UaWNrZXQ+CiAgICAgICAgPFRheGVzPjMuMzM8L1RheGVzPgogICAgICAgIDwvSXRpbmVyYXJ5PgogICAgPEl0aW5lcmFyeT4KICAgIDxJdGluZXJhcnk+CiAgICAgICAgPE5hbWU+Qm9iPC9OYW1lPgogICAgICAgIDxUaWNrZXQ+NDQ0LjQ0PC9UaWNrZXQ+CiAgICAgICAgPFRheGVzPjQuNDQ8L1RheGVzPgogICAgPC9JdGluZXJhcnk+CiAgICAgICAgPE5hbWU+Sm9lPC9OYW1lPgogICAgICAgIDxUaWNrZXQ+MC4wPC9UaWNrZXQ+CiAgICAgICAgPFRheGVzPjAuMDwvVGF4ZXM+CiAgICA8L0l0aW5lcmFyeT4KPC9TZWFyY2hSUz4iIiIKCmRlZiB4bWwgPSBuZXcgWG1sU2x1cnBlcigpLnBhcnNlVGV4dCh4bWxTdHJpbmcpCmRlZiBuYW1lcyA9IHhtbC4nKionLmZpbmRBbGwge2l0Lm5hbWUoKSA9PSAnTmFtZSd9LnVuaXF1ZSgpCmRlZiBtYXAgPSBbOl0KbmFtZXMuZWFjaCB7IG5hbWUgLT4gCiAgIG1hcFtuYW1lXSA9IHhtbC4nKionLmZpbmRBbGwge2l0Lm5hbWUoKSA9PSAnSXRpbmVyYXJ5JyAmJiBuYW1lID09IGl0Lk5hbWUudGV4dCgpIH0uY29sbGVjdCB7IERvdWJsZS5wYXJzZURvdWJsZShpdC5UaWNrZXQudGV4dCgpKSArIERvdWJsZS5wYXJzZURvdWJsZShpdC5UYXhlcy50ZXh0KCkpfS5maW5kQWxsIHtpdH0ud2l0aCB7IHN1bSgpIC8gc2l6ZSgpIH0KfQpwcmludGxuIG1hcA==