|
Subject: RE: [xsl] Processing a Sequence of String Tokens in XSLT 2 From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Wed, 6 Jun 2007 21:09:22 +0100 |
> 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).
I'm really not sure I want to help anyone deliver such an aesthetic
monstrosity, but I suppose tastes vary from one side of the pond to the
other...
> 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.
>
Well, for a start it would be a lot more readable and possibly more
efficient if you declared the types of the arguments and the results.
It's probably inefficient to create the temporary document for
$resultString, although of course it depends on the implementation. Saxon is
getting reasonably good at optimizing away unnecessary temporary documents,
but it's better to avoid creating them in the first place. A function like
this should work in terms of atomic values only, no need to create any
document nodes or text nodes.
It's a matter of personal style, but I tend to code this kind of thing in
XPath rather than XSLT. Specifically,
<xsl:function
name="func:normalizeTitleContent" as="xs:string">
<!-- Normalizes the case of titles based on the
FASB-defined rules for title case -->
<xsl:param name="titleElem" as="xs:string"/>
<xsl:sequence select="
string-join(
for $x in tokenize($titleElem, ' ')
return concat(upper-case(substring($x, 1,1)), substring($x, 2)),
' ')"/>
</xsl:function>
Michael Kay
http://www.saxonica.com/
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Processing a Sequence of , Andrew Welch | Thread | Re: [xsl] Processing a Sequence of , Eliot Kimber |
| Re: [xsl] Processing a Sequence of , Andrew Welch | Date | Re: [xsl] html tags not closing, David Carlisle |
| Month |