I believe I've gotten this to work, in theory at least.
As you noted, there are examples that get installed. Sample02.scxml has an example of using a "Cycle Attempt" equivalent. Basically, it's a loop counter that you'll need to increment each time the call goes into a state. For example, I'm trying to catch SIT tone calls. If one is received, I'm pushing the call to a "sit_state" state and applying a delay (using ocs:timeout). If you utilize the <onexit> tag, the counter variable can be incremented. You then use the expr attribute of the <transition> tag to evaluate it.
Delcare counters
[code]
<datamodel>
<data ID="record_id" expr="'0'"/>
<data ID="retry" expr="0" />
<data ID="max_retry" expr="3" />
</datamodel>
[/code]
Validation Code
[code]
<transition event="ocs.callresult" cond="isSIT(_event.data.callresult) && (_data.retry <= _data.max_retry)" target="sit_state">
<log expr="'retry value is: '+ _data.retry + '...retrying call'" />
</transition>
<transition event="ocs.callresult" cond="isSIT(_event.data.callresult) && (_data.retry > _data.max_retry)" target="NextRecord">
<log expr="'retry value is: '+ _data.retry + '...not retrying call'" />
</transition>
[/code]
Incremental Code
[code]
<state id="sit_state">
<onentry>
<ocs:timeout delay="60" />
</onentry>
<transition event="ocs.timeout" target="MakeCall"/>
<onexit>
<assign location="_data.retry" expr="_data.retry+1" />
</onexit>
</state>
[/code]
I'm sure it can get much more complex than this but I actually got this to cycle through like I expected it to.
Thanks for the help, guys.