| |
In
this monthly column, an industry expert will answer
common questions about VoiceXML and related technologies.
Readers are encouraged to submit questions about VoiceXML,
including development, voice-user interface design,
and speech technology in general, or how VoiceXML is
being used commercially in the marketplace. If you have
a question about VoiceXML, e-mail it to speak.and.listen@voicexmlreview.org
and be sure to read future issues of VoiceXML Review
for the answer.
Continued
from previous page...
Q: What about schema validation?
A: DTDs are useful for validating basic parent/child
relationships between elements and for performing some
basic checks on attribute values.
Beyond that, however, they are extremely limited in
the constraints that they can specify on an XML document.
Two important advantages that XML schemas offer over
DTDs include:
1) XML Schemas allow you to prescribe
different element constraints based on the element's
context. For example, in VoiceXML, A <filled>
element within an input item cannot specify a mode attribute
or a namelist attribute (http://www.w3.org/TR/voicexml20/#dml2.4).
While it is possible to specify this constraint using
an XML schema, it is not possible to do so using a DTD.
2) XML Schemas provide rich data type
support. For example, several attributes (e.g. timeout)
in VoiceXML 2.0 require a "Time Designation"
(http://www.w3.org/TR/voicexml20/#dml6.5).
XML Schemas allow you to express that restriction using
a regular expression.
DTDs are limited to simple enumerations on attribute
values.
In short, the range of errors you can detect by validating
your VoiceXML documents against an XML Schema is superior
to those that you can detect using a DTD.
So, why doesn't everyone use XML Schemas? Compared with
DTDs which were adopted from SGML, XML schema is a fairly
recent technology,
and the XML toolsmiths are still catching up.
To associate an XML document with a specific schema,
you'll need to add a few attributes to your VoiceXML
document.
The following VoiceXML document binds the prefix "xsi"
to the XMLSchema-instance namespace, and then uses the
schemaLocation attribute in the XMLSchema-instance namespace
to reference the official VoiceXML 2.0 schema as specified
in Appendix O of the VoiceXML 2.0 specification (http://www.w3.org/TR/voicexml20/#dmlASchema):
<vxml version="2.0"
xmlns="http://www.w3.org/2001/vxml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml
http://www.w3.org/TR/voicexml20/vxml.xsd"
>
<form>
<block>
<prompt>
<prosody
volume="110">Hello, world.</prosody>
</prompt>
</block>
</form>
</vxml>
If you want to examine the schema and all its dependencies,
you can download the following .zip from the W3C site:
http://www.w3.org/TR/voicexml20/vxml-schema.zip
For more information about XML schema, see the XML schema
specification on the W3C site. The specification is
divided into two parts:
XML Schema Part 1: Structures (http://www.w3.org/TR/xmlschema-1/)
XML Schema Part 2: Datatypes (http://www.w3.org/TR/xmlschema-2/)
To validate the above document against the VoiceXML
2.0 schema, one of your best bets in open source tools,
as of this writing, is Xerces from the Apache Software
Foundation (http://xml.apache.org/).
Language bindings are available for C++, Perl, and Java
2.
The Java download includes an example, Counter.java,
in the samples\sax\ directory that performs schema validation
using the Xerces SAX parser (org.apache.xerces.parsers.SAXParser).
To use this sample, make sure you have the path to both
xercesImpl.jar and xercesSamples.jar in your classpath.
The following command-line enables full validation using
XML schemas:
java sax.Counter -v -s -f hello.vxml
The resulting output follows:
[ERROR] hello.xml:15:32: cvc-datatype-valid.1.2.2:
'110' is not a valid value of list type 'volume.datatype'.
[ERROR] hello.xml:15:32: cvc-attribute.3:
The value '110' of attribute 'volume' on element 'prosody'
is not valid with respect to its type.
Modify the VoiceXML above document by removing the schema-related
attributes and by adding a DOCTYPE declaration that
references the VoiceXML 2.0 DTD.
Use a DTD validating XML parser to load the document,
and observe that, due to the limitations of DTDs, it
doesn't report any errors.
Note that, while XML validation is an important step,
it won't catch run-time errors.
The following example attempts to reference a variable
that hasn't been declared.
An XML validation tool won't catch that. To detect such
an error, you'll have to execute the VoiceXML document
using a real VoiceXML interpreter and then check the
resulting call log.
<vxml version="2.0" xmlns="http://www.w3.org/2001/vxml">
<form>
<block>
Hello, <value
expr="user"/>
</block>
</form>
</vxml>
For a list of VoiceXML development tools and environments
that will allow you to execute your VoiceXML applications,
see the VoiceXML Forum's "Development Tools"
resource page:
http://www.voicexml.org/resources/devtools.asp.
As you work through this list, you'll probably notice
that a number of the development environments, Tellme
Studio (http://studio.tellme.com/)
for example, include a syntax checker. At the heart
of these tools is an XML parser that performs validation
against some version of the VoiceXML DTD or schema.
One of the advantages to using the syntax checker provided
with the development environment, is that each is specifically
geared toward the limitations and extended features
of the target VoiceXML platform.

back
to the top

Copyright
© 2001-2002 VoiceXML Forum. All rights reserved.
The VoiceXML Forum is a program of the
IEEE
Industry Standards and Technology Organization (IEEE-ISTO).
|