Re: [xsl] First steps with high order functions

Subject: Re: [xsl] First steps with high order functions
From: "Martin Honnen martin.honnen@xxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Tue, 19 Jun 2018 10:48:37 -0000
On 19.06.2018 12:33, Christophe Marchand cmarchand@xxxxxxxxxx wrote:

I'm trying to learn high order functions, and I have some difficulties. If someone could help...

I have a normal function :

 B  <xsl:function name="nu:camelCase" as="xs:string?">
 B B B  <xsl:param name="s" as="xs:string?"/>
 B B B  ...
 B  </xsl:function>

I want to apply it on each word of a sentence :

B <xsl:function name="nu:clearUsername" as="xs:string?">
B B B <xsl:param name="name" as="xs:string?"/>
B B B <xsl:choose>
B B B B B <xsl:when test="empty($name)"><xsl:sequence select="()"/></xsl:when>
B B B B B <xsl:when test="contains($name, ' ')">
B B B B B B B <xsl:variable name="temp" select="tokenize($name, ' ')"/>
B B B B B B B <xsl:sequence select="string-join(for-each($temp, nu:camelCase#1), ' ')"/>
B B B B B </xsl:when>
B B B B B <xsl:otherwise>
B B B B B B B <xsl:sequence select="$name"/>
B B B B B </xsl:otherwise>
B B B </xsl:choose>
B </xsl:function>

Does the for-each is correct ?

I think it should work as long as the higher-order function feature is supported.

Is there another syntax to make this work with Saxon-HE ?

Saxon 9.8 HE doesn't support the higher-order function feature so using the "for-each" function with it is not possible. however explains

for-each($SEQ, $F) is equivalent to the expression for $i in $SEQ return $F($i), assuming that ordering mode is ordered.

so you can use
  for $i in $temp return nu:camelCase($i)

to avoid the use of the "for-each" function.

Is there a better way to do this ?

If you learn XPath 3.1 you could also try to get accustomed to be arrow operator and use

$name => tokenize(' ') => for-each(nu:camelCase#1) => string-join(' ')

in the long run that might be more readable then the nesting of function calls.

Current Thread