Problem solved but I need someone who is a rule expert to look at my routing-rules.xml file to see if I have made any entries that might cause issues down the road. I got the custom outbound caller id working by copying some parameters from the sangoma generated file into the 3CX generated file. I'm not sure which entry(s) made the difference.
Here is text from the original 3CX file and the working version I ceated. I have made bold the changes in the edited file.
3CX GENERATED FILE:
<?xml version="1.0" encoding="utf-8"?>
<routing_rules>
<!-- SIP OUT TO sip:localhost:5060 -->
<rule name="default_sip_out" outbound_interface="sip" qvalue="0.001">
<condition param="transfer" expr="false"/>
<condition param="pstn.in.channelName" expr=".*"/>
<condition param="pstn.in.ani" expr="(.*)"/>
<condition param="pstn.in.dnis" expr="([0-9]*)"/>
<condition param="pstn.in.callerName" expr="([0-9a-zA-Z]+)"/>
<out_leg name="" media_type="sendrecv">
<!-- To modify the target SIP destination, just change the value below -->
<param name="sip.out.requestUri" expr="sip:
[email protected]:5060"/>
<param name="sip.out.from.uri" expr="sip:%0@GW_HOST_IP:GW_SIP_PORT"/>
<param name="sip.out.from.displayName" expr="%2"/>
<param name="sip.out.to.uri" expr="sip:%
[email protected]:5060"/>
<param name="sip.out.to.displayName" expr="%1"/>
<param name="sip.out.transport" expr="udp"/>
</out_leg>
</rule>
<!-- PSTN OUT -->
<rule name="default_pstn_out_with_from_display_name" outbound_interface="pstn" qvalue="0.001">
<condition param="transfer" expr="false"/>
<condition param="sip.in.requestUri.canonical" expr="sip

[0-9]+)@GW_HOST_IP:GW_SIP_PORT"/>
<condition param="sip.in.from.displayName" expr="([0-9a-zA-Z]+)"/>
<out_leg name="" media_type="sendrecv">
<param name="pstn.out.phoneNumber" expr="%0"/>
<param name="pstn.out.deviceGroup" expr="default"/>
<param name="pstn.out.cpa.enable" expr="false"/>
<param name="pstn.out.ani" expr="%1"/>
</out_leg>
</rule>
<rule name="default_pstn_out_without_from_display_name" outbound_interface="pstn" qvalue="0.001">
<condition param="transfer" expr="false"/>
<condition param="sip.in.requestUri.canonical" expr="sip

[0-9]+)@GW_HOST_IP:GW_SIP_PORT"/>
<out_leg name="" media_type="sendrecv">
<param name="pstn.out.phoneNumber" expr="%0"/>
<param name="pstn.out.deviceGroup" expr="default"/>
<param name="pstn.out.cpa.enable" expr="false"/>
</out_leg>
</rule>
<rule name="redirect_to_sip" outbound_interface="sip" qvalue="0.1">
<condition param="sip.in.redirect.Contact" expr="(.*)"/>
<out_leg name="" media_type="sendrecv">
<param name="sip.out.redirect.Contact" expr="%0"/>
</out_leg>
</rule>
<rule name="redirect_to_pstn" outbound_interface="pstn" qvalue="0.2">
<condition param="sip.in.redirect.Contact" expr="^Contact:.*sip

[0-9]+)@GW_HOST_IP:GW_SIP_PORT"/>
<out_leg name="" media_type="sendrecv">
<param name="pstn.out.phoneNumber" expr="%0"/>
<param name="pstn.out.deviceGroup" expr="default"/>
</out_leg>
</rule>
<!-- SIP to SIP transfer, results in a SIP bridged transfer on the gateway if
transfer target is the gateway and no other transfer rule matches -->
<rule name="sip_to_sip_transfer" outbound_interface="sip" qvalue="0.001">
<condition param="transfer" expr="true"/>
<condition param="sip.in.referTo" expr="(?U)(.*)(?:;|\?|$)"/>
<condition param="sip.in.from.uri" expr="(.*)"/>
<out_leg name="" media_type="sendrecv">
<param name="sip.out.requestUri" expr="%0"/>
<!-- echoing "from" fields of the REFER request -->
<param name="sip.out.from.uri" expr="%1"/>
</out_leg>
</rule>
<!-- PSTN (CTBus/SCBus/Internal audio switch) bridge -->
<rule name="default_pstn_bridge_transfer" outbound_interface="pstn" qvalue="0.01">
<condition param="transfer" expr="true"/>
<condition param="sip.in.referTo.canonical" expr="sip

