Examples of formulas
Last updated
Last updated
For live examples of Formulas, see Orbeon Demo: Examples of Formulas.
[SINCE Orbeon Forms 4.5]
Scenario: compute the sum of values in multiple repeat repetitions. Say you have:
a repeated grid
a decimal field called price
on each row
an integer field called quantity
on each row
a decimal text output field called row-total
on each row
a decimal text output field called total
below the grid
You want to compute the row totals and athe general total.
Calculated value expression for row-total
:
Calculated value expression for total
:
Explanation:
when accessing control values with variables, the "closest" variables are found
this means that the row-total
control calculation applies to the closest price
and quantity
controls, that is, those on the same row, and each row gets its own total
the total
calculation is outside the repeat, and when it refers to $row-total
, all row-total
values are returned
sum()
is a standard XPath function to compute the sum of a sequence of items
the predicate [string() castable as xs:decimal]
excludes values that are blank or not a decimal number
see this blog post for the use of string()
within the predicate
sum()
supports a second argument which is the value to return in case no value satisfies the predicate (this makes sure that we return a decimal value, as we are using a literal decimal 0.0)
See also:
Scenario: Make the current integer number field valid only if its value is between two values, say 12 and 17 included.
Expression:
Explanation:
.
refers to the current value of the control
>=
or ge
means "greater than or equals to"
<=
or le
means "less than or equals to"
and
is the logical "and" operator
If you want to refer to a specific control by name, you can use:
Scenario: Make the current field valid only if its length is between two values, say 2 and 140.
Expression:
Explanation:
.
refers to the current value of the control
The standard string-length()
function returns the length of its argument
>=
or ge
means "greater than or equals to"
<=
or le
means "less than or equals to"
and
is the logical "and" operator
If you want to refer to a specific control by name, you can use:
[SINCE Orbeon Forms 4.10]
The same can be expressed, for the current control, as:
Scenario: check that a given number value is either blank or has exactly 5 digits.
Explanation:
the standard matches()
function applies the regular expression passed as second argument to the first argument, and returns true if it does match
the built-in xxf:is-blank()
function returns true()
if the value passed is blank
since the data is a number, we use the string(.)
function to convert the value to a string before passing it to functions
Scenario: Make a control read-only if the value of the first-name
control is blank:
Expression:
Explanation:
$first-name
returns the value of the control with name "first-name"
the built-in xxf:is-blank()
function returns true()
if the value passed is blank
Scenario: As a form author, you can set a static initial value for a control simply by setting that value at design time. For example:
Enter a value in an input field
Select an item in a dropdown list
But not all initial values can be static. For example, you might want a date selection control to contain the current date until the user changes it. In this case, you can use an "Initial Value" expression.
Initial Value expression:
Explanation:
current-date()
is a standard XPath function returning the current date.
Scenario: compute the sum of two numbers entered by the user in two fields, "quantity1" and "quantity2".
Calculated Value expression:
Explanation:
if (...) then ... else ...
evaluates a condition and then returns one of two alternatives
the condition quantity1 castable as xs:integer
checks that the value from the field "quantity1" is an integer
quantity1 + $quantity2
simply adds the two values
the value ''
represents an empty string This can be specified for example on a Text Output control.
NOTE: If the value of a control is calculated, by default it is also marked as read-only. If you want a calculated control to be still editable by the user, set its Read-Only property explicitly to false()
.
Given this form and a control called name
within a repeat:
$name[2]
: return the value of the control in the second iteration
string-join($name, ', ')
: join all values with commas
count($name)
: return the number of values
NOTE: This works when the expression is outside repeat repetitions. For expressions within the same repeat, $name
returns the closest control.
See also Model bind variables and this StackOverflow question.
See Form Fields.
The Form Runner detail page can have the following modes:
new
edit
view
pdf
email
test
(when you are testing a form within Form Builder)
You can use the fr:mode()
XPath function exposed by Form Runner to all XPath expressions.
A special XPath variable named $fr-mode
is exposed by Form Runner to all XPath expressions.
You can test the mode as follows, for example in a Visibility expression:
It can be useful to access HTTP headers to set default values upon form initialization, for example when single sign-on systems use HTTP headers as a way of communicating information to an application.
XPath expressions have access to a special function, xxf:request-header()
, which allows retrieving a header by name. Example of setting the default value of a field using an initial value:
NOTE: With Orbeon Forms 3.8 and 3.9, headers cannot be reliably accessed after the form is initialized, so this function should be used for setting initial values on controls only. See the next scenario for a workaround.
Scenario: field my-attachment
must be a PDF file.
Constraint expression:
Explanation:
Form Runner stores information about a file into XML attributes:
@filename
accesses the file name as sent by the user's browser
@mediatype
accesses the file type as sent by the user's browser
@size
accesses the file size
$my-attachment/@filename
returns the file name associated with attachment "my-attachment"
The lower-case()
function converts that name to a lower case value
The ends-with()
function checks whether its first argument ends with the second argument
Similarly, you can test the file type:
NOTE: Because the file name and file type are sent by the client's browser, they cannot be trusted. This should only be considered a first level of data validation, and further validation based on the content must be performed at a later time if needed. See also issue #1838.
Scenario: We want to set the value of a field from a URL parameter, but only if that parameter exists. If it doesn't, we want to leave the value of the field as it is.
Explanation:
If the parameter exists
xxf:get-request-parameter()
returns a single string
so you get a sequence containing that string following by the current value of the field
we take the first value of the sequence, so the value of the parameter is used
if the parameter doesn't exist
xxf:get-request-parameter()
returns an empty XPath sequence
so you get a sequence containing only the current value of the field
we take the first value of that sequence, so we get the current value of the control
The following formula formats the current date/time to an ISO date/time in a specific named timezone:
NOTE: See issue #4981 for availability of a fix that impacts this example.