Skip to main content
Version: 4.0 (2026 H1)

Mapping

This standardized format allows mappings to be configured consistently throughout primedocs — for example to map source fields of a data source to primedocs target fields.

Examples:

<Mapping>
<Map Source="fname" Target="Forname" />
<Map SourceValue="Hanna" Target="Forname" />
<Map SourceValue="Muster" Target="LastName" When="source('test') === 'someValue'" />
<Map SourceExpression="25*78" Target="Calculator" When="target('LastName') === 'Muster'" />

<Map>
<Map.Source>fname</Map.Source>
<Map.Target>Vorname</Map.Target>
</Map>
<Map>
<Map.SourceValue>Hanna</Map.SourceValue>
<Map.Target>Firstname</Map.Target>
</Map>
<Map>
<Map.SourceValue>Muster</Map.SourceValue>
<Map.Target>LastName</Map.Target>
<Map.When><![CDATA[source('test') < 12]]></Map.When>
</Map>
<If Condition="source('test') === 'someValue'">
<Map>
<Map.SourceExpression>25*78</Map.SourceExpression>
<Map.Target>Calculator</Map.Target>
</Map>
</If>
</Mapping>

JavaScript​

Within a mapping you can use simple declarative statements or implement more complex logic via JavaScript.

Properties as elements or attributes​

All of the following element properties can be set either as an attribute or as an element.

As an attribute:

<ElementName AttributeName="attribute content">
further element content
</ElementName>

As an element:

<ElementName>
<ElementName.AttributeName>attribute content</ElementName.AttributeName>
further element content
</ElementName>

For the If element with the Condition property, the following two configurations have exactly the same meaning:

<If Condition="source('LastName') === 'Muster'">
...
</If>
<If>
<If.Condition>source('LastName') === 'Muster'</If.Condition>
...
</If>

Map element​

A Map element represents a single mapping operation. Exactly one source property and the Target must be set.

PropertyDescription
SourceBy default: the name that identifies the value, e.g. the database column name in the Generic SQL provider. For XML data sources, see XML. If the value is not found, null is passed on.
SourceValueA constant value to be used.
SourceExpressionA primedocs JavaScript expression that is evaluated.
TargetThe target property for the mapping.
WhenA primedocs JavaScript expression that executes the mapping conditionally. If it evaluates to true, the mapping is executed.

If element​

The If element allows conditions to be defined for entire blocks of mappings. If blocks can be combined and nested arbitrarily.

PropertyDescription
ConditionJavaScript condition — the result is checked for a truthy value.

Conditions & expressions​

Escaping​

In XML, certain characters such as & or < have a special meaning and cannot be used directly. Escape them, e.g. & as &amp;:

<Mapping>
<Map Source="Value" Target="Target" When="source('val1') === 'test1' &amp;&amp; source('val2') === 'test2'" />
</Mapping>

Alternatively, the same can be achieved using CDATA and the element notation:

<Mapping>
<Map Source="Value" Target="Target">
<Map.When><![CDATA[source('val1') === 'test1' && source('val2') === 'test2']]></Map.When>
</Map>
</Mapping>

Source​

Using the source API object, the source values can be accessed from JavaScript — analogous to the Source property of the Map element. If the value is not available, undefined is returned. The following example takes the last available phone number:

<Mapping>
<Map Source="Arbeitsplatz" Target="Phone" When="source('Arbeitsplatz') != null" />
<Map Source="Mobile" Target="Phone" When="source('Mobile') != null" />
</Mapping>

For compatibility reasons, the source API object can also be accessed via oo or OO.

Target​

Using the target API object, previously mapped values can be accessed from JavaScript. If the value is not available, undefined is returned. The following example assembles an address:

<Mapping>
<Map SourceExpression="source('street')+' ' +source('hausnr')" Target="Street" />
<Map SourceExpression="target('street') + '\r\n' + source('PLZUndOrt')" Target="CompleteAddress" />
</Mapping>

Result:

Source
----------
street Teststrasse
hausnr 42
PLZUndOrt 4242 Testhausen

Result
----------
Street Teststrasse 42
CompleteAddress Teststrasse 42
4242 Testhausen

Main function​

To run more complex JavaScript methods, the function main() can be defined, which is then called. The following example adapts a Swiss phone number to the international format:

<Mapping>
<Map Target="Phone">
<Map.SourceExpression>
function main()
{
// normalises all phone numbers
// 0715110500 => +41 71 511 05 00
// +41 71 511 05 00 => +41 71 511 05 00
var input = source('phonenumber').replace(/ /g, '');
var patt = /((\+|00)41|0)([0-9]+)/;
var matchArray = patt.exec(input);
var number = matchArray[3];
return "+41 " + number.substring(0,2) + " " + number.substring(2,5)
+ " " + number.substring(5,7)+ " " + number.substring(7,9);
}
</Map.SourceExpression>
</Map>
</Mapping>

StartsWith function​

Often you want to check whether a text begins with certain characters — e.g. whether the text in ZIP_Code (postal code) starts with CH-.

The JavaScript startsWith function does not yet exist in ES5. The expression source('ZIP_Code').startsWith('CH-') can therefore not be evaluated. Working alternative:

source('ZIP_Code').indexOf('CH-') === 0

Notes​

  • In JavaScript, conditions are checked for a truthy value. Non-boolean values are also evaluated: positive numbers or non-empty strings count as true.
  • JavaScript can distinguish between null and undefined. If a value is not available, the Source property of the Map element returns null, while the source API object returns undefined.
  • Comparisons: the == operator also compares different data types, e.g. '55' == 55 evaluates to true. Since undefined == null is also true, source('Name') == null can be used to check for both empty (null) and unavailable (undefined) values.

Mapping data source​

Depending on the data source, the way the data is accessed differs — i.e. how the source value is passed in the Source attribute or in the source() function.

Default: key/value​

Simple keys are specified — a direct mapping exists. Examples:

  • column name for the SQL Address provider
  • column name or column number for the CSV/XLSX Address provider

XML​

For XML sources, an XPath (1.0) can be specified to identify the value:

XPath resultReturned value
AttributeValue of the attribute
ElementContent/value of the element
TextThe text
CDataResults wrapped in CData are returned without the CData tag.

Example — XML source file

<Kontakt>
<Company>PrimeSoft AG</Company>
<Adresse>
<PLZ>8360</PLZ>
<City>Eschlikon</City>
<Street>Bahnhofstrasse 4</Street>
</Adresse>
<Contact>
<Option Type="Phone">+41 71 511 0 500</Option>
<Option Type="Mail">info@primesoft-group.com</Option>
</Contact>
</Kontakt>

Mapping

<Mapping Type="XML">
<Map Source="//PLZ" Target="Postleitzahl" />
<Map Source="/Kontakt/Adresse/City" Target="Stadt" />
<Map Source="//Street" Target="Strasse" />
<Map Target="KompletteAdresse">
<Map.SourceExpression>
source('//Company') + '\r\n' + source('//Street') + '\r\n' + source('//PLZ') + ' ' + source('//City')
</Map.SourceExpression>
</Map>
<Map Source="//Contact/Option[@Type='Phone']" Target="Telefon" />
</Mapping>

JSON​

For JSON sources, a JSONPath can be specified to identify the value:

Example — JSON source file

{
"Kontakt": {
"Company": "PrimeSoft AG",
"Adresse": {
"PLZ": "8360",
"City": "Eschlikon",
"Street": "Bahnhofstrasse 4"
}
}
}

Mapping

<Mapping Type="JSON">
<Map Source="$.Kontakt.Adresse.PLZ" Target="Postleitzahl" />
<Map Source="$.Kontakt.Adresse.City" Target="Stadt" />
<Map Source="$.Kontakt.Adresse.Street" Target="Strasse" />
</Mapping>

Examples​

If-Else​

The current version has no Else section. For larger sections, the condition can be negated:

<Mapping>
<If Condition="source('Typ') === 'Geschäftlich'">
<!-- Map elements for the company address -->
</If>
<If Condition="!(source('Typ') === 'Geschäftlich')">
<!-- Map elements for the else case -->
</If>
</Mapping>

To select a value from several available elements, multiple Map elements with the same Target can be used:

<Mapping>
<Map Source="Privat" Target="Phone" />
<Map Source="Büro" Target="Phone" When="target('Phone') != null" />
<Map Source="Mobile" Target="Phone" When="target('Phone') != null" />
</Mapping>
note

Note the order: the Map elements are evaluated in sequence, i.e. the last available number is used.