[0-9]+)@GW_HOST_IP:GW_SIP_PORT"/>
<out_leg name="" media_type="sendrecv">
<param name="pstn.out.phoneNumber" expr="%0"/>
<param name="pstn.out.deviceGroup" expr="default"/>
<param name="pstn.out.transfer.type" expr="2channel-bridged"/>
<param name="pstn.out.transfer.supervision" expr="connect"/>
<param name="pstn.out.transfer.timeoutMs" expr="30000"/>
<param name="paraxip.gw.ringTimeoutMs" expr="0"/>
<param name="paraxip.gw.connectionTimeoutMs" expr="0"/>
</out_leg>
</rule>
</routing_rules>
EDITED VERSION THAT WORKS:
<?xml version="1.0" encoding="utf-8"?>
<routing_rules>
<!-- SIP OUT TO sip:localhost:5060 -->
<rule name="default_sip_out" outbound_interface="sip" qvalue="0.001">
<condition param="transfer" expr="false"/>
<condition param="pstn.in.channelName" expr=".*"/>
<condition param="pstn.in.ani" expr="(.*)"/>
<condition param="pstn.in.dnis" expr="([0-9]*)"/>
<condition param="pstn.in.callerName" expr="([0-9a-zA-Z]+)"/>
<out_leg name="" media_type="sendrecv">
<!-- To modify the target SIP destination, just change the value below -->
<param name="sip.out.requestUri" expr="sip:
[email protected]:5060"/>
<param name="sip.out.from.uri" expr="sip:%0@GW_HOST_IP:GW_SIP_PORT"/>
<param name="sip.out.from.displayName" expr="%2"/>
<param name="sip.out.to.uri" expr="sip:%
[email protected]:5060"/>
<param name="sip.out.to.displayName" expr="%1"/>
<param name="sip.out.transport" expr="udp"/>
</out_leg>
</rule>
<!-- PSTN OUT -->
<rule name="default_pstn_out_with_from_display_name" outbound_interface="pstn" qvalue="0.001">
<condition param="transfer" expr="false"/>
<condition param="sip.in.requestUri.canonical" expr="sip

[0-9]+)@GW_HOST_IP:GW_SIP_PORT"/>
<condition param="sip.in.from.displayName" expr="([0-9a-zA-Z]+)"/>
<condition param="sip.in.from.uri.canonical" expr="sip
[0-9]+)@GW_HOST_IP:GW_SIP_PORT"/>
<out_leg name="" media_type="sendrecv">
<param name="pstn.out.phoneNumber" expr="%0"/>
<param name="pstn.out.deviceGroup" expr="default"/>
<param name="pstn.out.phoneNumber.type" expr="0"/>
<param name="pstn.out.phoneNumber.numberingPlan" expr="1"/>
<param name="pstn.out.cpa.enable" expr="false"/>
<param name="pstn.out.ani" expr="%2"/>
<param name="pstn.out.ani.type" expr="0"/>
<param name="pstn.out.ani.numberingPlan" expr="1"/>
<param name="pstn.out.channelGroup" expr="default"/>
<param name="pstn.out.callerName" expr="%1"/>
</out_leg>
</rule>
<rule name="default_pstn_out_without_from_display_name" outbound_interface="pstn" qvalue="0.001">
<condition param="transfer" expr="false"/>
<condition param="sip.in.requestUri.canonical" expr="sip

[0-9]+)@GW_HOST_IP:GW_SIP_PORT"/>
<out_leg name="" media_type="sendrecv">
<param name="pstn.out.phoneNumber" expr="%0"/>
<param name="pstn.out.phoneNumber.type" expr="0"/>
<param name="pstn.out.phoneNumber.numberingPlan" expr="1"/>
<param name="pstn.out.deviceGroup" expr="default"/>
<param name="pstn.out.cpa.enable" expr="false"/>
<param name="pstn.out.channelGroup" expr="default"/>
</out_leg>
</rule>
<rule name="redirect_to_sip" outbound_interface="sip" qvalue="0.1">
<condition param="sip.in.redirect.Contact" expr="(.*)"/>
<out_leg name="" media_type="sendrecv">
<param name="sip.out.redirect.Contact" expr="%0"/>
</out_leg>
</rule>
<rule name="redirect_to_pstn" outbound_interface="pstn" qvalue="0.2">
<condition param="sip.in.redirect.Contact" expr="^Contact:.*sip

[0-9]+)@GW_HOST_IP:GW_SIP_PORT"/>
<out_leg name="" media_type="sendrecv">
<param name="pstn.out.channelGroup" expr="default" />
<param name="pstn.out.phoneNumber" expr="%0"/>
<param name="pstn.out.phoneNumber.type" expr="0" />
<param name="pstn.out.phoneNumber.numberingPlan" expr="1" />
<param name="pstn.out.deviceGroup" expr="default"/>
</out_leg>
</rule>
<!-- SIP to SIP transfer, results in a SIP bridged transfer on the gateway if
transfer target is the gateway and no other transfer rule matches -->
<rule name="sip_to_sip_transfer" outbound_interface="sip" qvalue="0.001">
<condition param="transfer" expr="true"/>
<condition param="sip.in.referTo" expr="(?U)(.*)(?:;|\?|$)"/>
<condition param="sip.in.from.uri" expr="(.*)"/>
<out_leg name="" media_type="sendrecv">
<param name="sip.out.requestUri" expr="%0"/>
<!-- echoing "from" fields of the REFER request -->
<param name="sip.out.from.uri" expr="%1"/>
</out_leg>
</rule>
<!-- PSTN (CTBus/SCBus/Internal audio switch) bridge -->
<rule name="default_pstn_bridge_transfer" outbound_interface="pstn" qvalue="0.01">
<condition param="transfer" expr="true"/>
<condition param="sip.in.referTo.canonical" expr="sip

[0-9]+)@GW_HOST_IP:GW_SIP_PORT"/>
<out_leg name="" media_type="sendrecv">
<param name="pstn.out.phoneNumber" expr="%0"/>
<param name="pstn.out.deviceGroup" expr="default"/>
<param name="pstn.out.transfer.type" expr="2channel-bridged"/>
<param name="pstn.out.transfer.supervision" expr="connect"/>
<param name="pstn.out.transfer.timeoutMs" expr="30000"/>
<param name="paraxip.gw.ringTimeoutMs" expr="0"/>
<param name="paraxip.gw.connectionTimeoutMs" expr="0"/>
</out_leg>
</rule>
</routing_rules>