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