Abstract

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.

XForms

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.

XForms - Zusammenspiel mit verschiedenen Benutzerschnittstellen

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

XForms - Datenhaltung

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.

XForms - Motivation

Die Entwicklung von XForms als Weiterentwicklung der HTML Formulare versuchte mehrere Defizite der HTML-Formulare zu beheben:

XForms - ein Beispiel (1/5)

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.

XForms - ein Beispiel (2/5)

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.

XForms - ein Beispiel (3/5)

Eigenschaften dieses Formularentwurfs:

XForms - ein Beispiel (4/5)

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

XForms - ein Beispiel (5/5)

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>

XForms - Statusinformation des Instanzdokuments

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:

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>

XForms - komplettes Beispiel mit vorbefüllten Werten

<?xml version="1.0"  encoding="ISO-8859-1"?>
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ev="http://www.w3.org/2001/xml-events"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xforms="http://www.w3.org/2002/xforms"
 xmlns:my="http://commerce.example.com/payment">
 
<head>
<title>XForms-Formular mit vorbefüllten Instanzdaten</title>
  
<xforms:model>
 <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:model>

</head>

<body>

<xforms:select1 ref="@method">
 <xforms:label>Zahlungsmethode:</xforms:label>
  <xforms:item>
   <xforms:label>Vorkasse</xforms:label>
   <xforms:value>vorkasse</xforms:value>
  </xforms:item>
  <xforms:item>
   <xforms:label>Kreditkarte</xforms:label>
   <xforms:value>kreditkarte</xforms:value>
  </xforms:item>  
</xforms:select1>

<xforms:input ref="my:number">
 <xforms:label>Kreditkartennummer:</xforms:label>
</xforms:input>

<xforms:input ref="my:expiry">
 <xforms:label>Gueltig bis:</xforms:label>
</xforms:input>

<xforms:submit submission="submit02">
  <xforms:label>Submit</xforms:label>
</xforms:submit>

  
</body>
</html>

XForms - Werte begrenzen

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:

Model Item Properties erlauben es dem Autor eines Formulars, solche beschreibende Information, mit deren Hilfe die Gültigkeit eines Wertes bestimmt werden kann, anzugeben:

... 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>

XForms - komplettes Beispiel mit Wertebegrenzung und -überprüfung

<?xml version="1.0"  encoding="ISO-8859-1"?>

<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ev="http://www.w3.org/2001/xml-events"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xforms="http://www.w3.org/2002/xforms"
 xmlns:my="http://commerce.example.com/payment">
 
<head>
<title>XForms-Formular mit Werteüberprüfung</title>

<link rel="stylesheet" href="xforms.css" type="text/css"/>
  
<xforms:model>
 <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>
</head>

<body>

<xforms:select1 ref="@method">
 <xforms:label>Zahlungsmethode:</xforms:label>
  <xforms:item>
   <xforms:label>Vorkasse</xforms:label>
   <xforms:value>vorkasse</xforms:value>
  </xforms:item>
  <xforms:item>
   <xforms:label>Kreditkarte</xforms:label>
   <xforms:value>kreditkarte</xforms:value>
  </xforms:item>
</xforms:select1>

<xforms:input ref="my:number">
 <xforms:label>Kreditkartennummer:</xforms:label>
</xforms:input>

<xforms:input ref="my:expiry">
 <xforms:label>Gueltig bis:</xforms:label>
</xforms:input>

<xforms:submit submission="submit02">
 <xforms:label>Submit</xforms:label>
</xforms:submit>

</body>

</html>

XForms - Verwendung mehrerer Formulare in einem Dokument

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" ]

XForms - XHTML-Seite mit mehreren Formularen

<?xml version="1.0"  encoding="ISO-8859-1"?>

<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ev="http://www.w3.org/2001/xml-events"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xforms="http://www.w3.org/2002/xforms"
 xmlns:my="http://commerce.example.com/payment"
 xmlns:hlp="http://commerce.example.com/help">
 
<head>
<title>XForms - XHTML-Seite mit mehreren Formularen</title>

<link rel="stylesheet" href="xforms.css" type="text/css"/>
  
<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>
</head>

<body>

