xsl-list
[Top] [All Lists]

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

2019-03-13 04:12:01
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
--~----------------------------------------------------------------
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
--~--
<Prev in Thread] Current Thread [Next in Thread>