<!-- A DTD for Voice Extensible Markup Language -->
<!-- Copyright (c) 2001 SpeechWorks International -->
<!-- This is a modified version of the DTD for Voice Extensible Markup
     Language, the original version of which  is copyright (c) 2000
     VoiceXML Forum (AT&T, IBM, Lucent Technologies, Motorola) and
     available at http://www.voicexml.org/spec.html. -->

<!ENTITY % audio	'#PCDATA | audio | enumerate | value' >

<!ENTITY % bargeintype	'(speech | hotword)' >

<!ENTITY % boolean 	'(true|false)' >

<!ENTITY % content.type 'CDATA'>

<!ENTITY % duration	'CDATA' >

<!ENTITY % event.handler 'catch | help | noinput | nomatch | error' >

<!ENTITY % event.name	'NMTOKEN' >

<!ENTITY % event.names	'NMTOKENS' >

<!ENTITY % executable.content
	'%audio; | assign | clear | disconnect | exit | goto | if | log |
	prompt | reprompt | return | script | submit | throw | var' >

<!ENTITY % expression	'CDATA' >

<!ENTITY % restrictedvariable.name	'NMTOKEN' >

<!ENTITY % variable.name	'CDATA' >

<!ENTITY % restrictedvariable.names	'NMTOKENS' >

<!ENTITY % variable.names	'CDATA' >

<!ENTITY % integer	'CDATA' >

<!ENTITY % item.attrs
	'name		%restrictedvariable.name;	#IMPLIED
	cond		%expression;	#IMPLIED
	expr		%expression;	#IMPLIED ' >

<!ENTITY % uri 'CDATA' >

<!ENTITY % cache.attrs
	'fetchhint	(prefetch|safe)	#IMPLIED
	fetchtimeout	%duration;	#IMPLIED
	maxage		%integer;	#IMPLIED
	maxstale	%integer;	#IMPLIED ' >

<!ENTITY % next.attrs
	'next		%uri;		#IMPLIED
	expr		%expression;	#IMPLIED ' >

<!ENTITY % submit.attrs
	"method	(get|post)	'get'
	enctype		%content.type;	'application/x-www-form-urlencoded'
	namelist	%variable.names;	#IMPLIED" >

<!ENTITY % throw.attrs
	'event		%event.name;	#IMPLIED
	eventexpr	%expression;	#IMPLIED
	message		CDATA		#IMPLIED
	messageexpr	%expression;	#IMPLIED' >

<!ENTITY % sentence-elements
	 'break | emphasis | mark | phoneme | prosody | say-as | voice | sub |
        speak' >

<!ENTITY % allowed-within-sentence '%audio; | %sentence-elements;' >

<!ENTITY % structure	'paragraph | p | sentence | s' >

<!ENTITY % variable 	'block | field | var' >

<!--================================ Root ===============================-->

<!ELEMENT vxml		
	(%event.handler; | form | link | menu | meta | metadata |
	property | script | var)+ >
<!ATTLIST vxml
	application	%uri;		#IMPLIED
	xml:base	%uri;		#IMPLIED
	xml:lang	NMTOKEN		#IMPLIED
	xmlns		CDATA		'http://www.w3.org/2001/vxml'
	xmlns:xsi	CDATA		#IMPLIED
	xsi:schemaLocation	CDATA	#IMPLIED
	version		CDATA		#REQUIRED >

<!ELEMENT meta		EMPTY >
<!ATTLIST meta
	name		NMTOKEN		#IMPLIED
	content		CDATA		#REQUIRED
	http-equiv	NMTOKEN		#IMPLIED >

<!ELEMENT metadata	ANY >

<!--================================ Dialogs ============================-->

<!ENTITY % input	'grammar' >

<!ENTITY % scope 	'(document | dialog)' >

<!ELEMENT form
	(%input; | %event.handler; | filled | initial | object | link | 
	property | record | script | subdialog | transfer | %variable;)* >
<!ATTLIST form
	id		ID		#IMPLIED
	scope		%scope;		'dialog' >

<!ENTITY % accept.attrs
	"accept	(exact | approximate)	'exact'" >

<!ELEMENT menu
	(%audio; | choice | %event.handler; | prompt | property)* >
