Manchester City’s Ferran Torres scored Spain’s goals in Milan from two Mikel Oyarzabal crosses to send Luis Enrique’s side to Sunday’s final against either Belgium or France.
Italy were already second best, and 1-0 down, when captain Leonardo Bonucci was sent off for two bookings, the second for an elbow on Sergio Busquets.
They looked dead and buried until Lorenzo Pellegrini’s late goal after a wonderful Federico Chiesa run on a counter-attack – but could not find an unmerited equaliser.
Spain handed 17-year-old Barcelona midfielder Gavi a start, making him the youngest international in their history – less than six weeks after his club debut – and he looked at home on this stage.
The Nations League may be a fairly new tournament – and derided by some – but when both sides had 11 men this was played with the talent and intensity of any World Cup or European Championship encounter.
Torres shows his importance to Spain
Torres has become one of Spain’s star men in the past year or so. This was his 11th international goal since 1 September 2020. Nobody else has scored more than five.
He is clinical too, with six of his last seven shots on target for Spain ending in a goal. He only had two shots in this game.
His first was a lovely volley – at a difficult height – and his second a header back across goal, both from Oyarzabal balls into the box.
He was replaced early in the second half by teenage debutant Yeremi Pino, presumably with a knock.
But the game was done by that stage, especially with Italy down to 10 men. Roberto Mancini brought on veteran defender Giorgio Chiellini for attacker Federico Bernardeschi at half-time as the hosts looked for some damage limitation.
They only had one shot in the second half – when Chiesa ran from his own half after Spain committed men forward and unselfishly squared for substitute Pellegrini.
Spain gave Italy their most difficult game at Euro 2020 when they wasted a load of chances before losing on penalties.
But they got the win they deserved this time. There was the strange situation too of Italy goalkeeper Gianluigi Donnarumma, who was named the best player at Euro 2020, but was booed throughout by his own fans. He left San Siro occupants AC Milan for Paris St-Germain in the summer.
It appeared to affect him at times, most notably when he fumbled Marcos Alonso’s volley on to the post moments after the opening goal.
“Italy were playing and it was not a club match,” Italy boss Roberto Mancini said.
“They could have put this situation aside for one night and whistle when it comes to a PSG-Milan game. Italy is Italy, and comes above everything else.”
Italy will face the losers of Thursday’s game between Belgium and France at Juventus’ stadium in Sunday’s third-placed play-off at the same venue (14:00 BST).
Spain face the winners at the San Siro at 19:45 BST.