<xforms:select1 ref="@method" model="bezahlung">
 <xforms:label>Zahlungsmethode:</xforms:label>
  <xforms:item>
   <xforms:label>Vorkasse</xforms:label>
   <xforms:value>vorkasse</xforms:value>
  </xforms:item>
  <xforms:item>
   <xforms:label>Kreditkarte</xforms:label>
   <xforms:value>kreditkarte</xforms:value>
  </xforms:item>
</xforms:select1>

<xforms:input ref="my:number" model="bezahlung">
 <xforms:label>Kreditkartennummer:</xforms:label>
</xforms:input>

<xforms:input ref="my:expiry" model="bezahlung">
 <xforms:label>Gueltig bis:</xforms:label>
</xforms:input>

<xforms:submit submission="submit02">
 <xforms:label>Submit</xforms:label>
</xforms:submit>

<br/>

<xforms:select1 ref="hlp:helpful" model="poll">
 <xforms:label>How useful is this page to you?</xforms:label>

 <xforms:item>
  <xforms:label>Not at all helpful</xforms:label>
  <xforms:value>0</xforms:value>
 </xforms:item>
 <xforms:item>
  <xforms:label>Barely helpful</xforms:label>
  <xforms:value>1</xforms:value>
 </xforms:item>
 <xforms:item>
  <xforms:label>Somewhat helpful</xforms:label>
  <xforms:value>2</xforms:value>
 </xforms:item>
 <xforms:item>
  <xforms:label>Very helpful</xforms:label>
  <xforms:value>3</xforms:value>
 </xforms:item>
</xforms:select1>

<xforms:submit submission="pollsubmit" model="poll">
 <xforms:label>Submit</xforms:label>
</xforms:submit>
  
</body>
</html>

XForms - Dokumentstruktur

Allgemeine Bedingungen für XForms-Dokumente

Ein XForms-Formular besteht aus folgenden Strukturelementen:

Das 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:

<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>

Das 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:

<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>

Der Submit-Prozess

