Mit XForms entwickelt das W3C die nächste Generation von Web-Formularen. Ziel dabei ist es, die Komplexität beherrschbar zu machen, die notwendige Dynamik zu unterstützen, multimodale Interaktion zu unterstützen und Geräteunabhängigkeit zu garantieren.
Formulare im Web werden hinsichtlich der immer weiter
getriebenen Entwicklung von interaktiven
Web-Applikationen immer wichtiger.
XForms
sind eine Weiterentwicklung der für HTML definierten
Formulare, sie basieren auf XML. Der Begriff
XForms
versammelt zunächst zwei Teilbereiche unter sich,
nämlich das
XForms-Modell
sowie das
XForms User Interface
. Dadurch wird, im Gegensatz zu den hergebrachten HTML
Web-Formularen, die Trennung von Inhalt und Präsentation
des Formulars ermöglicht. Modell und User-Interface
gehen dabei Hand in Hand.

Ein Formularmodell, das durch ein XForms Modell beschrieben ist, kann mit unterschiedlichen Benutzerschnittstellen zusammenarbeiten.

Ein XForms-Formular sammelt in erster Linie Daten. Diese Daten werden in Form von XML gehalten (sog. Instanzdaten ). Die Struktur dieser Daten wird durch das XForms-Modell beschrieben.
Datenaustausch der Instanzdaten zum und vom
XForms-Prozessor über
XForms Submit Protocol
: definiert, wie XForms Daten senden und empfangen.
Vervollständigung eines Formulars kann angehalten und
wieder aufgenommen werden.
Die Entwicklung von XForms als Weiterentwicklung der HTML Formulare versuchte mehrere Defizite der HTML-Formulare zu beheben:
labels. Die Realisierung verschiedener Eingabemöglichkeiten wird hiermit erleichtert.
XForms-Formulare bestehen zunächst aus einem Teil, der das Formular selbst beschreibt: das XForms-Modell. In einem anderen Teil wird beschrieben, wie das Formular dargestellt wird.
Wir wollen uns anhand eines einfachen e-Commerce-Formulars den Aufbau erarbeiten. Das Formular soll ermitteln, ob per Vorkasse oder mit Kreditkarte bezahlt werden soll. Falls mit Kreditkarte bezahlt wird, soll die Kreditkartennummer und das Gültigkeitsdatum eingegeben werden.
Ein derartiges Formular könnte etwa wie folgt in einem
XForms
model
Element modelliert werden:
<xforms:model>
<xforms:instance>
<ecommerce xmlns="">
<method/>
<number/>
<expiry/>
</ecommerce>
</xforms:instance>
<xforms:submission action="http://example.com/submit" method="post" id="submit" includenamespaceprefixes=""/>
</xforms:model>
Aussage: Im Formular werden drei Informationen
gesammelt. Diese Informationen werden an die URL, die
als Wert des
action
-Attributs angegeben ist, übermittelt.
Achtung: Über die Datentypen im Formular wurden noch keine Aussagen getroffen!
Hinweis: in XHTML findet sich
model
-Information zumeist innerhalb des
head
-Elements.
Hinweis: Der Großteil der hier besprochenen Beispiele entstammt der XForms Spezifikation des W3C.
In einem zweiten Schritt werden die Kontrollelemente im
Formular vorgesehen und mit dem Modell verbunden. Die
Verknüpfung mit dem Modell geschieht über den
sogenannten
Bindemechanismus
. In diesem einfachen Fall wird mit Hilfe des
ref
-Attributs der Kontrollelemente auf die jeweilige
Modellelemente referenziert.
<select1 ref="method">
<label>Zahlungsmethode:</label>
<item>
<label>Vorkasse</label>
<value>vorkasse</value>
</item>
<item>
<label>Kreditkarte</label>
<value>kreditkarte</value>
</item>
</select1>
<input ref="number">
<label>Kreditkartennummer:</label>
</input>
<input ref="expiry">
<label>Gueltig bis:</label>
</input>
<submit submission="submit">
<label>Submit</label>
</submit>Die in XForms definierten Kontrollelemente zeichnen sich durch ihre Geräte- und Plattformunabhängigeit aus.
Hinweis: in XHTML findet sich diese Information
innerhalb des
body
-Elements.
Eigenschaften dieses Formularentwurfs:
select onedarstellen.
Labelsals Kindelemente. So wird die Zugreifbarkeit verbessert.
form
-Elemente einzubetten.
Dargestellt in einem Web Browser, könnte das soeben modellierte Formular folgendermaßen aussehen:

