xsl-list
[Top] [All Lists]

is arity-based "polymorphism" safe to use in xsl 2.0 functions?

2006-02-28 07:57:26
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,

jörn

--
jörn 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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



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