Re: [xsl] First steps with high order functions

Subject: Re: [xsl] First steps with high order functions
From: "Eliot Kimber ekimber@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 21 Jun 2018 14:34:04 -0000
For this:

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

Why not use:

$name => tokenize(' ') ! nu:camelCase(.) => string-join(' ')

?

Or is there a difference between for-each() and ! in this case (I understood !
to be doing for-each).

With XPath 3.1 I find I'm using this idiom a lot for debugging messages:

<xsl:message expand-text="true">Label: {$some-sequence ! stringify-item(.) =>
string-join(', ')}</xsl:message>

Which is so much more convenient than using multiple variables and
xsl:value-of or doing a FOR expression in value-of.

Cheers,

Eliot
--
Eliot Kimber
http://contrext.com


o;?On 6/19/18, 3:48 AM, "Martin Honnen martin.honnen@xxxxxx"
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

    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 :
    >
    >    <xsl:function name="nu:camelCase" as="xs:string?">
    >      <xsl:param name="s" as="xs:string?"/>
    >      ...
    >    </xsl:function>
    >
    >
    > I want to apply it on each word of a sentence :
    >
    >    <xsl:function name="nu:clearUsername" as="xs:string?">
    >      <xsl:param name="name" as="xs:string?"/>
    >      <xsl:choose>
    >        <xsl:when test="empty($name)"><xsl:sequence
select="()"/></xsl:when>
    >        <xsl:when test="contains($name, ' ')">
    >          <xsl:variable name="temp" select="tokenize($name, ' ')"/>
    >          <xsl:sequence select="string-join(for-each($temp,
    > nu:camelCase#1), ' ')"/>
    >        </xsl:when>
    >        <xsl:otherwise>
    >          <xsl:sequence select="$name"/>
    >        </xsl:otherwise>
    >      </xsl:choose>
    >    </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.

    https://www.w3.org/TR/xpath-functions/#func-for-each 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