Page tree
Skip to end of metadata
Go to start of metadata

Data templates transform the data model into text or HTML content. Templates are used in many areas in emakin like form controls or mail templates etc.

Templates basically consist of xpath queries within {{ and }} qualifiers.

Assume you have a field named "username" in the data model. Basic template example is:

Hello {{ username }}!

This template generates the following content if username field is set to "Madonna"

Hello Madonna!

Because all xml values are string by default, no formatting is performed while generating the output. If you need to perform formatting for number or date values, you have to convert the data type or use a format function.

Culture Support

Data templates are culture sensitive and all formatting rules are derived from culture being used. Culture information is automatically derived from user preferences or you can explicitly specify it. If no culture is specified, invariant culture is used.

Selecting culture in scripting environment

Formatting with specific culture
var myNode = $Xml.Parse("<Customer><Name>John</Name><BirthDate>2014-01-31T09:00:00+02:00</BirthDate></Customer");
var result = myNode.Format('<p>{{Customer/BirthDate}}</p>', {
  Culture : 'tr-TR'
// result : <p>31.1.2014 09:00:00 +02:00</p>

Data Type Formatting

Text Formatting

All text or string types are exactly transformed without any formatting being performed.

On the other hand, if a string node's value is actually a number, it automatically displays thousand separator dots.
To avoid this, pass 'string' as second argument to format function as below:

Formatting as string
{{ format( 'Employee/RegistryNumber', 'string' ) }}

By default template values are not automatically formatted but Label like controls automatically formats the number like values. You can use format string to disable auto formatting.



Number formatting

Functions like "Sum" or "Count" already return number values, therefore there is no need for number conversions, but in case it is necessary, number() function should be used. Ex: number(MyNumberField) 

All number values are by default formatted with decimal rules.


{{ 12345678912345 }}12345678912345
{{ 123456.78912345 }}123456.78912345
{{ number(123456.78912345678912345) }}123456.789123457
{{ format( number(123456.789) ) }}123456.789
{{ format( number(123456789) ) }}123456789
{{ format( number(123456789), 'n') }}123,456,789.00
{{ format( number(123456789), 'n') }}123.456.789,00tr-TR
{{ format( number(123456789), 'n0') }}123,456,789
{{ format(number(123456789), 'c') }}123.456.789,00 ₺tr-TR

Date formatting

Template system automatically detects the xml date types formatted with "YYYY-MM-DD-THH:MM:SSTZ". Emakin always uses this format in data model for date values.

Date time values in other formats are interpreted as a text value.


Assume data model has a MyDate field with 2014-01-31T09:00:00+02:00 value.

{{ MyDate }}01/31/2014 16:04
{{ format(MyDate,'MMM/yyyy/dd') }}Feb.2018.04
{{ format(MyDate,'MMM/yyyy/dd') }}Şub.2018.04tr-TR
{{format(MyDate, 'MMMM yyyy')}}Nisan 2021tr-TR
{{ format(MyDate) }}31/01/2014 09:00
{{ format(MyDate) }}31.1.2014 09:00tr-TR
{{ format(MyDate,'d') }}31/01/2014
{{ format(MyDate,'D') }}Monday, June 15, 2009en-US
{{ format(MyDate,'o') }}

Scripting example

var myNode = $Xml.Parse("<Customer><Name>John</Name><BirthDate>2014-01-31T09:00:00+02:00</BirthDate></Customer");
var result = myNode.Format('<p>Birth date : {{Customer/BirthDate}}</p>');

// result : <p>Birth date : 01/31/2014 09:00:00 +02:00</p>

Scripting example

A way to remove time from date node:

$Xml.SetValue('Test/testdate', new DateTimeOffset());  // testdate will be saved to an XML as "2015-11-12T15:27:16.2568549+02:00"
$Xml.SetValue('Test/testdate2', $Xml.Format("{{ format(Test/testdate,'yyyy-MM-dd') }}"));  // testdate2 will be saved to an XML as "2015-12-11"

// result : 2015-12-11

Text Masking

Template system also provides an mask function to filter displayed text on screen. This function can used to filter out personal data like name, credit card, identity number etc. More details can be found at mask function reference.

{{ mask(DisplayName) }}					-> J*****D
{{ mask(CreditCard,4,4,'','-') }}		-> 1234-****-****-3456

Conditional Formatting

If conditional rendering is needed, the format below can be used:

if XPathConditon then Template
if XPathConditon then Template else Template


Basic usage
{{ if Customer/Type = 'A' then <div>Important !</div> }}>
Basic usage with else clause
{{ if Customer/Type = 'A' then <div>Important !</div> else <div>{{Customer/Name}}</div> }}>

Repeating Template

If you need to apply template for multiple nodes in a data model, you can use repeating template expression like following syntax:

ItemXPath => Template

This format applies the same template for every matched element by ItemXPath.

   {{ Rows/Row => 
     <tr><td>{{Date}}</td><td>{{Description}}</td></tr> }}
   </table> }}

