xsl-list
[Top] [All Lists]

RE: Returning a string from a function

2004-06-09 15:47:31
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[(_at_)physical=$substring])
      then if ($words[(_at_)physical=$substring and @logical eq '*'])
           then $substring
           else $words[(_at_)physical=$substring]/@logical
      else if ($words[(_at_)shortPhysical=$substring])
           then if ($words[(_at_)shortPhysical=$substring and @logical='*'])
                then $substring
                else $words[(_at_)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(_at_)laysercomputing(_dot_)com] 
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[(_at_)physical=$substring]">
          <xsl:choose>
            <xsl:when 
test="$locals/lookup/words/word[(_at_)physical=$substring and 
@logical='*']">
              <xsl:value-of select="$substring"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of 
select="$locals/lookup/words/word[(_at_)physical=$substring]/@logical"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:when>
        <xsl:when 
test="$locals/lookup/words/word[(_at_)shortPhysical=$substring]">
          <xsl:choose>
            <xsl:when 
test="$locals/lookup/words/word[(_at_)shortPhysical=$substring and 
@logical='*']">
              <xsl:value-of select="$substring"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of 
select="$locals/lookup/words/word[(_at_)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(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--






<Prev in Thread] Current Thread [Next in Thread>