Na podstawie Tutorial20.pdf
Przykład dialogu:
S: Please enter your 4 digit pin code.
U: 1234
S: Good Morning Mr. Eisenzopf. How may I help you?
Dokument VXML implementujący ten interfejs:
<?xml version="1.0"?>
<vxml version="1.0" >
<form id="hello">
<field name="pin">
<prompt>Please enter your 4 digit pin code.</prompt>
<filled>
<submit next="http://www.webreference.com/cgi-bin/perl/20/pin.pl"/>
</filled>
</field>
</form>
</vxml>
Wejście użytkownika dla pola “pin” jest przekazywane do skryptu CGI
spec
yfikowanego za pomocą atrybutu next elementu submit. Skrypty dla wejść
VXML są praktycznie takie same jak skrypty dla formularzy HTML.
Element filled
może pojawić się albo wewnątrz elementu field:
<?xml version="1.0"?>
<vxml version="1.0" >
<form id="hello">
<field name="pin">
<prompt>Please enter your 4 digit pin code.</prompt>
<filled>
<submit next="http://www.webreference.com/cgi-bin/perl/20/pin.pl"/>
</filled>
</field>
</form>
</vxml>
albo wewnątrz formularza form, ale poza polem:
<?xml version="1.0"?>
<vxml version="1.0" >
<form id="hello">
<field name="pin">
<prompt>Please enter your 4 digit pin>
</field>
<field name="ccnum">
<prompt>Please enter your credit card number.</prompt>
</field>
<filled>
<submit next="http://www.webreference.com/cgi-bin/perl/20/pin.pl"/>
</filled>
</form>
</vxml>
To umożliwia sterowanie wejściem zarówno na poziomie pola i/lub formularza.
Można przetwarzać wartości pola za każdym razem, gdy są wpisane lub można
czekać aż wszystkie pola zostaną wypełnione.
Są inne atrybuty, których można użyć do sterowania jak i co się wysyła.
Domyślnie wysyłane są wartości formularza poprzez protokół HTTP do
określonego miejsca URL za pomocą metody GET (umieszcza się w adresie
URL, po znaku „?‟, pary „parametr=wartość‟ połączone znakiem „&‟)
Można zastosować metodę POST za pomocą atrybutu method:
<submit next=http://www.webreference.com/cgi-bin/perl/20/pin.pl method="POST"/>
Podczas przesyłania wartości pól za pomocą elementu filled z poziomu formularza (w
przeciwieństwie do pola) można kontrolować (za pomocą atrybutu namelist), które
pola są przesyłane:
<submit next=http://www.webreference.com/cgi-bin/perl/20/pin.pl namelist="ccnum"/>
Dodatkowo jest wiele innych sposobów oddziaływania na pole wejściowe
Można odesłać użytkownika do innego formularza:
<filled>
<goto next="#first_name"/>
</filled>
lub włączyć wiadomość:
<filled>
<prompt>Thank you Mr. Rich. It will take 24 to 48 hours money into your off-
shore accounts.</prompt>
<submit next="http://www.textant.com/cgi-bin/launder.pl"/>
</filled>
Można przetwarzać wejścia bez przekazywania ich do skryptów
Najprostszą alternatywą jest element result. Jeżeli wartość atrybutu name pasuje do
wartości pola, będzie wykonana instrukcja wewnątrz:
<?xml version="1.0"?>
<vxml version="1.0" >
<form id="hello">
<field name="pin">
<prompt>Please enter your 4 digit pin code.</prompt>
<filled>
<result name="1234">
<prompt>Good Morning Mr. Eisenzopf. How may I help
you?</prompt>
<goto next="#secret_laboratory"/>
</result>
<result name="2468">
<prompt>Good Morning Mr. King. How may I help
you?</prompt>
<goto next="#control_room"/>
</result>
</filled>
</field>
</form>
</vxml>
Element result
może dopasowywać proste łańcuchy, nie ma mocy instrukcji
warunkowych, jak if i else.
D
ziała dobrze, gdy jest predefiniowany zbiór wejść, które użytkownik może
wprowadzić. Jeżeli treść będzie bardziej dynamiczna, jak kod PIN, wtedy może być
potrzebna instrukcja warunkowa.
Dynamiczne aplikacje VXML
Dalej wykorzystany zostanie scenariusz z PIN-em.
Opracowany zostanie skrypt CGI, który dostarczy odpowiedź na wejście
użytkownika.
Zakończony formularz VXML ma następującą postać (Example 4. [example4.xml]):
<?xml version="1.0"?>
<vxml version="1.0" >
<form id="login">
<field name="pin">
<grammar>
<![CDATA[
Four_digits
]]>
</grammar>
<prompt>Please enter your 4 digit pincode.</prompt>
<filled>
<submit next="http://www.webreference.com/cgi-
bin/perl/20/pin.pl"/>
</filled>
<noinput count="1">No PIN entered.
<reprompt/>
</noinput>
<noinput count="2">You must enter your PIN number to proceed.
<reprompt/>
</noinput>
<noinput count="3">Please press or say exactly four numbers.
</noinput>
<nomatch count="1">Invalid pin code.
<reprompt/>
</nomatch>
<nomatch count="2">Please press or say exactly four numbers.
<reprompt/>
</nomatch>
<nomatch count="3">Too many attempts. Please call back another
<exit/>
</nomatch>
</field>
</form>
</vxml>
Skrypt CGI zostanie napisany w Perl.
Umiejętność wykorzystania modułu Perl
CGI pm
pozwoli operować na wejściowym formularzu VXML.
#!/usr/bin/perl -w
use strict;
use CGI;
my %users = (
'1234' => 'Eisenzopf',
'2468' => 'King'
);
my $q = new CGI;
my $pin = $q->param('pin');
print "Content-Type: text/xml\n\n";
print <<VXML;
<?xml version="1.0"?>
<vxml>
<form>
<block>
VXML
print "Good Morning Mr. $users{$pin}. How may I help you?"
|| "$pin is an invalid pin code.";
print <<VXML;
</block>
</form>
</vxml>
VXML
Została napisana nowa wersja modułu CGI.pm. Wartość pola pin uzyskujemy za
pomocą linii kodu:
my $pin = $q->param('pin');
Jest ważne, aby upewnić się, że zwracany jest właściwy nagłówek http. Domyślny
nagłówek nie będzie pracował właściwie. Należy użyć następującej instrukcji jako
pierwszego wyjścia do Tellme:
print "Content-Type: text/xml\n\n";
Pozostała część skryptu jest zwykłym perlem. Odnajdujemy nazwisko użytkowników
wykorzystując ich kody PIN. Jeżeli znajdziemy nazwisko witamy ich, w przeciwnym
wypadku zwracamy błąd. Jest to bardzo prosty skrypt, lecz jest to pierwsza próba
opracowania dynamicznej aplikacji VXML.