RE: [xsl] is arity-based "polymorphism" safe to use in xsl 2.0 functions?

Subject: RE: [xsl] is arity-based "polymorphism" safe to use in xsl 2.0 functions?
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 28 Feb 2006 15:53:38 -0000
The spec allows you to write this because the designers thought it was
useful, so go ahead and use it.

But I prefer the version at

http://www.w3.org/TR/xpath-functions/#index-of-node


Michael Kay
http://www.saxonica.com/


> -----Original Message-----
> From: Joern Nettingsmeier [mailto:nettings@xxxxxxxxxxxxxxxxxxxxxx]
> Sent: 28 February 2006 14:57
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] is arity-based "polymorphism" safe to use in
> xsl 2.0 functions?
>
> hi !
>
>
> since the built-in position() function is awkward in some
> cases, i wrote
> a little helper positionInContext($haystack, $needle) that
> will tell you
> the position of $needle within $haystack.
>
> since it needs to keep an internal counter, i have solved it
> like this:
>
> <!-- this is the "internal" function: -->
> <xsl:function name="r2c:positionInContext" as="xs:integer">
>    <xsl:param name="haystack" as="node()*"/>
>    <xsl:param name="needle" as="node()"/>
>    <xsl:param name="position" as="xs:integer"/>
>    <xsl:choose>
>      <!-- found? -->
>      <xsl:when test="$needle is $haystack[1]">
>        <xsl:sequence select="$position"/>
>      </xsl:when>
>      <!-- haystack empty? -->
>      <xsl:when test="not($haystack[2])">
>        <xsl:sequence select="0"/>
>      </xsl:when>
>      <!-- try next node in haystack: -->
>      <xsl:otherwise>
>        <xsl:sequence select="
>          r2c:positionInContext(
>            $haystack[position() gt 1],
>            $needle,
>            $position + 1)"
>        />
>      </xsl:otherwise>
>    </xsl:choose>
> </xsl:function>
>
> <!-- this is the "API" function: -->
> <xsl:function name="r2c:positionInContext" as="xs:integer">
>    <xsl:param name="haystack" as="node()*"/>
>    <xsl:param name="needle" as="node()"/>
>    <xsl:sequence select="r2c:positionInContext($haystack,
> $needle, 1)"/>
> </xsl:function>
>
>
> i know that xsl functions are not polymorphic as to datatypes, but the
> spec says they are wrt number of arguments. i wonder: is this sort of
> programming style ok, or am i stretching the spec? saxon processes it
> just fine.
>
>
> regards,
>
> jvrn
>
> --
> jvrn nettingsmeier
>
> home://germany/45128 essen/lortzingstr. 11/
> http://spunk.dnsalias.org
> phone://+49/201/491621
>
> if you are a free (as in "free speech") software developer
> and you happen to be travelling near my home, drop me a line
> and come round for a free (as in "free beer") beer. :-D

Current Thread