如何在scxml文件的<data>元素中编写语法规则?

时间:2015-06-04 19:05:13

标签: 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>

如果我想在&lt; data&gt;中内联编写该语法规则在combat.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>

现在,让我们假设combat.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>

现在,我怎么能在&lt; data&gt;中内联写入内联在combat.scxml中的元素,就像我之前的情况一样?

1 个答案:

答案 0 :(得分:1)

根据SCXML建议,这几乎是未定义的,取决于您的平台。但是,我怀疑只是混合使用vxml和scxml命名空间就足以满足任何兼容的SCXML解释器。您很可能需要调用VoiceXML浏览器并将VoiceXML标记作为发送请求的一部分发送,或者为vxml命名空间中的可执行内容提供自定义元素。

JVoiceXML VoiceXML解释器作为uSCXML中的调用者(通过W3C MMI生命周期事件)有一些初步支持,您可以将自己的元素注册为自定义命名空间中的可执行内容,从而允许这两种方法。