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
--~--