Für Firefox existiert ein Plugin, mit dem XForms-Formulare angezeigt werden können: Mozilla XForms Plugin
Wenn Sie dieses Plugin installiert haben, können Sie auf der hier verlinkten Seite sehen, wie das Formular in Firefox dargestellt wird: XHTML-Beispielseite mit einfachem XForms-Formular
Nehmen wir an, das soeben modellierte Formular ist
Bestandteil einer Webseite und wurde von einem Benutzer
ausgefüllt.
Das zugehörige Instanzdokument, das dann vom
XForms-Prozessor übertragen wird, kann folgendermaßen
aussehen:
<ecommerce> <method>cc</method> <number>1235467789012345</number> <expiry>2001-08</expiry> </ecommerce>
Mit Hilfe der Instanzdaten verfolgt ein XForms Prozessor
den Zustand des Formulars, während es befüllt wird. Das
Element
instance
beinhaltet dabei im Wesentlichen ein
Skelettdokument
, das aktualisiert wird, während der Benutzer das
Formular ausfüllt. Wenn das Formular übermittelt wird,
werden die Instanzdaten als XML-Dokument geschrieben
(serialisiert).
Eine leichte Abwandlung des vorherigen Beispiels:
<xforms:model>
<xforms:instance>
<payment method="cc" xmlns="http://commerce.example.com/payment">
<number/>
<expiry/>
</payment>
</xforms:instance>
<xforms:submission action="http://example.com/submit" method="post" includenamespaceprefixes="#default"/>
</xforms:model>könnte folgendermaßen übertragen werden:
<payment method="cc" xmlns="http://commerce.example.com/payment"> <number>1235467789012345</number> <expiry>2001-08</expiry> </payment>
Folgende Eigenschaften fallen auf:
number
und
expiry
dienen als
Platzhalterin der XML Struktur. Sie werden mit den Daten, die der Benutzer im Formular angibt, befüllt.
ccwird mit Hilfe des Attributs
method
in den Instanzdaten vorbefüllt. Wenn der Benutzer
den Wert im Formular ändert, wird dieser Vorgabewert
im übermittelten XML-Dokument durch den angegebenen
Wert ersetzt.
Die Verknüpfung dieser Instanzdaten mit den
Kontrollelementen erfolgt wieder mit Hilfe der
sogenannten
Binding Expressions
, die auf XPath basieren (vgl. Verwendung des
@
-Zeichens zum Zugriff auf Attribute).
... xmlns:my="http://commerce.example.com/payment" ... <xforms:select1 ref="@method">...</xforms:select1> ... <xforms:input ref="my:number">...</xforms:input> ... <xforms:input ref="/my:payment/my:expiry">...</xforms:input>
Mit XForms können Daten bereits auf Gültigkeit geprüft werden, sobald sie in das Formular eingegeben werden.
Wenn keine Information über die Datentypen im Formular vorliegen, wird für alle Felder der Datentyp String angenommen.
Es ist jedoch möglich, den Werten in den Instanzdaten Typen zuzuweisen.
Im folgenden Beispiel sollen folgende Bechränkungen für unser Beispielformular implementiert werden:
number
sollen nur nur Zahlen als Eingabe erlaubt sein,
diese dürfen zwischen 14 und 18 Ziffern lang sein.
expiry
soll nur gültige Kombinationen aus Monat und Datum
enthalten
Model Item Properties erlauben es dem Autor eines Formulars, solche beschreibende Information, mit deren Hilfe die Gültigkeit eines Wertes bestimmt werden kann, anzugeben:
bind
-Elemente, wie z.B.
relevant
.
... xmlns:my="http://commerce.example.com/payment"...
<xforms:model>
...
<xforms:bind
nodeset="/my:payment/my:number"
relevant="/my:payment/@method = 'cc'"
required="true()"
type="my:ccnumber" />
<xforms:bind
nodeset="/my:payment/my:expiry"
relevant="/my:payment/@method = 'cc'"
required="true()"
type="xsd:gYearMonth" />
<xsd:schema ...>
...
<xsd:simpleType name="ccnumber">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{14,18}" />
</xsd:restriction>
</xsd:simpleType>
...
</xsd:schema>
</xforms:model>In einem Dokument kann eine uneingeschränkte Anzahl von einzelnen Formularen nebeneinander definiert sein.
Jedes dieser Formulare benötigt lediglich ein eigenes
model
-Element mit einem
id
-Attribut. So kann es von jeder Stelle des Dokuments aus
referenziert werden.
Die Kontrollelemente müssen zusätzlich Information
enthalten, welches
model
-Element die Instanzdaten beinhaltet, mit denen das
Kontrollelement verknüpft wird. Hierfür existiert ein
model
- Attribut für das
binding
-Element.
Ist kein
model
-Attribut angegeben, so wird das Modell verwendet, das
bei einem (dem nächstgelegenen) Vorfahr im Dokument
angegeben ist, andernfalls das erste Modell des gesamten
Dokuments.
Für unser Beispielformular soll nun zusätzlich ein Formular angegeben werden, das eine Meinungsumfrage beinhaltet. Dazu wird das Modell des Formulars zunächst folgendermaßen erweitert:
<xforms:model>
<xforms:instance>
...payment instance data...
</xforms:instance>
<xforms:submission action="http://example.com/submit" method="post"/>
</xforms:model>
<xforms:model id="poll">
<xforms:instance>
<helpful/>
</xforms:instance>
<xforms:submission id="pollsubmit" .../>
</xforms:model>Außerdem werden folgende Kontrollelemente benötigt:
[ Could not find listing file "xforms-example-9.xml" ]
model
-Attributs zur Referenzierung auf das
Formularmodell, mit dem die Kontrollelemente
verknüpft sind
Allgemeine Bedingungen für XForms-Dokumente
http://www.w3.org/2002/xforms
befinden.
src
-Attributs. Es wird angenommen, daß die so
angegebenen Ressourcen zugreifbar sind.
ref
(XPath-Ausdruck),
model
(ID eines Modells) und
bind
(Verweis auf ein
bind
-Element) ausgedrückt.
Ein XForms-Formular besteht aus folgenden Strukturelementen:
model
: kann die Kindelemente
instance
,
schema
,
submission
,
bind
sowie Kindelemente der Elementmenge
Action
enthalten
instance
mit beliebigen Kindelementen
submission
mit Kindelementen aus
Action
bind
mit beliebigen Kindelementen
model
-Element
model
entspricht einer Formulardefinition. Innerhalb dieses
Elements werden die Elemente aufgezählt, die das
XForms-Modell definieren. Es können beliebig viele
model
-Elemente in einem Dokument enthalten sein.
Erlaubte Attribute:
ID
: ID des Modells zur Referenzierung
schema
: Link auf XML-Schema-Dokumente, die sich außerhalb
des aktuellen
model
-Elements befinden.
<xforms:model id="bezahlung">
<xforms:instance>
<payment method="kreditkarte"
xmlns="http://commerce.example.com/payment">
<number/>
<expiry/>
</payment>
</xforms:instance>
<xforms:submission id="submit01" method="post" action="http://example.com/submit"/>
<xforms:submission id="submit02" method="put" action="file:///temp/examplePayment.xml"/>
<xforms:bind nodeset="/my:payment/my:number"
relevant="/my:payment/@method = 'kreditkarte'"
required="/my:payment/@method = 'kreditkarte'"
type="my:kreditkartennummer" />
<xforms:bind nodeset="/my:payment/my:expiry"
relevant="/my:payment/@method = 'kreditkarte'"
required="/my:payment/@method = 'kreditkarte'"
type="xsd:gYearMonth" />
<xsd:schema targetNamespace="http://commerce.example.com/payment" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="kreditkartennummer">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{14,18}" />
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="payment">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="number" type="my:kreditkartennummer" minOccurs="0"/>
<xsd:element name="expiry" type="xsd:gYearMonth" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="method" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</xforms:model>
<xforms:model id="poll">
<xforms:instance>
<helpmodel xmlns="http://commerce.example.com/help">
<helpful>3</helpful>
</helpmodel>
</xforms:instance>
<xforms:submission id="pollsubmit" method="post"
action="http://xformstest.org/cgi-bin/echo.sh" />
</xforms:model>instance
-Element
Das Element enthält oder referenziert erste Instanzdaten des Formulars mit eventuellen Vorbefüllungen für Formularwerte. Wenn sowohl eine Referenz auf Instanzdaten existiert und gleichzeitig Instanzdaten als Kindelemente des Elements angegeben sind, so sind die referenzierten Daten höherprior und werden verwendet.
Erlaubte Attribute:
src
: referenziert eine XML-Datei mit Instanzdaten
<xforms:model id="bezahlung">
<xforms:instance src="xforms-example-5-instance.xml" />
<xforms:submission id="submit01" method="post" action="http://example.com/submit"/>
<xforms:submission id="submit02" method="put" action="file:///temp/examplePayment.xml"/>
<xforms:bind nodeset="/my:payment/my:number"
relevant="/my:payment/@method = 'kreditkarte'"
required="/my:payment/@method = 'kreditkarte'"
type="my:kreditkartennummer" />
<xforms:bind nodeset="/my:payment/my:expiry"
relevant="/my:payment/@method = 'kreditkarte'"
required="/my:payment/@method = 'kreditkarte'"
type="xsd:gYearMonth" />
<xsd:schema targetNamespace="http://commerce.example.com/payment" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="kreditkartennummer">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{14,18}" />
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="payment">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="number" type="my:kreditkartennummer" minOccurs="0"/>
<xsd:element name="expiry" type="xsd:gYearMonth" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="method" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</xforms:model>Für die Übertragung eines Formular(teil)s darf immer nur genau ein Submit-Prozess aktiv sein. Bei einer Übertragung laufen folgende Schritte ab:
, wird ausgewählt. Er und all seine Nachkommen sind
für den nachfolgenden Prozess relevant.
body
wird der gesamte Dokumentinhalt durch den
erhaltenen
body
ersetzt. Voraussetzung: das
replace
-Attribut des
submission
-Elements hat den Wert
all
.
body
eines XML-Medientyps wird die Antwort als XML
geparst. Voraussetzung: Das
replace
-Attributs des Elements
submission
hat den Wert
instance
. Die Instanzdaten werden durch die
Ergebnisdaten ersetzt.
body
eines nicht auf XML basierenden Medientypen wird
nichts ersetzt.
replace
-Attributs
none
beträgt.
replace
sind nicht definiert.
submission
-Element
Das Element enthält beschreibende Informationen darüber, was wie übertragen werden soll.
Erlaubte Attribute:
bind
: optional, Verweis auf ein
bind
-Rlement. Die Referenz, die durch dieses Attribut
definiert ist, ist höherprior als eine evtl.
Referenz durch ein
ref
-Attribut.
ref
: optional, ermöglicht die Auswahl einer Teilmenge
der Instanzdaten. Der ausgewählte Knoten wird samt
seiner Nachfolger für die Übertragung ausgewählt.
Der Vorgabewert ist
/.
action
: zwingend anzugeben, enthält die URI, an die die
Instanzdaten übermittelt werden. Das angegebene
URI-Schema hat Einfluß auf das
Übertragungsprotokoll.
method
: zwingend anzugeben, gibt indirekt die
Serialisierung an an, mit der die Instanzdaten
übertragen werden. Zulässige Werte sind:
post
,
get
,
put
,
multipart-post
,
form-data-post
,
urlencoded-post
(veraltet),
version
: optional, gibt die XML-Version an, die für die
Serialisierung des Dokuments verwendet werden soll.
indent
: optional, gibt an, ob während des
Serialisierungsprozesses zusätzliche Leerzeichen in
das Dokument eingefügt werden sollen, um die
Lesbarkeit zu erhöhen.
mediatype
: optional, gibt den Medientyp für die
Serialisierung der Instanzdaten an. Der angegebene
Typ sollte mit
application/xml
kompatibel sein.
encoding
: optional, gibt die Kodierung für die
Serialisierung an.
omit-xml-declaration
: optional, gibt an, ob die XML-Deklaration
serialisiert werden soll oder nicht.
standalone
: optional, gibt an, ob eine Standalone-Deklaration
in das Ergebnisdokument eingefügt werden soll.
replace
: optional, gibt an wie die erhaltene Antwort auf
das Instanzdokument angewendet wird. Fehlt das
Attribut, gilt der Vorgabewert
all
.
instance
: optional, gibt die Instanz an, die ersetzt werden
soll, wenn der Wert des
replace
-Attributs mit
instance
angegeben ist. Fehlt das Attribut, so wird als
Vorgabe die Instanz angenommen, die die zu
übertragenden Daten enthält.
separator
: optional, gibt das Trennzeichen an, das bei der
URL Codierung als Trennzeichen zwischen
Name-Wert-Paaren verwendet wird. Vorgabewert ist
;.
includenamespaceprefixes
: optional, erlaubt die Kontrolle über die
Serialisierung der Namensräume. Fehlt das Attribut,
werden alle Namensräume serialisiert, unabhängig
davon, ob sie verwendet werden oder nicht. Ist das
Attribut vorhanden und leer, so werden nur die
verwendeten Namensräume serialisiert. Es kann eine
Liste von Namensraumpräfixen angegeben werden, die
zusätzlich zu den verwendeten Namensräumen
serialisiert werden sollen.
Die folgende Tabelle gibt eine Übersicht über die zulässigen Wertekombinationen
| URI Schema |
method
|
Serialisierung | Übertragungsprotokoll |
|---|---|---|---|
http
,
https
,
mailto
|
post
|
application/xml
|
HTTP POST
oder kompatibel
|
http
,
https
,
file
|
get
|
application/x-www-form-urlencoded
|
HTTP GET
oder kompatibel
|
http
,
https
,
file
|
put
|
application/xml
|
HTTP PUT
oder kompatibel
|
http
,
https
,
mailto
|
multipart-post
|
multipart/related
|
HTTP POST
oder kompatibel
|
http
,
https
,
mailto
|
form-data-post
|
multipart/form-data
|
HTTP POST
oder kompatibel
|
http
,
https
,
mailto
|
urlencoded-post
|
application/x-www-form-urlencoded
|
HTTP POST
oder kompatibel
|
bind
-Element
Das Element wählt über das Attribute
nodeset
eine Knotenmenge aus den Instanzdaten aus. Für diese
Knotenmenge kann dann zum Beispiel mit dem Attribut
type
ein Datentyp definiert werden. Allgemein gesprochen wird
eine Modelleigenschaft
type
readonly
required
relevant
calculate
constraint
p3ptype
auf die Knoten der Knotenmenge angewendet.
Weitere Attribute:
nodeset
: Auswahl der Knotenmenge, für die die angegebene
Eigenschaft gelten soll.
XForms definiert folgende Kontrollelemente für Formulare:
input
: freies Eingabefeld. Kann je nach Datentyp des
Instanzknotens unterschiedlich angezeigt werden.
<input ref="order/shipTo/street" class="streetAddress"> <label>Street</label> <hint>Please enter the number and street name</hint> </input> <input ref="order/shipDate"> <label>Ship By</label> <hint>Please specify the ship date for this order.</hint> </input>



