This work is licensed under a Creative Commons |
HTML Forms are the weakest part of many Web interfaces, they provide limited datatype support, and require a lot of scripting for implementing user-friendly interfaces. XForms are a new technology for form-based data input with a clear separation of data and user interface issues. This way, XForms support device-neutral data input, where devices have a certain degree of freedom for presenting forms and acquiring input data. In addition, XForms are using XML as input and output format, thus making integration into XML-oriented environments easier.
hen and eggproblem
replace="instance"
will only replace the instance (sequential editing)replace="none"
will not replace anything (sequential creation, multi-submit forms)<model><instance><data xmlns=""><accountnumber/><name/><address/></data></instance> <submission method="get" action="…/prefill" id="prefill" replace="instance"/> <submission method="put" action="…/change" id="change" replace="none"/> </model> … <input ref="accountnumber"><label>Account Number</label></input> <submit submission="prefill"><label>Find</label></submit> <input ref="name"><label>Name</label></input> <textarea ref="address"><label>Address</label></textarea> <submit submission="change"><label>Submit</label></submit>
MM/DD/YY
or DD.MM.YY
or YYYY-MM-DD
are all not very user friendly5
and 05
represent the same value)hidethe model behind bindings and only use these for Controls
<xf:bind nodeset="/data/one" id="one" type="xs:integer" /> <xf:bind nodeset="/data/one" relevant="/data/two != 42" /> <xf:bind nodeset="/data/two" id="two" type="xs:integer" /> <xf:bind nodeset="/data/two" readonly="/data/one = 42" /> <xf:bind nodeset="/data/three" id="three" calculate="/data/one + /data/two" /> <xf:bind nodeset="/data/four" id="four" required="/data/three = 42" relevant="/data/three = 42" type="xs:date" constraint="starts-with(text(), '2007')"/>
<xf:input bind="one" incremental="true" /> <xf:input bind="two" incremental="true" /> <xf:input bind="three" incremental="true" /> <xf:input bind="four" incremental="true" />
<xf:secret bind="four" incremental="true" />
<xf:textarea bind="one" incremental="true" /> <xf:textarea bind="two" incremental="true" /> <xf:textarea bind="three" incremental="true" /> <xf:textarea bind="four" incremental="true" />
<xf:output bind="one" incremental="true" /> <xf:output bind="two" incremental="true" /> <xf:output bind="three" incremental="true" /> <xf:output bind="four" incremental="true" /> <xf:output bind="four" value="string-length(.)" incremental="true" />
<xf:upload ref="/data/five"> <xf:label>General Upload: </xf:label> <xf:filename ref="@filename"/> <xf:mediatype ref="@filename"/> </xf:upload> <xf:upload ref="/data/five" mediatype="image/*"> <xf:label>Image Upload: </xf:label> <xf:filename ref="@filename"/> <xf:mediatype ref="@filename"/> </xf:upload> <xf:upload ref="/data/five" mediatype="audio/*"> <xf:label>Audio Upload: </xf:label> <xf:filename ref="@filename"/> <xf:mediatype ref="@filename"/> </xf:upload>
<xf:range bind="one" start="0" end="10" incremental="true"><xf:label>0-10</xf:label></xf:range> <xf:range bind="one" start="0" end="50" incremental="true"><xf:label>0-50</xf:label></xf:range> <xf:range bind="one" start="0" end="100" step="10" incremental="true"><xf:label>0-100@10</xf:label></xf:range>
<xf:trigger bind="one"><xf:label>Button</xf:label></xf:trigger> <xf:trigger bind="six"><xf:label>Button42</xf:label></xf:trigger> <xf:submit submission="save"><xf:label>Save as...</xf:label></xf:submit>
open
<xf:select1 bind="one"> <xf:label>Default: </xf:label> <xf:item><xf:label>One</xf:label><xf:value>1</xf:value></xf:item> <xf:item><xf:label>Two</xf:label><xf:value>2</xf:value></xf:item> <xf:item><xf:label>Three</xf:label><xf:value>3</xf:value></xf:item> <xf:item><xf:label>Four</xf:label><xf:value>4</xf:value></xf:item> </xf:select1> <xf:select1 bind="one" appearance="full"> <xf:label>Full: </xf:label> <xf:item><xf:label>One</xf:label><xf:value>1</xf:value></xf:item> <xf:item><xf:label>Two</xf:label><xf:value>2</xf:value></xf:item> <xf:item><xf:label>Three</xf:label><xf:value>3</xf:value></xf:item> <xf:item><xf:label>Four</xf:label><xf:value>4</xf:value></xf:item> </xf:select1> <xf:select1 bind="one" appearance="compact"> <xf:label>Compact: </xf:label> <xf:item><xf:label>One</xf:label><xf:value>1</xf:value></xf:item> <xf:item><xf:label>Two</xf:label><xf:value>2</xf:value></xf:item> <xf:item><xf:label>Three</xf:label><xf:value>3</xf:value></xf:item> <xf:item><xf:label>Four</xf:label><xf:value>4</xf:value></xf:item> </xf:select1> <xf:select1 bind="one" appearance="minimal"> <xf:label>Minimal: </xf:label> <xf:item><xf:label>One</xf:label><xf:value>1</xf:value></xf:item> <xf:item><xf:label>Two</xf:label><xf:value>2</xf:value></xf:item> <xf:item><xf:label>Three</xf:label><xf:value>3</xf:value></xf:item> <xf:item><xf:label>Four</xf:label><xf:value>4</xf:value></xf:item> </xf:select1>
<xf:select bind="one"> <xf:label>Default: </xf:label> <xf:item><xf:label>One</xf:label><xf:value>1</xf:value></xf:item> <xf:item><xf:label>Two</xf:label><xf:value>2</xf:value></xf:item> <xf:item><xf:label>Three</xf:label><xf:value>3</xf:value></xf:item> <xf:item><xf:label>Four</xf:label><xf:value>4</xf:value></xf:item> </xf:select> <xf:select bind="one" appearance="full"> <xf:label>Full: </xf:label> <xf:item><xf:label>One</xf:label><xf:value>1</xf:value></xf:item> <xf:item><xf:label>Two</xf:label><xf:value>2</xf:value></xf:item> <xf:item><xf:label>Three</xf:label><xf:value>3</xf:value></xf:item> <xf:item><xf:label>Four</xf:label><xf:value>4</xf:value></xf:item> </xf:select> <xf:select bind="one" appearance="compact"> <xf:label>Compact: </xf:label> <xf:item><xf:label>One</xf:label><xf:value>1</xf:value></xf:item> <xf:item><xf:label>Two</xf:label><xf:value>2</xf:value></xf:item> <xf:item><xf:label>Three</xf:label><xf:value>3</xf:value></xf:item> <xf:item><xf:label>Four</xf:label><xf:value>4</xf:value></xf:item> </xf:select> <xf:select bind="one" appearance="minimal"> <xf:label>Minimal: </xf:label> <xf:item><xf:label>One</xf:label><xf:value>1</xf:value></xf:item> <xf:item><xf:label>Two</xf:label><xf:value>2</xf:value></xf:item> <xf:item><xf:label>Three</xf:label><xf:value>3</xf:value></xf:item> <xf:item><xf:label>Four</xf:label><xf:value>4</xf:value></xf:item> </xf:select>
<xf:textarea bind="data" incremental="true"> <xf:label>Your Message (characters remaining: <xf:output bind="length"/>)</xf:label> <xf:help>Enter the message text you wish to send as an SMS message.</xf:help> <xf:hint>Message text</xf:hint> <xf:alert>Additional characters will be truncated!</xf:alert> </xf:textarea>
on*
attributes in HTML<screen>0</screen> <screenbuffer>0</screenbuffer> <first>0</first> <second>0</second> <memory>0</memory> <result />
<xf:trigger> <xf:label>4</xf:label> <xf:action ev:event="DOMActivate"> <xf:setvalue ref="/equation/screenbuffer" value="/equation/screenbuffer * 10 + 4" /> <xf:setvalue ref="/equation/screen" value="/equation/screenbuffer" /> </xf:action> </xf:trigger>
<xf:trigger> <xf:label>+</xf:label> <xf:action ev:event="DOMActivate"> <xf:setvalue ref="/equation/first" value="/equation/screen" /> <xf:setvalue ref="/equation/screenbuffer" value="0" /> <xf:toggle ev:event="DOMActivate" case="add" /> </xf:action> </xf:trigger>
<xf:switch> <xf:case id="add"> <xf:trigger> <xf:label>=</xf:label> <xf:action ev:event="DOMActivate"> <xf:setvalue ref="/equation/second" value="/equation/screenbuffer" /> <xf:setvalue ref="/equation/result" value="/equation/first + /equation/second" /> <xf:setvalue ref="/equation/screen" value="/equation/result" /> <xf:setvalue ref="/equation/screenbuffer" value="0" /> </xf:action> </xf:trigger> </xf:case>