Subject: Re: [xsl] A function that tokenizes a string, wrapping each token in start-tag , end-tag pairs? From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Thu, 21 Apr 2016 15:13:10 -0000 |
Why not use xsl:analyze-string? <xsl:analyze-string select="$line" regex="...."> <xsl:matching-substring/> <xsl:non-matching-substring> <xsl:variable name="p" select="position()"/> <xsl:element name="{$tag[$p]}"><xsl:value-of select="."/></xsl:element> </xsl:non-matching-substring> </xsl:analyze-string> For reusability in XSLT 3.0 this is a good candidate for a higher-order-function - you could pass a parameter which is a function to be called to determine the element name to be used for the Nth token. Michael Kay Saxonica > On 21 Apr 2016, at 13:20, Costello, Roger L. costello@xxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > Hi Folks, > > I want a function that tokenizes a string and wraps each token in a start-tag, end-tag pair. > > I figure that I should pass into the function the string to be tokenized and a sequence of integers corresponding to the decimal value(s) of the token delimiter. > > Also, I figure that I should pass into the function a sequence of strings, corresponding to the tag names to be used for wrapping each token. > > 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>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] A function that tokenizes, Martin Honnen martin | Thread | Re: [xsl] A function that tokenizes, Dimitre Novatchev dn |
Re: [xsl] A function that tokenizes, Costello, Roger L. c | Date | Re: [xsl] A function that tokenizes, Dimitre Novatchev dn |
Month |