
Here in Support we get a fair amount of tickets asking about variables. Namely, if a variable is created in a form can it be accessed in the field of that form or in a different form? What I am talking about is called variable scoping. In VXML there are several different variable scopes. You might have heard of global and local variables with other programming languages. VXML, while not a programming language, is similar in how it approaches variables and how they can be accessed.
First lets get a proper definition for variable scope. The scope of a variable defines when and where the variable exists and may be accessed. When the VXML browser exits the scope where the variable is defined, the variable is out-of-scope and cannot be accessed. When a variable is in scope, it can be accessed by both VoiceXML and ECMAScript.
Here is a table of the different scope levels of variables in VXML:
Scopes |
Declared In |
Initialized In |
Where accessible |
Becomes Unavailable |
|---|
Session |
By the VXML browser |
At the beginning of a session |
Anytime during the session |
At the end of the session |
Application |
In the root document |
When VXML browser loads the root document |
Throughout the application |
When the VXML browser leaves the root document |
document |
In the <vxml> document |
When the VXML browser loads the document |
Within the <vxml> element |
When VXML browser leaves the document |
dialog |
In the <field> element of a <form> or <menu> element |
When the VXML browser loads the element |
Within the element |
When the VXML browser leaves the element |
anonymous |
In a <block>, <filled> or <catch> element |
When the VXML browser begins to interpret the element |
Within the element |
When the VXML browser leaves the element |
Here is an example of document scoped variable. As you can see it is accessible throughout the current VXML document.
<?xml version=”1.0″?>
<vxml version=”2.0″>
<var name = “counter” expr = “0″/>
<form id=”F_1″>
<!– additional VXML code –>
<filled>
<assign name=”counter” expr = “counter + 1″/>
</filled>
</form>
<form id=”F_2″>
<!– additional VXML code –>
<filled>
<assign name=”counter” expr = “counter + 2″/>
</filled>
</form>
</vxml>
Here is an example of a dialog scoped document. In form “F_1″ the value of “counter” after the assign <element> would be 1. In form “F_2″ the value after the <assign> value would be 2.
<?xml version=”1.0″?>
<vxml version=”2.0″>
<form id=”F_1″>
<!– additional VXML code –>
<filled>
<var name = “counter” expr = “0″/>
<assign name=”counter” expr = “counter + 1″/>
</filled>
</form>
<form id=”F_2″>
<!– additional VXML code –>
<filled>
<var name = “counter” expr = “0″/>
<assign name=”counter” expr = “counter + 2″/>
</filled>
</form>
</vxml>
It is also good to know that variable references will match the closest applicable scope. You can prefix a reference with a scope name, such as application.counter, for clarity or to resolve ambiguity.
We hope this clears up a little confusion about VXML variables and where they are defined and when they can accessed.
Jeremy Richmond
VXML Certified Developer