1 datatypes w = "http://whattf.org/datatype-draft"
3 # #####################################################################
4 ## RELAX NG Schema for HTML 5: Web Forms 2.0 markup #
5 # #####################################################################
7 ## Shared attributes for form controls
10 ( common-form.attrs.form? )
12 common-form.attrs.form |=
17 shared-form.attrs.formaction =
18 attribute formaction {
19 common.data.uri.non-empty
22 shared-form.attrs.formenctype =
23 attribute formenctype {
24 shared-form.attrs.formenctype.data
26 shared-form.attrs.formenctype.data =
27 ( w:string "application/x-www-form-urlencoded"
28 | w:string "multipart/form-data"
29 | w:string "text/plain"
32 shared-form.attrs.formmethod =
33 attribute formmethod {
34 shared-form.attrs.formmethod.data
36 shared-form.attrs.formmethod.data =
41 shared-form.attrs.formtarget =
42 attribute formtarget {
43 common.data.browsing-context-or-keyword
46 shared-form.attrs.formnovalidate =
47 attribute formnovalidate {
48 w:string "formnovalidate" | w:string ""
51 shared-form.attrs.autofocus =
53 w:string "autofocus" | w:string ""
56 shared-form.attrs.pattern =
61 shared-form.attrs.template =
66 shared-form.attrs.required =
68 w:string "required" | w:string ""
71 shared-form.attrs.placeholder =
72 attribute placeholder {
73 form.data.stringwithoutlinebreaks
76 shared-form.attrs.dirname =
78 form.data.nonemptystring
81 shared-form.attrs.inputmode =
86 ## Shared attributes for <input>
89 ( input.attrs.autocomplete?
90 & shared-form.attrs.autofocus?
92 & shared-form.attrs.maxlength?
93 & shared-form.attrs.minlength?
94 & shared-form.attrs.pattern?
95 & shared-form.attrs.placeholder?
96 & shared-form.attrs.readonly?
97 & shared-form.attrs.required?
98 & shared-form.attrs.size?
101 input.attrs.autocomplete =
102 attribute autocomplete {
103 w:string "on" | w:string "off"
111 input.attrs.step.float =
113 w:string "any" | common.data.float.positive
116 input.attrs.step.integer =
118 w:string "any" | common.data.integer.positive
121 input.attrs.multiple =
123 w:string "multiple" | w:string ""
126 ## Text Field: <input type='text'>, Extensions
129 ( input.attrs.autocomplete?
130 & shared-form.attrs.autofocus?
131 & shared-form.attrs.dirname?
133 & shared-form.attrs.pattern?
134 & shared-form.attrs.required?
135 & shared-form.attrs.placeholder?
136 & shared-form.attrs.inputmode?
139 ## Password Field: <input type='password'>, Extensions
141 input.password.attrs &=
142 ( input.attrs.autocomplete?
143 & shared-form.attrs.autofocus?
145 & shared-form.attrs.pattern?
146 & shared-form.attrs.placeholder?
147 & shared-form.attrs.required?
150 ## Checkbox <input type='checkbox'>, Extensions
152 input.checkbox.attrs &=
153 ( shared-input.attrs )
155 ## Radiobutton: <input type='radio'>, Extensions
158 ( shared-input.attrs )
160 ## Scripting Hook Button: <input type='button'>, Extensions
162 input.button.attrs &=
163 ( shared-input.attrs )
165 ## Submit Button: <input type='submit'>, Extensions
167 input.submit.attrs &=
169 & shared-form.attrs.formaction?
170 & shared-form.attrs.formenctype?
171 & shared-form.attrs.formmethod?
172 & shared-form.attrs.formtarget?
173 & shared-form.attrs.formnovalidate?
176 ## Reset Button: <input type='reset'>, Extensions
179 ( shared-input.attrs )
181 ## File Upload: <input type='file'>, Extensions
185 & input.attrs.multiple?
188 ## Image Submit Button: <input type='image'>, Extensions
192 & shared-form.attrs.formaction?
193 & shared-form.attrs.formenctype?
194 & shared-form.attrs.formmethod?
195 & shared-form.attrs.formtarget?
196 & shared-form.attrs.formnovalidate?
197 & input.image.attrs.height?
198 & input.image.attrs.width?
200 input.image.attrs.height =
202 common.data.integer.non-negative
204 input.image.attrs.width =
206 common.data.integer.non-negative
209 ## Global Date and Time: <input type='datetime'>
211 input.datetime.elem =
212 element input { input.datetime.attrs }
213 input.datetime.attrs =
217 & input.datetime.attrs.type
218 & input.datetime.attrs.min?
219 & input.datetime.attrs.max?
220 & input.attrs.step.float?
221 & input.datetime.attrs.value?
224 input.datetime.attrs.type =
228 input.datetime.attrs.min =
232 input.datetime.attrs.max =
236 input.datetime.attrs.value =
238 w:string "" | common.data.datetime
241 input.elem |= input.datetime.elem
243 ## Date and Time with No Time Zone Information: <input type='datetime-local'>
245 input.datetime-local.elem =
246 element input { input.datetime-local.attrs }
247 input.datetime-local.attrs =
251 & input.datetime-local.attrs.type
252 & input.datetime-local.attrs.min?
253 & input.datetime-local.attrs.max?
254 & input.attrs.step.float?
255 & input.datetime-local.attrs.value?
258 input.datetime-local.attrs.type =
260 w:string "datetime-local"
262 input.datetime-local.attrs.min =
264 form.data.datetime-local
266 input.datetime-local.attrs.max =
268 form.data.datetime-local
270 input.datetime-local.attrs.value =
272 w:string "" | form.data.datetime-local
275 input.elem |= input.datetime-local.elem
277 ## Date: <input type='date'>
280 element input { input.date.attrs }
285 & input.date.attrs.type
286 & input.date.attrs.min?
287 & input.date.attrs.max?
288 & input.attrs.step.integer?
289 & input.date.attrs.value?
292 input.date.attrs.type =
296 input.date.attrs.min =
300 input.date.attrs.max =
304 input.date.attrs.value =
306 w:string "" | form.data.date
309 input.elem |= input.date.elem
311 ## Year and Month: <input type='month'>
314 element input { input.month.attrs }
319 & input.month.attrs.type
320 & input.month.attrs.min?
321 & input.month.attrs.max?
322 & input.attrs.step.integer?
323 & input.month.attrs.value?
326 input.month.attrs.type =
330 input.month.attrs.min =
334 input.month.attrs.max =
338 input.month.attrs.value =
340 w:string "" | form.data.month
343 input.elem |= input.month.elem
345 ## Time without Time Zone Information: <input type='time'>
348 element input { input.time.attrs }
353 & input.time.attrs.type
354 & input.time.attrs.min?
355 & input.time.attrs.max?
356 & input.attrs.step.float?
357 & input.time.attrs.value?
360 input.time.attrs.type =
364 input.time.attrs.min =
368 input.time.attrs.max =
372 input.time.attrs.value =
374 w:string "" | form.data.time
377 input.elem |= input.time.elem
379 ## Year and Week: <input type='week'>
382 element input { input.week.attrs }
387 & input.week.attrs.type
388 & input.week.attrs.min?
389 & input.week.attrs.max?
390 & input.attrs.step.integer?
391 & input.week.attrs.value?
394 input.week.attrs.type =
398 input.week.attrs.min =
402 input.week.attrs.max =
406 input.week.attrs.value =
408 w:string "" | form.data.week
411 input.elem |= input.week.elem
413 ## Number: <input type='number'>
416 element input { input.number.attrs }
421 & input.number.attrs.type
422 & input.number.attrs.min?
423 & input.number.attrs.max?
424 & input.attrs.step.float?
425 & input.number.attrs.value?
426 & ( common.attrs.aria.implicit.spinbutton
427 | common.attrs.aria.role.spinbutton
430 input.number.attrs.type =
434 input.number.attrs.min =
438 input.number.attrs.max =
442 input.number.attrs.value =
444 w:string "" | common.data.float
447 input.elem |= input.number.elem
449 ## Imprecise Number: <input type='range'>
452 element input { input.range.attrs }
457 & input.range.attrs.type
458 & input.range.attrs.min?
459 & input.range.attrs.max?
460 & input.attrs.step.float?
461 & input.range.attrs.value?
462 & ( common.attrs.aria.implicit.slider
463 | common.attrs.aria.role.slider
466 input.range.attrs.type =
470 input.range.attrs.min =
474 input.range.attrs.max =
478 input.range.attrs.value =
483 input.elem |= input.range.elem
485 ## Email Address: <input type='email'>
488 element input { input.email.attrs }
493 & input.email.attrs.type
494 & ( ( input.attrs.multiple
495 & input.email.attrs.value.multiple?
497 | input.email.attrs.value.single?
499 & ( common.attrs.aria.implicit.textbox
500 | common.attrs.aria.implicit.combobox
501 | common.attrs.aria.role.textbox
502 | common.attrs.aria.role.combobox
505 input.email.attrs.type =
509 input.email.attrs.value.single =
511 form.data.emailaddress
513 input.email.attrs.value.multiple =
515 form.data.emailaddresslist
518 input.elem |= input.email.elem
520 ## IRI: <input type='url'>
523 element input { input.url.attrs }
528 & input.url.attrs.type
529 & input.url.attrs.value?
530 & ( common.attrs.aria.implicit.textbox
531 | common.attrs.aria.implicit.combobox
532 | common.attrs.aria.role.textbox
533 | common.attrs.aria.role.combobox
536 input.url.attrs.type =
540 input.url.attrs.value =
542 w:string "" | common.data.uri.absolute
545 input.elem |= input.url.elem
547 ## Search: <input type='search'>
550 element input { input.search.attrs }
555 & input.search.attrs.type
556 & input.search.attrs.value?
557 & shared-form.attrs.dirname?
558 & ( common.attrs.aria.implicit.textbox
559 | common.attrs.aria.implicit.combobox
560 | common.attrs.aria.role.textbox
561 | common.attrs.aria.role.combobox
564 input.search.attrs.type =
568 input.search.attrs.value =
570 form.data.stringwithoutlinebreaks
573 input.elem |= input.search.elem
575 ## Telephone Number: <input type='tel'>
578 element input { input.tel.attrs }
583 & input.tel.attrs.type
584 & input.tel.attrs.value?
585 & ( common.attrs.aria.implicit.textbox
586 | common.attrs.aria.implicit.combobox
587 | common.attrs.aria.role.textbox
588 | common.attrs.aria.role.combobox
591 input.tel.attrs.type =
595 input.tel.attrs.value =
597 form.data.stringwithoutlinebreaks
600 input.elem |= input.tel.elem
602 ## Color: <input type='color'>
605 element input { input.color.attrs }
609 & input.color.attrs.type
610 & input.color.attrs.value?
614 input.color.attrs.type =
618 input.color.attrs.value =
620 w:string "" | form.data.color
623 input.elem |= input.color.elem
625 ## Form Output: <output>
628 element output { output.inner & output.attrs }
631 & common-form.attrs.name?
632 & common-form.attrs.form?
634 & ( common.attrs.aria.implicit.status
640 common.data.idrefs #REVISIT spec says space--not whitespace
643 ( common.inner.phrasing )
645 common.elem.phrasing |= output.elem
647 ## Text Area: <textarea>, extensions
649 textarea.attrs.rows-and-cols-wf1.inner &=
651 textarea.attrs.rows-and-cols-wf1 |=
654 ( shared-form.attrs.maxlength?
655 & shared-form.attrs.minlength?
656 & shared-form.attrs.autofocus?
657 & shared-form.attrs.required?
658 & shared-form.attrs.placeholder?
659 & shared-form.attrs.dirname?
660 & textarea.attrs.rows?
661 & ( ( textarea.attrs.wrap.hard
662 & textarea.attrs.cols
664 | ( textarea.attrs.wrap.soft?
665 & textarea.attrs.cols?
668 & shared-form.attrs.inputmode?
670 textarea.attrs.wrap.hard =
674 textarea.attrs.wrap.soft =
679 ## List of Prefill Data: <datalist>
681 #REVISIT should the options in datalist be non-selectable?
684 element datalist { datalist.inner & datalist.attrs }
686 ( option.elem* & common.inner.phrasing )
689 & ( common.attrs.aria.role.listbox # aria-multiselectable must be false; check by assertions
690 | common.attrs.aria.role.presentation
691 | common.attrs.aria.role.menuitem
695 common.elem.phrasing |= datalist.elem
697 ## Complex Submit Button: <button type='submit'>, extensions
699 button.submit.attrs &=
700 ( shared-form.attrs.formaction?
701 & shared-form.attrs.autofocus?
702 & shared-form.attrs.formenctype?
703 & shared-form.attrs.formmethod?
704 & shared-form.attrs.formtarget?
705 & shared-form.attrs.formnovalidate?
708 ## Complex Reset Button: <button type='reset'>, extensions
710 button.reset.attrs &=
711 ( shared-form.attrs.autofocus? )
713 ## Complex Push Button: <button type='button'>, extensions
715 button.button.attrs &=
716 ( shared-form.attrs.autofocus? )
718 ## Form: <form>, extensions
720 ( form.attrs.novalidate?
722 & form.attrs.autocomplete?
724 form.attrs.novalidate =
725 attribute novalidate {
726 w:string "novalidate" | w:string ""
730 common.data.browsing-context-or-keyword
732 form.attrs.autocomplete =
733 attribute autocomplete {
734 w:string "on" | w:string "off"
736 # REVISIT should this be case-insensitive in conforming XHTML documents?
737 form.attrs.enctype.data |=
738 ( w:string "text/plain" )
740 ## Fieldset: <fieldset>, extensions
743 ( common-form.attrs )
745 ## Label: <label>, extensions
748 ( common-form.attrs.form? )
750 ## Key-pair generator/input control: <keygen>
753 element keygen { keygen.inner & keygen.attrs }
756 & keygen.attrs.challenge?
757 & keygen.attrs.keytype?
758 & shared-form.attrs.autofocus?
760 & ( common.attrs.aria.role.presentation
761 | common.attrs.aria.role.menuitem
764 keygen.attrs.challenge =
765 attribute challenge {
768 keygen.attrs.keytype =
775 common.elem.phrasing |= keygen.elem
777 ## Selection Menu: <select>, Extensions
780 ( shared-form.attrs.autofocus?
781 & shared-form.attrs.required?