xsl-list
[Top] [All Lists]

Re: [xsl] A function that tokenizes a string, wrapping each token in start-tag , end-tag pairs?

2016-04-21 07:29:42
On 21.04.2016 14:20, Costello, Roger L. costello(_at_)mitre(_dot_)org wrote:

I've implemented the function, see below. It works fine, but I want to know if 
it can be improved. Is there a way to write the function more idiomatic? 
Shorter? Generalized to be more widely useful?  /Roger


     <!--
        Create an element for each non-empty token in $line.
        $line is tokenized using the sequence of symbols denoted
        by $line-delimiter.
        For the token at position i, name the element using the
        string in headers[$i]
    -->
     <xsl:function name="f:line" as="element()*">
        <xsl:param name="line" as="xs:string" />
        <xsl:param name="line-delimiter" as="xs:integer+" />
                <xsl:param name="headers" as="xs:string+" />

        <xsl:variable name="tokens" select="tokenize($line, 
codepoints-to-string($line-delimiter))" as="xs:string*" />
                <xsl:variable name="len" select="count($tokens)" as="xs:integer" 
/>
                <xsl:for-each select="1 to $len">
                        <xsl:variable name="index" select="xs:integer(.)" 
as="xs:integer" />
                        <xsl:variable name="value" select="$tokens[position() eq $index]" 
as="xs:string" />
                        <xsl:choose>
                                <xsl:when test="$value eq ''"/>
                                <xsl:otherwise>
                                        <xsl:element name="{$headers[position() eq 
$index]}">
                                                        <xsl:sequence 
select="$value"/>
                                        </xsl:element>
                                </xsl:otherwise>
                        </xsl:choose>
                </xsl:for-each>

     </xsl:function>


Can't you simply process the tokens directly e.g.

  <xsl:for-each select="tokenize($line,
codepoints-to-string($line-delimiter))">
    <xsl:if test=". ne ''">
      <xsl:variable name="pos" select="position()"/>
      <xsl:element name="{$headers[$pos]}">
        <xsl:value-of select="."/>
?


---
Diese E-Mail wurde von Avast Antivirus-Software auf Viren geprüft.
https://www.avast.com/antivirus
--~----------------------------------------------------------------
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>