secret
: Die Eingabe ist geheim und soll für dritte
Personen verborgen bleiben (z.B. Paßwort)
<secret ref="/login/password"> <label>Password</label> <hint>The password you enter will not be displayed.</hint> </secret>

textarea
: Freie Eingabe in Form von mehrzeiligem Inhalt,
z.B. Inhalt einer E-Mail.
<textarea ref="message/body" class="messageBody"> <label>Message Body</label> <hint>Enter the text of your message here</hint> </textarea>

output
: Zeigt einen Wert aus den Instanzdaten an, bietet
keine Möglichkeit zur Dateneingabe.
I charged you - <output ref="order/totalPrice"/> - and here is why:

upload
: Mit diesem Kontrollelement kann eine Datei des
lokalen Dateisystems auf einen Server geladen
werden. Ebenso kann hiermit die Dateneingabe über
verschiedene Eingabegeräte wie Mikrophone, Stifte
und Digitalkameras ermötlicht werden.
<upload ref="mail/attachment" mediatype="image/*"> <label>Select image:</label> <filename ref="@filename" /> <mediatype ref="@mediatype" /> </upload>

range
: Auswahl von Werten aus einem Wertebereich
<range ref="/stats/balance" start="-2.0" end="2.0" step="0.5"> <label>Balance</label> </range>

