We have two levels of conditional processing. Either we want different variable values, or we want different overall statements. For example, we might say <p audience= "Bar">The <ph keyref="FOO"/> is a whizbang.</p>
If we want FOO to express different things, we use a different keydef map. For example, we OEM to different companies, and we need FOO to give the correct product name. To do that we use a different set of keydefs. Note that we transform in the browser, and actually show our content in the GUI. We include the keydef map in a set of branding files that we pick up at build time, so all the variables come out right.
Now let's say that Bar is for a product level, or a customer role. We use ditaval files for PDF generation, and that comes out fine. We also implement filtering in our browser-based transforms, so we can hide the content as needed. For some types of audience filtering, we can preset that in the build. Other types depend on the current state of the user/product relationship... We get the state and then inject the filtering in our system at run time.