Generates the following output:

  <tr><td>2015-01-01</td><td>other description</td></tr>

Repeating with attribute

While generating HTML content some tags ( like table tag ) may become corrupted if {{ x => y}} template is used. As an alternative method, format function supports the x-repeat attribute to perform the repeating content. 

     <tr x-repeat="Rows/Row">
   </table> }}

This attribute can be used with any element. For example, it can also be used with "li" tag.

{{ <ul>
     <li x-repeat="Rows/Row">
  </ul> }}

Recursive Repeating Template

If recursive repeating templates are being needed, format below can be used:

ItemXPath =>> Template

For each item specified in ItemXPath, sub template is generated, and also the same template is repeated again for the Template content recursively.

{{ <h1>SAMPLE REPORT</h1>
   {{ Sections/Section =>> 
      <p>{{Body}}</p>  }}


<h2>My Section</h2>
<p>Section content</p>
<h2>Sub Section</h2>
<p>Child section content</p>

Template Variables

All of the custom defined process variables can be used in templates. Additionally, some of the system properties are automatically imported to the template engine. Because of the environment limits, client and server side variables use different variable contexts.

Client Template Variables

In scripts like form script, for the validation rules running on the client side environment, following variables are defined:

Variable NameDescription
$staticUrlStatic resources base address. (ex: )
$applicationUrlApplication base address. (ex: )
$ProcessUnique identifier of the current process. (ex: 71E8B187-C049-4ba1-AE5E-6B0BAD6B7F42 )
$FolderNameName of the current folder in which the process is saved. (ex: Customer Relations )
$CustomVariableDefined custom value.

Server Template Variables

In process scripts like pre work, post work and other scripts that running on the server side environment, following variables are defined:

Variable NameDescription
$ApplicationNameName of an application. (ex: )
$ApplicationUrlBase url of an application (ex: )
$Domain.NameName of a domain (ex: mydomain)
$Domain.UrlUrl of a domain (ex: )
$Domain.LogoUrlLogo image url of a domain (ex: )
$CustomVariableDefined custom value.

Activity Notification Template

Activity notifications, like assigning a work item to a user or reminder notifications, use the same template context. Additionally to the server variables, the following variables can also be used:

Variable NameDescription
$IdId number of a work item
$WorkItemInstance of a WorkItem. You can use . (dot) qualifier to access object properties like "$WorkItem.Instance.Number"
$RecipientsComma qualified recipient names. (ex: Ertan Tike, Emel Sayın)
$UrlUrl of a work item. (ex: )
$AssignedToComma qualified username of user to whom the work item is assigned. (ex: Ertan Tike)

User Registration Template

Additionally to the server variables, user registration invitation defines the following variables:

Variable NameDescription
$TicketDefines the system generated authentication token to be embedded in a mail content.
$DisplayNameDefines the display name of a user.