Subject: Re: [xsl] Processing a Sequence of String Tokens in XSLT 2 From: "Andrew Welch" <andrew.j.welch@xxxxxxxxx> Date: Wed, 6 Jun 2007 20:52:10 +0100 |
I suspect this is an FAQ, and if so, feel free to point me to existing discussion, but I'm curious as to what the most efficient/elegant way to process a sequence of string tokens is.
In my specific case, I need to init-cap all the words in a string (I don't need any sophistication like special case for conjunctions or anything).
Here's the XSLT 2 function I came up with:
<xsl:function name="func:normalizeTitleContent"> <!-- Normalizes the case of titles based on the FASB-defined rules for title case --> <xsl:param name="titleElem"/> <xsl:variable name="titleTokens" select="tokenize(string($titleElem), ' ')"/> <xsl:variable name="resultString"> <xsl:for-each select="$titleTokens"> <xsl:sequence select="concat(upper-case(substring(., 1,1)), substring(., 2))"/> </xsl:for-each> </xsl:variable> <xsl:sequence select="$resultString"/> </xsl:function>
Which seems reasonably compact and understandable but I suspect that I'm not doing things as cleverly or as "correctly" as I could.
Is there a better way to have written this function?
I would add the "as" for the the param, return value and the variables... and you may need a <xsl:value-of/> in there to get a single string from a sequence of strings as the return value. I think also you may be relying on the default separator used between items in the sequence to the single space back that gets lost during the tokenization.
<xsl:function name="func:normalizeTitleContent" as="xs:string"> <xsl:param name="titleStr" as="xs:string"/> <xsl:value-of separator=" "> <xsl:for-each select="tokenize($titleStr, ' ')"> <xsl:sequence select="concat(upper-case(substring(., 1,1)), substring(., 2))"/> </xsl:for-each> </xsl:value-of> </xsl:function>
<xsl:function name="func:normalizeTitleContent" as="xs:string"> <xsl:param name="titleStr" as="xs:string"/> <xsl:sequence select="string-join(for $word in tokenize($titleStr, ' ') return concat(upper-case(substring($word, 1,1)), substring($word, 2)), ' ')"/> </xsl:function>
cheers andrew
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Processing a Sequence of Stri, Eliot Kimber | Thread | RE: [xsl] Processing a Sequence of , Michael Kay |
[xsl] Processing a Sequence of Stri, Eliot Kimber | Date | RE: [xsl] Processing a Sequence of , Michael Kay |
Month |