trigger
: Ähnlich zu einem Button. Erlaubt Aktionen, die
durch den Benutzer initiiert werden.
<trigger> <label>Click here</label> </trigger>
submit
: Stößt die Übertragung der Instanzdaten an, mit
denen es verknüpft wurde.
<submit submission="timecard"> <label>Submit Timecard</label> </submit>
select
: Ermöglicht Mehrfachauswahl aus einer
Menge vorgegebener Werte.
Steuerung der Darstellung durch
CSS oder Attribut appearance
(zulässige Werte: full, compact
und minimal)
<select ref="my:flavors">
<label>Flavors</label>
<choices>
<item>
<label>Vanilla</label>
<value>v</value>
</item>
<item>
<label>Strawberry</label>
<value>s</value>
</item>
<item>
<label>Chocolate</label>
<value>c</value>
</item>
</choices>
</select>


select1
: Ermöglicht Einfachauswahl aus einer
Menge vorgegebener Werte.
Steuerung der Darstellung durch
CSS oder Attribut appearance
(zulässige Werte: full, compact
und minimal)
<select1 ref="my:flavor">
<label>Flavor</label>
<item>
<label>Vanilla</label>
<value>v</value>
</item>
<item>
<label>Strawberry</label>
<value>s</value>
</item>
<item>
<label>Chocolate</label>
<value>c</value>
</item>
</select1>


XForms verfügt des weiteren über weiterführende Konzepte
wie hierarchische Gruppierungen von Formularelementen,
die Möglichkeit zu konditionaler Anzeige mit
switch - case-Anweisungen sowie
die Möglichkeit zur einfachen Erstellung sich
wiederholender Strukturen (man denke an Preislisten, etc.).
Einsatzmöglichkeiten dieser Elemente sind nachzulesen in
Kapitel 9 der XForms-Spezifikation
. Sie werden in dieser
Vorlesung nicht weiter besprochen.
Auch auf die zahlreichen Events und die damit verbundenen Elemente wird hier nicht weiter eingegangen.