Yes, you can use the result of the previous bridge to execute a transfer. You'd need to use the hangup cause as the transfer destination, or part of the destination. For example, you could try something like this:
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="continue_on_fail="false"/>
<action application="bridge" data="sofia/internal/
aaa@123.3.3./>
<action application="transfer" data="${hangup_cause}_AAA XML default"/>
...
And then have an extension for each of the various hangup_causes
<extension name="normal clearing">
<condition field="destination_number" expression="^(normal_clearing_AAA)$">
<!-- Do whatever you want for "normal clearing" bridged calls -->
</condition>
</extension>
<extension name="user busy">
<condition field="destination_number" expression="^(user_busy_AAA)$">
<!-- Do whatever you want for "user busy" bridged calls -->
</condition>
</extension>
<extension name="no answer">
<condition field="destination_number" expression="^(no_answer_AAA)$">
<!-- Do whatever you want for "no answer" bridged calls -->
</condition>
</extension>
Etc., etc.
I don't claim it's pretty, but it would let you avoid the use of scripting languages. However, I would caution you to examine just why you want/need to avoid scripting langs. The dp-only method may indeed be best for you, or perhaps using mod_xml_curl would be better. It does depend on your specific needs and your environment.
-MC