Вы возвращаете массив с одним элементом, текстом в нем.
Вернуть только текст:
rootsFTPData.children().sort(true) { it.item.text() }
То, что вы делаете сейчас, это:
rootsFTPData.children().sort(true) { [it.item.text()] }
Это помещает текст в массив (массив содержит один элемент, текст), поэтому Groovy будет сортировать его, как сортирует по массиву. Вы хотите отсортировать текст, поэтому верните текст. Не массив.
Не связано, но нет необходимости в конкатенации строк, как в Groovy:
import groovy.xml.XmlUtil
String xmlString = """
<root>
<record><item>CBCP3030cmackham************00000036</item><field>CBCP</field></record>
<record><item>CBCP3030cmackham************00000036</item><field>CBCP</field></record>
<record><item>CASHser@mdgrathnicol.co*302000000143</item><field>CASH</field></record>
<record><item>CASH2001724*************302000000143</item><field>CASH</field></record>
</root>
"""
def rootsFTPData = new XmlParser().parseText(xmlString)
rootsFTPData.children().sort(true) { it.item.text() }
def xmlStringTemp = XmlUtil.serialize(rootsFTPData)
print xmlStringTemp
Это производит:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<record>
<item>CASH2001724*************302000000143</item>
<field>CASH</field>
</record>
<record>
<item>CASHser@mdgrathnicol.co*302000000143</item>
<field>CASH</field>
</record>
<record>
<item>CBCP3030cmackham************00000036</item>
<field>CBCP</field>
</record>
<record>
<item>CBCP3030cmackham************00000036</item>
<field>CBCP</field>
</record>
</root>