Motivation
You want to be able to generate large XForms using a REST service for doing performance tests for large forms. The primary item being tested is how long does the form take to become "ready" after the form is loaded.
Method
We will use an XQuery to create XForms files. This XQuery will take a single URL parameter that has a count of the number of elements it will generate. The XForms will have one input field and two select1 fields for each count. Each input control will have its own instance in the model.
Sample of Instance in the model.
<root>
<input1>input 1</input1>
<input2>input 2</input2>
<country-code1>country-code 1</country-code1>
<country-code2>country-code 2</country-code2>
<state-code1>state-code 1</state-code1>
<state-code2>state-code 2</state-code2>
</root>
Instance Generator
xquery version "1.0";
let $count := xs:positiveInteger(request:get-parameter('count', '20'))
return
<root>
{for $counter in (1 to $count)
return
element {concat('input', $counter)} {concat('input ', $counter)}
}
{for $counter in (1 to $count)
return
element {concat('country-code', $counter)} {concat('country-code ', $counter)}
}
{for $counter in (1 to $count)
return
element {concat('state-code', $counter)} {concat('state-code ', $counter)}
}
</root>
Autogeneration of Input Fields
for $counter in (1 to $input-count)
return
(<xf:input ref="input{$counter}">
<xf:label>Input {$counter}:</xf:label>
</xf:input>,
<br/>)
Autogeneration of Select1 Fields
for $counter in (1 to $select1-count)
return
(<xf:select1 ref="country-code{$counter}">
<xf:label>Country {$counter}:</xf:label>
<xf:itemset nodeset="instance('code-tables')/code-table[name='country-code']/items/item">
<xf:label ref="label"/>
<xf:value ref="value"/>
</xf:itemset>
</xf:select1>,
<br/>
)
The code tables are stored in a static XML file called "code-tables.xml". The format is as follows:
<code-tables>
<code-table>
<name>country-code</name>
<items>
<item>
<label>Select a Country...</label>
<value/>
</item>
<item>
<label>Afghanistan</label>
<value>af</value>
</item>
<item>
<label>Albania</label>
<value>al</value>
</item>
...etc....
</items>
</code-table>
</code-tables>
Source Code
xquery version "1.0";
(: Default function and element declarations :)
declare default function namespace "http://www.w3.org/2005/xpath-functions";
declare default element namespace "http://www.w3.org/1999/xhtml";
declare namespace xf="http://www.w3.org/2002/xforms";
declare namespace ev="http://www.w3.org/2001/xml-events";
declare option exist:serialize "method=xhtml media-type=text/xml indent=no process-xsl-pi=no";
let $count := xs:positiveInteger(request:get-parameter('count', '20'))
let $input-count := $count
let $select1-count := $count
let $style :=
<style language="text/css">
<![CDATA[
@namespace xf url("http://www.w3.org/2002/xforms");
body {
font-family: Helvetica, Arial, sans-serif;
}
.block-form xf|label {
width: 10ex;
font-weight: bold;
width: 10ex;
display: inline-block;
text-align: right;
}
]]>
</style>
let $model :=
<xf:model>
<xf:instance id="save-data" src="instance.xq?count={$input-count}"/>
<xf:instance id="code-tables" src="code-tables.xml" xmlns=""/>
</xf:model>
let $content :=
<div class="content">
{
for $counter in (1 to $input-count)
return
(<xf:input ref="input{$counter}">
<xf:label>Input {$counter}:</xf:label>
</xf:input>,
<br/>)
}
{
for $counter in (1 to $select1-count)
return
(<xf:select1 ref="country-code{$counter}">
<xf:label>Country {$counter}:</xf:label>
<xf:itemset nodeset="instance('code-tables')/code-table[name='country-code']/items/item">
<xf:label ref="label"/>
<xf:value ref="value"/>
</xf:itemset>
</xf:select1>,
<br/>
)
}
{
for $counter in (1 to $select1-count)
return
(<xf:select1 ref="state-code{$counter}">
<xf:label>State {$counter}:</xf:label>
<xf:itemset nodeset="instance('code-tables')/code-table[name='us-state-code']/items/item">
<xf:label ref="label"/>
<xf:value ref="value"/>
</xf:itemset>
</xf:select1>,
<br/>
)
}
</div>
let $form :=
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:xf="http://www.w3.org/2002/xforms"
xmlns:ev="http://www.w3.org/2001/xml-events">
<head>
<title>Test Form</title>
{ $style }
{ $model }
</head>
<body>
<div class="container">
<div class="inner">
<h2>Test Form</h2>
{ $content }
</div>
</div>
</body>
</html>
let $xslt-pi := processing-instruction xml-stylesheet {'type="text/xsl" href="/rest/db/xforms/xsltforms-new/xsltforms.xsl"'}
let $debug := processing-instruction xsltforms-options {'debug="yes"'}
return ($xslt-pi, $debug, $form)
Sample Code Tables
Many large forms use large code tables. This example uses two large code tables. One is a list of all the countries in the world and another is a list of all US State Codes.