Namespace is not added in your response. And also, getNodeValue() gets the exact xpath of the response.
So, for this particular line to be executed properly:-
def a = holder.getNodeValue("//ns:table[country='CountryA']//*:city")
Your response should look like this:-
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<CheckCity xmlns="http://some ns here">
<Result>
<ns:table>
<country>CountryA</country>
<city>CityA</city>
<ns:/table>
<ns:table>
<country>CountryB</country>
<city>cityB</city>
<ns:/table>
<ns:table>
<country>CountryC</country>
<city>cityC</city>
<ns:/table>
</Result>
</CheckCity>
</soap:Body>
</soap:Envelope>