Cubase with expression maps has probably the best implementation yet.
As you can see, for each input switch, it is possible to define many actions, such as change expression, max velocity, and so forth.
Input keyswitch: the keyswitch you want to use. Output keyswitch: the keyswitch defined by the library.
One can define multipe switches in the output, for adding a legato to a vibrato for example.
One can choose attribute (once per not) or direction (until another switch).
Cubase's implementation also works with expression based on midi channel, not keyswitch.
How it looks automated:
Expressions can be played, or added with the pen later, which is super easy.
See JunkieXL's great video:
In addition to expression maps, dynamic mapping comes hand in hand and should be implemented too.