Utility functions¶
Utility functions help you perform common operations on your data within your data mappings. You make them available by including the xmlns:su="com.spinque.tools.importStream.Utils"
namespace:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:spinque="com.spinque.tools.importStream.EmitterWrapper"
xmlns:su="com.spinque.tools.importStream.Utils"
extension-element-prefixes="spinque">
<xsl:template match="table/row"/>
</xsl:stylesheet>
Below is a description of the most commonly used utility functions:
Identifiers¶
su:uri¶
Generates a URI based on a base
and one to four paths
provided.
If you want to create another type of identifier, use function su:e.
Input parameters¶
parameter | type | description |
---|---|---|
base | String | The base of the URI to be created |
path1 | String | A path in the URI that comes after `base` |
path2 | String | A path in the URI that comes after `path1` |
path3 | String | A path in the URI that comes after `path2` |
path4 | String | A path in the URI that comes after `path3` |
Returns¶
A string containing the full URI.
Examples¶
<spinque:debug message="{su:uri('https://imdb.com', 'data')}" />
<spinque:debug message="{su:uri('https://imdb.com', 'data', 'movie')}" />
<spinque:debug message="{su:uri('https://imdb.com', 'data', 'movie', 'tt0068646')}" />
<spinque:debug message="{su:uri('https://imdb.com', 'data', 'movie', 'tt0068646', 'otherIdentifierPath')}" />
generates the debug output
https://imdb.com/data
https://imdb.com/data/movie
https://imdb.com/data/movie/tt0068646
https://imdb.com/data/movie/tt0068646/otherIdentifierPath
Standard string modifications¶
su:capitalize¶
Reformats a string value
with specified capitalization style
.
Input parameters¶
parameter | type | description |
---|---|---|
value | String | The string to format |
style | String | The capitalization style (e.g. `sentencecase`) |
Returns¶
A string with content
reformatted according to the capitalization style
Examples¶
<spinque:debug message="{su:capitalize('this becomes sentencecase, 'sentencecase')}"/>
<spinque:debug message="{su:capitalize('this becomes titlecase', 'titlecase')}"/>
<spinque:debug message="{su:capitalize('This becomes allcaps', 'allcaps')}"/>
<spinque:debug message="{su:capitalize('This becomes ALLLOWERCASE', 'alllowercase')}"/>
<spinque:debug message="{su:capitalize('this becomes camelcase', 'camelcase')}"/>
<spinque:debug message="{su:capitalize('This becomes snakecase', 'snakecase')}"/>
<spinque:debug message="{su:capitalize('This becomes kebabcase', 'kebabcase')}"/>
generates the debug output
This becomes sentencecase
This Becomes Titlecase
THIS BECOMES ALLCAPS
this becomes allowercase
ThisBecomesCamelcase
this_becomes_snakecase
this-becomes-kebabcase
su:lowercase¶
Turns all alphabetic characters in a string content
lowercase
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string in which all alphabetic characters will become lowercase |
Returns¶
A string where all alphabetic characters have become lowercase
Examples¶
<spinque:debug message="{su:lowercase('ThiS wilL bEcome lowercase!')}"/>
generates the debug output
this will become lowercase!
su:normalizeWhiteSpace¶
Replaces all occurrences of one or more consecutive whitespace characters by a single space. It also trims whitespace from the start and end of the string.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string in which normalization will happen |
Returns¶
The string with whitespaces normalized
Examples¶
<spinque:debug message="{su:normalizeWhiteSpace(' Normalize the whitespaces! ')}"/>
generates the debug output
Normalize the whitespaces!
su:replace¶
Replaces occurrences of needle
in the content
string with the replacement string repl
.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The original string where replacements may occur |
needle | String | The substring to be replaced |
repl | String | The string to replace each match with |
Returns¶
A new string with all instances of needle
replaced by repl
Examples¶
<spinque:debug message="{su:replace('hello world','world', 'there')}"/>
<spinque:debug message="{su:replace('abc','d', 'D')}"/>
generates the debug output
hello there
abc
su:replaceAll¶
Replaces all matches of the regular expression regex
in the content
string with the replacement string repl
.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The original string where replacements may occur |
regex | String | The regular expression to be replaced |
repl | String | The string to replace each match with |
Returns¶
A new string with all occurrences of regex
replaced by repl
Examples¶
<spinque:debug message="{su:replaceAll('a1b2c3','\d', '*')}"/>
<spinque:debug message="{su:replaceAll('a1b2c34d567','\d{2}', '*')}"/>
generates the debug output
a*b*c*
a1b2c*d*7
su:split¶
Splits a string content
into tokens according to a separator regular expression.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string to be split |
separatorRegex | String | The separator at which `content` will be split, provided as a regular expression. If left empty (`''`), `content` will be split into separate characters. |
limit | String | Optional. The maximum number of splits (maximum is 8192) |
Returns¶
A string array of tokens
Examples¶
<xsl:variable name="splits" select="su:split('This string needs to be split!', '\s', 3)"/>
<xsl:template match="/">
<spinque:debug message="{splits[1]}"/>
<spinque:debug message="{splits[2]}"/>
<spinque:debug message="{splits[3]}"/>
</xsl:template>
generates the debug output
This
string
needs to be split!
and
<xsl:variable name="splits" select="su:split('This string needs to be split!', '', 4)"/>
<xsl:template match="/">
<spinque:debug message="{splits[1]}"/>
<spinque:debug message="{splits[2]}"/>
<spinque:debug message="{splits[3]}"/>
<spinque:debug message="{splits[4]}"/>
</xsl:template>
generates the debug output
T
h
i
s string needs to be split!
su:trim¶
Removes all leading and trailing whitespace characters (such as spaces, tabs, and newlines) from the input string content
.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The input string from which whitespaces will be removed |
Returns¶
A new string with all leading and trailing whitespace removed from content
.
Example¶
<spinque:debug message="{su:trim(' hello world ')}"/>
generates the debug output
hello world
su:uppercase¶
Turns all alphabetic characters in a string content
uppercase
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string in which all alphabetic characters will become uppercase |
Returns¶
A string where all alphabetic characters have become uppercase
Examples¶
<spinque:debug message="{su:uppercase('This will become uppercase!')}"/>
generates the debug output
THIS WILL BECOME UPPERCASE!
Extracting substrings¶
su:substringAfter¶
Extracts everything of the string content
after the first occurrence of the substring needle
.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string to search in |
needle | String | The substring to find in `content` |
Returns¶
A string that contains the part of content
after the first occurrence of needle
. If content
does not contain needle
, return value is empty.
Examples¶
<spinque:debug message="{su:substringAfter('hello world', 'world')}"/>
<spinque:debug message="{su:substringAfter('hello world', 'hello')}"/>
<spinque:debug message="{su:substringAfter('hello world', 'there')}"/>
<spinque:debug message="{su:substringAfter('hello world, what a beautiful world', 'world')}"/>
generates the debug output
world
, what a beautiful world
(where the first and the third return values are empty)
su:substringAfterLast¶
Extracts everything of the string content
after the last occurrence of the substring needle
.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string to search in |
needle | String | The substring to find in `content` |
Returns¶
A string that contains the part of content
after the last occurrence of needle
. If content
does not contain needle
, return value is empty.
Examples¶
<spinque:debug message="{su:substringAfterLast('hello world', 'world')}"/>
<spinque:debug message="{su:substringAfterLast('hello world', 'hello')}"/>
<spinque:debug message="{su:substringAfterLast('hello world', 'there')}"/>
<spinque:debug message="{su:substringAfterLast('hello world, what a beautiful world', 'world')}"/>
generates the debug output
world
(where all return values but the second are empty)
su:substringBefore¶
Extracts everything of the string content
before the first occurrence of the substring needle
.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string to search in |
needle | String | The substring to find in `content` |
Returns¶
A string that contains the part of content
before the first occurrence of needle
. If content
does not contain needle
, return value is empty.
Examples¶
<spinque:debug message="{su:substringBefore('hello world', 'world')}"/>
<spinque:debug message="{su:substringBefore('hello world', 'hello')}"/>
<spinque:debug message="{su:substringBefore('hello world', 'there')}"/>
<spinque:debug message="{su:substringBefore('hello world, what a beautiful world', 'world')}"/>
generates the debug output
hello
hello
(where the second and third return values are empty)
su:substringBeforeLast¶
Extracts everything of the string content
before the last occurrence of the substring needle
.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string to search in |
needle | String | The substring to find in `content` |
Returns¶
A string that contains the part of content
before the last occurrence of needle
. If content
does not contain needle
, return value is empty.
Examples¶
<spinque:debug message="{su:substringBeforeLast('hello world', 'world')}"/>
<spinque:debug message="{su:substringBeforeLast('hello world', 'hello')}"/>
<spinque:debug message="{su:substringBeforeLast('hello world', 'there')}"/>
<spinque:debug message="{su:substringBeforeLast('hello world, what a beautiful world', 'world')}"/>
generates the debug output
hello
hello world, what a beautiful
(where the second and third return values are empty)
Matching strings¶
su:endsWith¶
Checks whether a String content
ends with the specified suffix
.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string to be searched in. |
suffix | String | The string to search for at the end of `content`. |
Returns¶
true
if content
ends with suffix
; otherwise, false
.
Examples¶
<spinque:debug message="{su:endsWith('abc','c')}"/>
<spinque:debug message="{su:endsWith('abc','d')}"/>
generates the debug output
true
false
su:findMatches¶
Find all matches of the given expression, and return the content of those matches.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string to search in |
regex | String | A regular expression |
Returns¶
An array of strings containing the individual matches of regex
in content
.
Examples¶
<xsl:variable name="matches" select="su:findMatches('hello world', '[a-z]+')"/>
<xsl:template match="/">
<spinque:debug message="{$matches[1]}"/>
<spinque:debug message="{$matches[2]}"/>
</xsl:template>
generates the debug output
hello
world
su:lastIndexOf¶
Determines the last position of where the needle
occurs in the content
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string to search in |
needle | String | The string to find in `content` |
Returns¶
An integer: If needle
is found inside content
, returns the index of the last occurrence (starting with 0); -1
otherwise
Examples¶
<spinque:debug message="{su:lastIndexOf('123456789', '2')}"/>
<spinque:debug message="{su:lastIndexOf('12342567222289', '2')}"/>
<spinque:debug message="{su:lastIndexOf('123456789', ' ')}"/>
generates the debug output
1
11
-1
su:matches¶
Tests whether the input string content
matches the provided regular expression regex
.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string to be tested |
regex | String | The regular expression pattern used to match against `content` |
Returns¶
true
if content
matches the regular expression; otherwise, false
Examples¶
<spinque:debug message="{su:matches('abc','ab?c')}"/>
<spinque:debug message="{su:matches('ac','ab?c')}"/>
<spinque:debug message="{su:matches('ac','abc')}"/>
generates the debug output
true
true
false
su:startsWith¶
Checks whether a String content
starts with the specified prefix
.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string to be searched in. |
prefix | String | The string to search for at the start of `content`. |
Returns¶
true
if content
starts with prefix
; otherwise, false
.
Examples¶
<spinque:debug message="{su:startsWith('abc','a')}"/>
<spinque:debug message="{su:startsWith('bc','a')}"/>
generates the debug output
true
false
Type conversions (string to number)¶
su:normalizeInteger¶
Converts a string content
containing an integer to a number. Depending on the locale
chosen, removes thousands separators.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string containing an integer |
locale | String | An abbreviation indicating the locale; used to remove thousands separators. If `NL`: The dot character (`.`) will be regarded as thousands separator. Otherwise: The comma character (`,`) will be regarded as thousands separator. |
Returns¶
A number with the value of content
Examples¶
<spinque:debug message="{su:normalizeInteger('1.234', 'NL')}"/>
<spinque:debug message="{su:normalizeInteger('1234', 'NL')}"/>
<spinque:debug message="{su:normalizeInteger('1,234', 'EN')}"/>
generates the debug output
1234
1234
1234
su:normalizeDouble¶
Converts a string content
containing a double (i.e. a number with decimal values) to a number. Considers decimal markers depending on the locale
chosen.
Input parameters¶
parameter | type | description |
---|---|---|
content | String | The string containing an integer |
locale | String | An abbreviation indicating the locale; used to remove decimal markers. If `NL`: The comma character (`,`) will be regarded as decimal marker. Otherwise: The dot character (`.`) will be regarded as thousands separator. |
Returns¶
A number with the value of content
Examples¶
<spinque:debug message="{su:normalizeDouble('1,2345', 'NL')}"/>
<spinque:debug message="{su:normalizeDouble('12345', 'NL')}"/>
<spinque:debug message="{su:normalizeDouble('1.2345', 'EN')}"/>
generates the debug output
1.2345
12345
1.2345
su:periodToMillis¶
Parse a notation of a period into milliseconds.
Input parameters¶
parameter | type | description |
---|---|---|
period | String | The duration expressed in ISO-notation. Important note: Currently only supports components that don't vary in length (for instance, months have different lengths). Supported components are: `W`: weeks; `D`: days; `T`: precedes the time components (hours, minutes, seconds); `H`: hours; `M`: minutes; `s`: seconds |
Returns¶
A number with the number of milliseconds the period represents
Examples¶
<spinque:debug message="{su:periodToMillis('P1D')}"/>
<spinque:debug message="{su:periodToMillis('P1W1DT3H2M3S')}"/>
generates the debug output
84600000
702123000
Dates¶
su:parseDate¶
Parses a date
in a provided original format
and converts it into a string with the format yyyy-MM-dd
.
Input parameters¶
parameter | type | description |
---|---|---|
date | String | The date to be parsed |
languageTag | String | The language the date expression is provided in (e.g. `en-US`) |
format | String | Specification of the original format of `date` (e.g., `dd/MM/yyyy`) |
format2 | String | Optional. Alternative specification of the original format of `date`. Only checked if the date does not match `format`. |
format3 | String | Optional. Alternative specification of the original format of `date`. Only checked if the date does not match `format2`. |
format4 | String | Optional. Alternative specification of the original format of `date`. Only checked if the date does not match `format3`. |
format5 | String | Optional. Alternative specification of the original format of `date`. Only checked if the date does not match `format4`. |
format6 | String | Optional. Alternative specification of the original format of `date`. Only checked if the date does not match `format5`. |
format7 | String | Optional. Alternative specification of the original format of `date`. Only checked if the date does not match `format6`. |
format8 | String | Optional. Alternative specification of the original format of `date`. Only checked if the date does not match `format7`. |
format9 | String | Optional. Alternative specification of the original format of `date`. Only checked if the date does not match `format8`. |
format10 | String | Optional. Alternative specification of the original format of `date`. Only checked if the date does not match `format9`. |
Returns¶
A string with the reformatted date
if date
matches the original format
(or any alternative specification) and languageTag
.
Examples¶
<spinque:debug message="{su:parseDate('01/02/2024', 'en-US','dd/MM/yyyy')}" />
<spinque:debug message="{su:parseDate('01.02.2024', 'en-US','dd.MM.yyyy')}" />
<spinque:debug message="{su:parseDate('20240201', 'nl','yyyyMMdd')}" />
<spinque:debug message="{su:parseDate('Thu, Feb 4, 2024', 'en-US','EEE, MMM d, yyyy')}" />
generates the debug output
2024-02-01
2024-02-01
2024-02-01
2024-02-01