It sounds like you have multiple XSLs in sequence. The first one to touch the special characters turns them into properly escaped entities, but then a subsequent transform blindly escapes every ampersand it comes across.
If that is correct, then storing them as escaped sequences in the DB will not make a difference either.
In any case, I'd take a look at the transforms next.