Как написать грамматические правила в элементе <data> в файле scxml?

У меня возникли проблемы с выяснением того, как писать грамматические правила прямо в файлах scxml, а не ссылаться на них во внешних файлах grxml.

Позвольте мне проиллюстрировать это на примере:

combat.scxml
------------
<?xml version="1.0" encoding="utf-8"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" xmlns:vxml="http://www.w3.org/2001/vxml" version="1.0" initial="Start">
    <state id="WeaponChoice">
        <onentry>
            <vxml:prompt>What kind of weapon do you want to use?</vxml:prompt>
        </onentry>
        <datamodel>
            <data id="WeaponChoiceGrammar" expr="./combat.grxml#weapon"/>
        </datamodel>
    </state>
</scxml>

combat.grxml
------------
<?xml version="1.0" encoding="utf-8"?>
<grammar>
    <rule id="weapon">
        <one-of>
            <item>sword</item>
            <item>knife</item>
            <item>hammer</item>
            <item>bow</item>
            <item>crossbow</item>
        </one-of>
    </rule>
</grammar>

Если бы я хотел встроить это правило грамматики в элемент в battle.scxml, я сделал бы это следующим образом:

combat.scxml
------------
<?xml version="1.0" encoding="utf-8"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" xmlns:vxml="http://www.w3.org/2001/vxml" version="1.0" initial="Start">
    <state id="WeaponChoice">
        <onentry>
            <vxml:prompt>What kind of weapon do you want to use?</vxml:prompt>
        </onentry>
        <datamodel>
            <data id="WeaponChoiceGrammar">
                <rule id="weapon">
                    <one-of>
                        <item>sword</item>
                        <item>knife</item>
                        <item>hammer</item>
                        <item>bow</item>
                        <item>crossbow</item>
                    </one-of>
                </rule>
            </data>
        </datamodel>
    </state>
</scxml>

Теперь давайте предположим, что battle.grxml похож на это:

combat.grxml
------------
<?xml version="1.0" encoding="utf-8"?>
<grammar>
    <rule id="weapon">
        <one-of>
            <item tag="melee"><ruleref uri="#melee"/></item>
            <item tag="ranged"><ruleref uri="#ranged"/></item>
        </one-of>
    </rule>
    <rule id="melee">
        <one-of>
            <item>sword</item>
            <item>knife</item>
            <item>hammer</item>
        </one-of>
    </rule>
    <rule id="ranged">
        <one-of>
            <item>bow</item>
            <item>crossbow</item>
        </one-of>
    </rule>
</grammar>

Теперь, как я могу записать это inline в элемент в battle.scxml, как я это делал в предыдущем случае?

1 ответ

Это в значительной степени не определено согласно рекомендации SCXML и будет зависеть от вашей платформы. Однако я сомневаюсь, что простого смешивания пространств имен vxml и scxml достаточно для любого совместимого интерпретатора SCXML. Скорее всего, вам потребуется вызвать браузер VoiceXML и отправить разметку VoiceXML как часть запросов на отправку или предоставить настраиваемые элементы для исполняемого содержимого в пространстве имен vxml.

Существует некоторая предварительная поддержка для интерпретатора JVoiceXML VoiceXML в качестве инициатора в uSCXML (через события жизненного цикла W3C MMI), и вы можете зарегистрировать свои собственные элементы как исполняемый контент в пользовательских пространствах имен, что позволяет использовать оба подхода.

Другие вопросы по тегам