Jurgen Klopp's men fell behind early on courtesy of a strike by Jefferson Farfan, but fought back to claim the three points with a spirited display of attacking football
Jefferson Farfan stunned the visitors with a powerful shot, which deflected off Shinji Kagawa before flying into the right corner. Lukasz Piszczek drew the game before halftime with an equally-stunning strike, and Sebastian Kehl netted the winner after the break to seal the win.
Dortmund had a chance to open the scoring mere moments after the first whistle as Sven Bender was released by Robert Lewandowski, but the Germany international could only shoot straight at Lars Unnerstall.
Schalke managed to recover from the early shock and soon started creating chances of its own. In the ninth minute, following a poorly-cleared corner, Farfan let it fly with a glorious volley, which met the head of Kagawa before nesting in the net.
Dortmund's answer was almost instant as Lewandowski was released in a one-on-one with Unnerstall, but could only shoot wide. Just before the 20-minute mark, Piszczek showed his fellow Poland international how it is done with a fine strike from an acute angle, which ended in the right corner.
The tempo dropped in the following minutes, but just before halftime Klass-Jan Huntelaar missed a glorious opportunity, sending a header just wide, following a free-kick by Christian Fuchs.
The duo once again managed to bypass Dortmund's defense shortly after the restart, but the Dutchman failed to find the net for a second time. Raul also went close to scoring near the hour mark, but a brave block by Mats Hummels prevented a second strike by Schalke.
Dortmund soon turned the heat on the Royal Blues, however, as it started pinning the hosts in their own half. It managed to force a goal in 63rd minute, when a poor clearance by Christoph Metzelder off a corner kick allowed captain Kehl to poke home from close range.
Schalke and BVB traded chances in the remaining minutes, but neither team managed to create a clear-cut opportunity. In the end, Dortmund managed to preserve its lead and maintain a six-point advantage over Bayern Munich in the league.
Following today's result, BVB is first in the standings with 72 points, while Schalke is third with 57. Dortmund's next league game is at home against Borussia Monchengladbach in a week's time, while Schalke travels to Augsburg on the next day.