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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] First steps with high ord, Christophe Marchand | Thread | Re: [xsl] First steps with high ord, Michael Kay mike@xxx |
[xsl] Function point estimation too, Mukul Gandhi gandhi. | Date | Re: [xsl] First steps with high ord, Michael Kay mike@xxx |
Month |