xsl-list
[Top] [All Lists]

[xsl] How to convert a recursive function to a loop, using XSLT 2.0?

2019-05-10 06:20:55
Hello XSLT experts!

My input file consists of a sequence (sourceSeq) of <Byte> elements 
representing a sequence of null-terminated strings. I want to create a function 
that returns a sequence of <String> elements. For example, with this sourceSeq:

<Byte>48</Byte>
<Byte>69</Byte>
<Byte>00</Byte>
<Byte>4A</Byte>
<Byte>69</Byte>
<Byte>6C</Byte>
<Byte>6C</Byte>
<Byte>00</Byte>

the function should return:

<String>Hi</String>
<String>Jill</String>

The strings are of variable length.

I do not know how many null-terminated strings are in sourceSeq. However, I do 
know the total number (total-size) of <Byte> elements within sourceSeq 
containing the null-terminated strings.

Below is a recursive way to implement the function. Unfortunately, total-size 
can be quite large, which means the function recurses many times, resulting in 
a "Too many nested function calls" error. Is there an iterative way to 
implement the function?  /Roger

<xsl:function name="f:make-string-table-entries" as="element(String)*">
    <xsl:param name="total-size" as="xs:integer" />
    <xsl:param name="current-size" as="xs:integer" />
    <xsl:param name="current-position" as="xs:integer" />
    <xsl:param name="sourceSeq" as="element(Byte)*" />
    
    <xsl:choose>
        <xsl:when test="$current-size ge $total-size" />
        <xsl:otherwise>
            <xsl:variable name="string" 
select="f:make-element-from-null-terminated-string('String', $current-position, 
$sourceSeq)" as="element(String)"/>
            <xsl:sequence select="$string" />
            <xsl:variable name="length" select="string-length($string/text()) + 
1"/>  <!-- add 1 for the null byte -->
            <xsl:sequence select="f:make-string-table-entries($total-size, 
xs:integer($current-size+$length), xs:integer($current-position+$length), 
$sourceSeq)" />
        </xsl:otherwise>
    </xsl:choose>
    
</xsl:function>
--~----------------------------------------------------------------
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>