|
Subject: RE: [xsl] Returning a string from a function From: "Michael Kay" <mhk@xxxxxxxxx> Date: Wed, 9 Jun 2004 23:47:31 +0100 |
If the select expression in xsl:value-of is returning a sequence of strings,
and you want the strings joined together without a separator, you can
specify separator="" on the xsl:value-of instruction (the default value is
separator=" ", a single space).
However, If you want to return a string from the function, rather than a
text node, I would suggest using xsl:sequence rather than xsl:value-of. You
will then need to use string-join() to merge the strings in the sequence.
To show you an alternative coding style, I would be inclined to write this
function as:
<xsl:function name="local:logicalName" as="xs:string">
<xsl:param name="name" as="xs:string"/>
<xsl:variable name="words" as="element()*"
select="$locals/lookup/words/word"/>
<xsl:variable name="mapped-words" as="xs:string*" select="
for $substring in tokenize($name, '_') return
if ($words[@physical=$substring])
then if ($words[@physical=$substring and @logical eq '*'])
then $substring
else $words[@physical=$substring]/@logical
else if ($words[@shortPhysical=$substring])
then if ($words[@shortPhysical=$substring and @logical='*'])
then $substring
else $words[@shortPhysical=$substring]/@logical
else concat(substring(., 1, 1), lower-case(substring(., 2)))
"/>
<xsl:sequence select="string-join($mapped-words, '')"/>
</xsl:function>
Not tested!
> -----Original Message-----
> From: Barry Lay [mailto:blay@xxxxxxxxxxxxxxxxxxx]
> Sent: 09 June 2004 21:42
> To: xsl-list
> Subject: [xsl] Returning a string from a function
>
> I have the following in a stylesheet:
>
> <xsl:function name="local:logicalName">
> <xsl:param name="name"/>
>
> <xsl:analyze-string select="$name" regex="_">
> <xsl:non-matching-substring>
> <xsl:variable name="substring" select="."/>
> <xsl:choose>
> <xsl:when
> test="$locals/lookup/words/word[@physical=$substring]">
> <xsl:choose>
> <xsl:when
> test="$locals/lookup/words/word[@physical=$substring and
> @logical='*']">
> <xsl:value-of select="$substring"/>
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of
> select="$locals/lookup/words/word[@physical=$substring]/@logical"/>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:when>
> <xsl:when
> test="$locals/lookup/words/word[@shortPhysical=$substring]">
> <xsl:choose>
> <xsl:when
> test="$locals/lookup/words/word[@shortPhysical=$substring and
> @logical='*']">
> <xsl:value-of select="$substring"/>
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of
> select="$locals/lookup/words/word[@shortPhysical=$substring]/@
logical"/>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of select="concat(substring(., 1, 1),
> lower-case(substring(., 2)))"/>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:non-matching-substring>
> </xsl:analyze-string>
> </xsl:function>
>
> The $locals document contains reserved words that have special
> conversion rules, like this:
>
> <?xml version="1.0"?>
> <lookup>
> <words>
> <word physical="ACCT" shortPhysical="*" comment="*"
> logical="Account"/>
> ...
> <word physical="ZIP" shortPhysical="*" comment="*"
> logical="*"/>
> </words>
> </lookup>
>
> What I would like it to do is convert
>
> ACCOUNT_TO_GROUP
>
> into
>
> AccountToGroup
>
> via <xsl:value-of select="local:logicalName(@name)"/> but
> instead it is
> putting spaces between the words. I understand that xsl:function is
> defined to return a sequence which is what I guess is going
> on here. I
> can use string-join to squish them back together, but is
> there a way to
> output the desired result from the function directly?
>
> Thanks,
> Barry
>
> --+------------------------------------------------------------------
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
> To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
> or e-mail: <mailto:xsl-list-unsubscribe@xxxxxxxxxxxxxxxxxxxxxx>
> --+--
>
>
| Current Thread |
|---|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Returning a string from a, Barry Lay | Thread | Re: [xsl] Returning a string from a, Barry Lay |
| Re: [xsl] Returning a string from a, Barry Lay | Date | Re: [xsl] Returning a string from a, Barry Lay |
| Month |