<!ATTLIST menu
	id		ID		#IMPLIED
	scope		%scope;		'dialog'
	%accept.attrs;
	dtmf		%boolean;	'false' >

<!ELEMENT choice	( #PCDATA | %input; )* >
<!ATTLIST choice
	%cache.attrs;
	%accept.attrs;
	dtmf		CDATA		#IMPLIED
	%throw.attrs;
	fetchaudio	%uri;		#IMPLIED
	%next.attrs; >

<!--=============================== Prompts =============================-->

<!ELEMENT prompt	(%allowed-within-sentence; | %structure; | lexicon | metadata )* >
<!ATTLIST prompt
	bargein		%boolean;	#IMPLIED
	bargeintype	%bargeintype;	#IMPLIED
	cond		%expression;	#IMPLIED
	count		%integer;	#IMPLIED
	xml:lang	NMTOKEN		#IMPLIED
	timeout		%duration;	#IMPLIED
	version		CDATA		#FIXED '1.0'>

<!ELEMENT enumerate	(%allowed-within-sentence; | %structure;)*>

<!ELEMENT reprompt	EMPTY >

<!--=============================== Fields ==============================-->

<!ELEMENT field
	(%audio; | %event.handler; | filled | %input; | link | option | 
	prompt | property)* >
<!ATTLIST field
	%item.attrs;
	type		CDATA		#IMPLIED
	slot		NMTOKEN		#IMPLIED
	modal		%boolean;	'false' >

<!ELEMENT option 	(#PCDATA)* >
<!ATTLIST option
	dtmf		CDATA		#IMPLIED
	value		CDATA		#IMPLIED
	%accept.attrs; >

<!ELEMENT var		EMPTY >
<!ATTLIST var
	name		%restrictedvariable.name;	#REQUIRED
	expr		%expression;	#IMPLIED >

<!ELEMENT initial
	(%audio; | %event.handler; | link | prompt | property)* >
<!ATTLIST initial
	%item.attrs; >

<!ELEMENT block	(%executable.content;)* >
<!ATTLIST block
	%item.attrs; >

<!ELEMENT assign	EMPTY >
<!ATTLIST assign
	name		%variable.name;	#REQUIRED
	expr		%expression;	#REQUIRED >

<!ELEMENT clear	EMPTY >
<!ATTLIST clear
	namelist	%variable.names;	#IMPLIED >

<!ELEMENT value	EMPTY >
<!ATTLIST value
	expr		%expression;	#REQUIRED >

<!--================================= Events ============================-->

<!ENTITY % event.handler.attrs
	'count		%integer;	#IMPLIED
	cond		%expression;	#IMPLIED' >

<!ELEMENT catch	(%executable.content;)* >
<!ATTLIST catch
	event		%event.names;	#REQUIRED
	%event.handler.attrs; >

<!ELEMENT error	(%executable.content;)* >
<!ATTLIST error
	%event.handler.attrs; >

<!ELEMENT help		(%executable.content;)* >
<!ATTLIST help
	%event.handler.attrs; >

<!ELEMENT link		(%input;)* >
<!ATTLIST link
	%cache.attrs;
	%next.attrs;
	fetchaudio	%uri;		#IMPLIED
	dtmf		CDATA		#IMPLIED
	%throw.attrs; >

<!ELEMENT noinput	(%executable.content;)* >
<!ATTLIST noinput
	%event.handler.attrs; >

<!ELEMENT nomatch	(%executable.content;)* >
<!ATTLIST nomatch
	%event.handler.attrs; >

<!ELEMENT throw	EMPTY >
<!ATTLIST throw
	%throw.attrs; >


<!--============================= Audio Output ==========================-->

<!ELEMENT audio	(%allowed-within-sentence; | %structure; | desc)* >
<!ATTLIST audio
	src		%uri;		#IMPLIED
	expr		%expression;	#IMPLIED
	stream		%uri;		#IMPLIED
	%cache.attrs; >

<!ELEMENT desc (#PCDATA) >

<!ELEMENT paragraph (%allowed-within-sentence; | sentence | s)* >
<!ATTLIST paragraph
	xml:lang	NMTOKEN		#IMPLIED>

<!ELEMENT p (%allowed-within-sentence; | sentence | s)* >
<!ATTLIST p
	xml:lang	NMTOKEN		#IMPLIED>

<!ELEMENT sentence (%allowed-within-sentence;)* >
<!ATTLIST sentence
	xml:lang	NMTOKEN		#IMPLIED>

<!ELEMENT s (%allowed-within-sentence;)* >
<!ATTLIST s
	xml:lang	NMTOKEN		#IMPLIED>

<!ELEMENT voice (%allowed-within-sentence; | %structure;)* >
<!ATTLIST voice
	gender	(male|female|neutral)	#IMPLIED
	age		%integer;	#IMPLIED
	variant		%integer;	#IMPLIED
	name		CDATA		#IMPLIED
	xml:lang	NMTOKEN		#IMPLIED>

<!ELEMENT prosody (%allowed-within-sentence; | %structure;)* >
<!ATTLIST prosody
	pitch		CDATA		#IMPLIED
	contour		CDATA		#IMPLIED
	range		CDATA		#IMPLIED
	rate		CDATA		#IMPLIED
	duration	%duration;	#IMPLIED
	volume		CDATA		#IMPLIED
 >

<!ELEMENT emphasis (%allowed-within-sentence;)* >
<!ATTLIST emphasis
	level		(strong|moderate|none|reduced) 'moderate' >

<!ELEMENT sub (#PCDATA) >
<!ATTLIST sub
	alias		CDATA		#REQUIRED>

<!ELEMENT say-as (#PCDATA | value)* >
<!ATTLIST say-as
	type		CDATA		#IMPLIED
	sub		CDATA		#IMPLIED>

<!ELEMENT phoneme (#PCDATA) >
<!ATTLIST phoneme
	ph		CDATA #REQUIRED
	alphabet	CDATA #IMPLIED >

<!ELEMENT break	EMPTY >
<!ATTLIST break
	size		(none|small|medium|large) 'medium'
	time		%duration;	#IMPLIED >

<!ELEMENT mark		EMPTY >
<!ATTLIST mark
	name		ID		#REQUIRED >

<!ELEMENT speak (%allowed-within-sentence; | %structure;)* >
<!ATTLIST speak
	xml:lang	NMTOKEN		#IMPLIED >

<!--============================ Grammar Input ============================-->

<!ENTITY % rule-expansion "#PCDATA | token | ruleref
				| item | one-of | tag ">

<!ELEMENT ruleref	EMPTY >
<!ATTLIST ruleref
	uri		%uri;		#IMPLIED
	type		CDATA		#IMPLIED
	special		(NULL | VOID | GARBAGE)	#IMPLIED
	xml:lang	NMTOKEN		#IMPLIED >

<!ELEMENT token	(#PCDATA) >
<!ATTLIST token
	xml:lang	NMTOKEN		#IMPLIED >

<!ELEMENT tag		(#PCDATA) >

<!ELEMENT one-of	(item)+ >
<!ATTLIST one-of
	xml:lang	NMTOKEN		#IMPLIED >

<!ELEMENT item		(%rule-expansion;)* >
<!ATTLIST item
	repeat		NMTOKEN		#IMPLIED
	repeat-prob	NMTOKEN		#IMPLIED
	weight		NMTOKEN		#IMPLIED
	xml:lang	NMTOKEN		#IMPLIED >

<!ELEMENT rule		(%rule-expansion; | example)* >
<!ATTLIST rule
	id		ID		#REQUIRED
	scope		(private | public)	'private' >

<!ELEMENT example	(#PCDATA) >

<!ELEMENT lexicon	EMPTY >
<!ATTLIST lexicon
	uri		%uri;		#REQUIRED
	type		CDATA		#IMPLIED >

<!ENTITY % grammar.attrs
	"%cache.attrs;
	scope		%scope;		#IMPLIED
	src		%uri;		#IMPLIED
	type		CDATA		#IMPLIED
	xml:base	%uri;		#IMPLIED
	tag-format	%uri;		#IMPLIED
	version		NMTOKEN		#IMPLIED
	xml:lang	CDATA		#IMPLIED
	weight		CDATA		#IMPLIED
	root		IDREF		#IMPLIED
	mode		(voice | dtmf)	'voice'" >

<!ELEMENT grammar	(#PCDATA | meta | metadata | lexicon | rule)* >
<!ATTLIST grammar
	%grammar.attrs; >

<!ELEMENT record	
	(%audio; | %event.handler; | filled | grammar | prompt | property)* >	
<!ATTLIST record
	%item.attrs;
	type		CDATA		#IMPLIED
	beep		%boolean;	'false'
	maxtime		%duration;	#IMPLIED
	modal		%boolean;	'true'
	finalsilence	%duration;	#IMPLIED
	dtmfterm	%boolean;	'true'  >

<!--=========================== Call Control ===========================-->

<!ELEMENT disconnect	EMPTY >

<!ELEMENT transfer	
	(%audio; | %event.handler; | filled | grammar | prompt | property)* >
<!ATTLIST transfer
	%item.attrs;
	dest		%uri;		#IMPLIED
	destexpr	%expression;	#IMPLIED
	bridge		%boolean;	'true'
	connecttimeout	%duration;	#IMPLIED
	maxtime		%duration;	#IMPLIED
	transferaudio	%uri;		#IMPLIED
	aai		CDATA		#IMPLIED
	aaiexpr		%expression;	#IMPLIED >

<!--=========================== Control Flow ===========================-->

<!ENTITY % if.attrs
	"cond		%expression;	#REQUIRED" >

<!ELEMENT if 		(%executable.content; | elseif | else)* >
<!ATTLIST if
	%if.attrs; >

<!ELEMENT elseif	EMPTY >
<!ATTLIST elseif
	%if.attrs; >

<!ELEMENT else 	EMPTY >

<!ELEMENT exit		EMPTY >
<!ATTLIST exit
	expr		%expression;	#IMPLIED
	namelist	%variable.names;	#IMPLIED >

<!ELEMENT filled 	(%executable.content;)* >
<!ATTLIST filled
	mode		(any|all)	#IMPLIED
	namelist	%restrictedvariable.names;	#IMPLIED >

<!ELEMENT goto		EMPTY >
<!ATTLIST goto
	%cache.attrs;
	%next.attrs;
	fetchaudio	%uri;		#IMPLIED
	expritem	%expression;	#IMPLIED
	nextitem	%restrictedvariable.name;	#IMPLIED >

<!ELEMENT param	EMPTY >
<!ATTLIST param
	name		NMTOKEN		#REQUIRED
	expr		%expression;	#IMPLIED
	value		CDATA		#IMPLIED
	valuetype	(data|ref)	'data'
	type		CDATA		#IMPLIED >

<!ELEMENT return	EMPTY >
<!ATTLIST return
	namelist	%variable.names;	#IMPLIED
	%throw.attrs; >

<!ELEMENT subdialog	
	(%audio; | %event.handler; | filled | param | prompt | property)* >
<!ATTLIST subdialog
	%item.attrs;
	src		%uri;		#IMPLIED
	srcexpr		%expression;	#IMPLIED
	%cache.attrs;
	fetchaudio	%uri;		#IMPLIED
	%submit.attrs; >

<!ELEMENT submit	EMPTY >
<!ATTLIST submit
	%cache.attrs;
	%next.attrs;
	fetchaudio	%uri;		#IMPLIED
	%submit.attrs; >

<!--========================= Miscellaneous =============================-->

<!ELEMENT log		(#PCDATA | value)* >
<!ATTLIST log
	label		CDATA		#IMPLIED
	expr		%expression;	#IMPLIED >

<!ELEMENT object	
	(%audio; | %event.handler; | filled | param | prompt | property)* >
<!ATTLIST object
	%item.attrs;
	%cache.attrs;
	classid		%uri;		#IMPLIED
	codebase	%uri;		#IMPLIED
	data		%uri;		#IMPLIED
	type		CDATA		#IMPLIED
	codetype	CDATA		#IMPLIED
	archive		%uri;		#IMPLIED >

<!ELEMENT property	EMPTY >
<!ATTLIST property
	name		NMTOKEN		#REQUIRED
	value		CDATA		#REQUIRED >

<!ELEMENT script	(#PCDATA)* >
<!ATTLIST script
	src		%uri;		#IMPLIED
	charset		CDATA		'UTF-8'
	%cache.attrs; >

