Проблема с поднятием события в scxml
У меня проблема со следующим кодом scxml:
<?xml version="1.0" encoding="utf-8"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initialstate="global">
...
<state id="global" initial="init">
...
<state id="state2">
<onentry>
<if cond="mydata.skip">
<if cond="_event.name=='ev.prev'">
<raise event="ev.prev" />
<else/>
<raise event="ev.next" />
</if>
</if>
</onentry>
<transition event="ev.next" target="end" />
<transition event="ev.prev" target="state1" />
</state>
...
</state>
</scxml>
Это работает нормально, но когда я добавил элемент onentry, обработчик говорит следующее:
[WARN] Ignoring element <raise> in namespace "http://www.w3.org/2005/07/scxml" at null:2:882 and digester match "scxml/state/state/onentry/if/if/raise"
[WARN] Ignoring element <raise> in namespace "http://www.w3.org/2005/07/scxml" at null:2:912 and digester match "scxml/state/state/onentry/if/if/else/raise"
Кажется, что повышение не понято. Я попытался изменить элемент "поднять" с "отправить", и я получил похожее предупреждение журнала. Может кто-нибудь сказать мне, что может быть не так?
Благодарю.
ОБНОВИТЬ
Я попытался изменить схему, избегая встраивания элементов if следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initialstate="global">
...
<state id="global" initial="init">
...
<state id="state2">
<onentry>
<if cond="mydata.skip and _event.name=='ev.prev'">
<raise event="ev.prev" />
<else if cond="mydata.skip and _event.name=='ev.next'"/>
<raise event="ev.next" />
</if>
</onentry>
<transition event="ev.next" target="end" />
<transition event="ev.prev" target="state1" />
</state>
...
</state>
</scxml>
но это также дает следующую ошибку:
[WARN] Ignoring element <raise> in namespace "http://www.w3.org/2005/07/scxml" at null:2:1057 and digester match "scxml/state/state/onentry/if/raise"
1 ответ
Я не мог сделать так, чтобы ивент работал. Но в соответствии со стандартом: http://www.w3.org/TR/scxml/ вы также можете использовать событие отправки. Так что я попробовал это, и я мог бы сделать эту работу.
<state id="testID">
<onentry>
<send event="'test.onentry'" />
</onentry>
<transition event="test.transition" target="testID2"></transition>
</state>
Это отправило событие test.onentry, как и ожидалось. Но обратите внимание на одинарные кавычки внутри двойных кавычек!