XSLT Workshop: Basic XPath Functions Crib Sheet

This is a small subset of useful XPath 2.0 functions. For a full reference, check out and

String functions (operations on text)

normalize-space( string )

Trims leading and trailing spaces, and collapses all internal sequences of spaces to a single space.

normalize-space(' thishas lots ofspaces ')

returns:

"this has lots of spaces"

contains( haystack, needle )

Returns true or false, depending on whether the first string contains the second string or not.

contains(//TEI/text/body/div[1]/head[1], 'Chapter')

returns:

true() if the first head in the first div in the body contains "Chapter",

false() if it doesn’t.

Beware: this is case-sensitive.

replace( string, pattern, replacement )

A regular-expression replace function. Returns a copy of string in which all instances of the pattern have been replaced by the replacement.

replace('XPath is cool.', 'cool', 'very cool')

returns:

"XPath is very cool."

starts-with( string1, string2 )

Returns true if string1 starts with string2, and false if not.

starts-with(//TEI/text/body/div[1]/head[1], 'Chapter')

returns:

true() if the first <head> in the first <div> in the <body> begins with "Chapter",

false() if it doesn’t.

Beware: this is case-sensitive.

ends-with( string1, string2 )

Returns true if string1 ends with string2, and false if not.

ends-with(//TEI/text/body/div[1]/head[1], 'ide')

returns:

true() if the first <head> in the first <div> in the <body> ends with "ide",

false() if it doesn’t.

Beware: this is case-sensitive.

Functions for handling sequences

Sequences are rather like arrays in traditional programming. In XPath, they are ubiquitous; most simple XPath expressions will return a sequence. For instance, //div/@type will return a sequence of all the

@type attributes on <div> elements in the document.

distinct-values( sequence… )

This returns a sequence of only the distinct values in a sequence. In other words, it removes duplicates.

distinct-values(//div/@type)

returns:

a list of the unique values of the @type attribute on <div> elements.

empty( sequence… )

Returns true or false depending on whether the sequence is empty.

empty(//div[parent::back])

returns:

true() if there are any <div> elements in the <back>,

false() if not.

Mathematical functions

count( sequence… )

Counts the items fed to it, and returns the total.

count(//div)

avg( sequence… )

Calculates the average from a sequence of numbers.

avg(//person/age/@value)

avg((1,2,3,4,5,6))

NOTE: the second example includes two sets of parentheses. The outer set contains

the argument to the avg() function, and the inner set constructs a sequence which constitutes the argument to the function.

In other words, avg() takes a single argument, which is a sequence; it cannot take a series of separate arguments.

sum( sequence… )

Calculates the sum of a list of numbers.

sum((count(//person), count(//org)))

Note the proliferating parentheses...

min( sequence… )

Returns the smallest from a list of numbers.

min(//person/age/@value)

max( sequence… )

Returns the largest a list of numbers.

max(//person/age/@value)

round( number )

Rounds a number to the nearest integer. .5 is rounded up.

round(1.6)

returns:

2

Boolean functions (dealing with true or false values)

not( expression )

Returns true if the expression is false, and false if it is true.

not(count(//p) gt 5)

returns:

false() if there are 6 or more <div> in the document,

true() if there are 5 or fewer.

true(), false()

true() and false() are functions in XPath. if you're checking the result of a boolean operation, don’t forget the parentheses!

<xsl:if test="(count(//div) lt 5) = false()">

Context functions

position( node )

Returns the position of the node in its sequence.

//div[position() = 1]

returns:

all <div> elements which are the first <div> in their parent element.

last()

Returns the number of the last item in the sequence.

//div[position() = last()]

returns:

all <div> elements which are the last <div> in their parent element.