Für die Übertragung eines Formular(teil)s darf immer nur genau ein Submit-Prozess aktiv sein. Bei einer Übertragung laufen folgende Schritte ab:

  1. Ein Knoten aus den Instanzdaten, der übertragen werden soll (vgl. , wird ausgewählt. Er und all seine Nachkommen sind für den nachfolgenden Prozess relevant.
  2. Die relevanten Knoten werden auf Gültigkeit überprüft (Schema, evtl vorhandene Constraints) Leere und ungültige Knoten halten den Übertragungsprozess an und werfen ein Fehler-Ereignis.
  3. Die gewählten Instanzdaten werden serialisiert.
  4. Die serialisierten Instanzdaten werden übertragen.
  5. Die Antwort wird entgegengenommen und wie folgt verarbeitet:
    • Bei einer erfolgreichen Übertragung und Erhalt einer Antwort mit einem Dokument- body wird der gesamte Dokumentinhalt durch den erhaltenen body ersetzt. Voraussetzung: das replace -Attribut des submission -Elements hat den Wert all .
    • Bei einer erfolgreichen Übertragung und Erhalt einer Antwort mit einem 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.
    • Bei einer erfolgreichen Übertragung und Erhalt eines body eines nicht auf XML basierenden Medientypen wird nichts ersetzt.
    • Bei einer erfolgreichen Übertragung und Erhalt eines Body wird nichts ersetzt, wenn der Wert des replace -Attributs none beträgt.
    • Bei einer erfolgreichen Übertragung und einem Ergebnis, das keinen Body enthält, wird nichts ersetzt.
    • Andere Attributwerte von replace sind nicht definiert.
    • Bei einer fehlerhaften Übertragung wird nichts im Dokument ersetzt.

Das submission -Element

Das Element enthält beschreibende Informationen darüber, was wie übertragen werden soll.

Erlaubte Attribute:

Kompatibilitätsmatrix URI-Schema, Protokoll und Serialisierung

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

Das 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

auf die Knoten der Knotenmenge angewendet.

Weitere Attribute:

XForms-Kontrollelemente

XForms definiert folgende Kontrollelemente für Formulare:

<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 ref="/login/password">
  <label>Password</label>
  <hint>The password you enter will not be displayed.</hint>
</secret>

<textarea ref="message/body" class="messageBody">
  <label>Message Body</label>
  <hint>Enter the text of your message here</hint>
</textarea>

I charged you -
<output ref="order/totalPrice"/>
- and here is why:

<upload ref="mail/attachment" mediatype="image/*">
  <label>Select image:</label>
  <filename ref="@filename" />
  <mediatype ref="@mediatype" />
</upload>

<range ref="/stats/balance" start="-2.0" end="2.0" step="0.5">
  <label>Balance</label>
</range>

<trigger>
  <label>Click here</label>
</trigger>

<submit submission="timecard">
  <label>Submit Timecard</label>
</submit>

<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 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 - weiterführende Konzepte

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.

XForms - abschließendes Beispiel (mit Flußkontrolle)

<?xml version="1.0"  encoding="ISO-8859-1"?>

<!--$Id: g.1.xhtml,v 1.2 2006/05/03 17:47:38 jkratky Exp $-->
<html xmlns:my="http://commerce.example.com/payment" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title xml:lang="fr">XForms en XHTML</title>

    <xforms:model schema="payschema.xsd">
      <xforms:instance>
        <my:payment as="credit">
          <my:cc />
          <my:exp />

        </my:payment>
      </xforms:instance>
      <xforms:submission action="http://xformstest.org/cgi-bin/echo.sh" method="post" id="s00" />
      <xforms:bind nodeset="my:cc" relevant="../@as='credit'" required="true()" />
      <xforms:bind nodeset="my:exp" relevant="../@as='credit'" required="true()" />
    </xforms:model>
  </head>
  <body>
    <xforms:group xmlns="http://www.w3.org/2002/xforms">

      <xforms:trigger>
        <xforms:label>Français</xforms:label>
        <toggle case="fr" ev:event="DOMActivate" />
      </xforms:trigger>
      <xforms:trigger>
        <xforms:label>English</xforms:label>
        <toggle case="en" ev:event="DOMActivate" />
      </xforms:trigger>

    </xforms:group>
    
    <switch xmlns="http://www.w3.org/2002/xforms">
      <case id="fr">
        <select1 ref="@as">
          <xforms:label xml:lang="fr">Choisissez un mode de paiement</xforms:label>
          <choices>
            <item>
              <xforms:label xml:lang="fr">Comptant</xforms:label>

              <value>cash</value>
              <message level="modeless" ev:event="xforms-select" xml:lang="fr">
                         Ne pas envoyer d'argent comptant par la poste.</message>
            </item>
            <item>
              <xforms:label xml:lang="fr">Carte bancaire</xforms:label>
              <value>credit</value>

            </item>
          </choices>
        </select1>

        <xforms:input ref="my:cc">
          <xforms:label xml:lang="fr">Numéro de carte bancaire</xforms:label>
          <alert xml:lang="fr">Saississez un numéro de carte bancaire en cours
           (séparez par un espace ou un trait d'union chaque groupe de chiffres)</alert>
        </xforms:input>

        <xforms:input ref="my:exp">
          <xforms:label xml:lang="fr">Date d'échéance</xforms:label>
        </xforms:input>

        <submit submission="s00">
          <xforms:label xml:lang="fr">Achetez</xforms:label>
        </submit>
      </case>

      <case id="en">
        <select1 ref="@as">
          <xforms:label xml:lang="en">Select Payment Method</xforms:label>
          <choices>
            <item>
              <xforms:label xml:lang="en">Cash</xforms:label>
              <value>cash</value>

              <message level="modeless" ev:event="xforms-select" xml:lang="en">
              Please do not mail cash.</message>
            </item>
            <item>
              <xforms:label xml:lang="en">Credit</xforms:label>
              <value>credit</value>
            </item>

          </choices>
        </select1>

        <xforms:input ref="my:cc">
          <xforms:label xml:lang="en">Credit Card Number</xforms:label>
          <alert xml:lang="en">Please specify a valid credit card number
            (use spaces or hyphens between digit groups)</alert>
        </xforms:input>

        <xforms:input ref="my:exp">

          <xforms:label xml:lang="en">Expiration Date</xforms:label>
        </xforms:input>

        <submit submission="s00">
          <xforms:label xml:lang="en">Buy</xforms:label>
        </submit>
      </case>
    </switch>

  </body>
</html>