xsl-list
[Top] [All Lists]

Re: [xsl] First steps with high order functions

2018-06-21 09:34:11
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
 

On 6/19/18, 3:48 AM, "Martin Honnen martin(_dot_)honnen(_at_)gmx(_dot_)de" 
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:

    On 19.06.2018 12:33, Christophe Marchand cmarchand(_at_)oxiane(_dot_)com 
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.
    
    
    
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--

<Prev in Thread] Current Thread [Next in Thread>