[xsl] XSLT code for function fn:fold-right()

Subject: [xsl] XSLT code for function fn:fold-right()
From: "Mukul Gandhi gandhi.mukul@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 13 Mar 2019 09:11:36 -0000
Hi all,
    Please look at following link, for description of XPath 3.1
function fn:fold-right(),

https://www.w3.org/TR/xpath-functions-31/#func-fold-right

Within this function's description, its mentioned
The effect of the function is equivalent to the following implementation
or its equivalent in XSLT:

<xsl:function name="fn:fold-right" as="item()*">
  <xsl:param name="seq" as="item()*"/>
  <xsl:param name="zero" as="item()*"/>
  <xsl:param name="f" as="function(item(), item()*) as item()*"/>
  <xsl:choose>
    <xsl:when test="fn:empty($seq)">
      <xsl:sequence select="$zero"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:sequence select="$f(fn:head($seq), fn:fold-right(fn:tail($seq),
$zero, $f))"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:function>

I've a feeling, that above XSLT logic of this function may be wrong
(particularly the line <xsl:sequence select="$f(fn:head($seq),
fn:fold-right(fn:tail($seq), $zero, $f))"/>. But I'll appreciate if anyone
may point me wrong). I propose the following new XSLT code for this
function,

<xsl:function name="fn:fold-right" as="item()*">
  <xsl:param name="seq" as="item()*"/>
  <xsl:param name="zero" as="item()*"/>
  <xsl:param name="f" as="function(item(), item()*) as item()*"/>
  <xsl:choose>
    <xsl:when test="fn:empty($seq)">
      <xsl:sequence select="$zero"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:sequence select="fn:fold-right(fn:subsequence($seq, 1,
fn:count($seq)-1), $f($seq[fn:last()], $zero), $f)"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:function>

I wanted to raise this issue on this spec's bugzilla. But I wanted to make
sure that I'm right, by asking the question here first.




-- 
Regards,
Mukul Gandhi

Current Thread