Hmm,
The first thought that came to me isn't this what I've use derived tables and identities for in the past.
I won't guarantee performance want suffer of be less then using apply because I'm still on sql 2000 :-(, but this is how I would solve the problem.
In the derived table query I would show the transaction id on the top three items and there dates sorted by transaction id and dates I would then have another query above it in the same derived table that mapped those rows to there identities and then use those identities as the join condition out of the derived table to return my max top 3 rows per transaction ID.
I haven't seen your schema put I'm pretty sure this can be done.
Enjoy.