Re: [xsl] A better way to build a comma-delimited list

Subject: Re: [xsl] A better way to build a comma-delimited list
From: Joerg Heinicke <joerg.heinicke@xxxxxx>
Date: Wed, 15 May 2002 09:15:02 +0200
Hello John,

>       <xsl:for-each select="$dbdef">
>          <xsl:if test="key('dbdef-cols', $dbcolumn)">
>             <xsl:value-of select="$dbcolumn"/>
>             <xsl:if test="$p &lt; $l">
>                <xsl:text>, </xsl:text>
>             </xsl:if>
>          </xsl:if>
>       </xsl:for-each>

instead of the for-each + if you can write one for-each with predicate:

<xsl:for-each select="$dbdef[key('dbdef-cols', $dbcolumn)]">

Now the correct nodeset is selected and position() and last() will work. But they must refer to the inner for-each, so you can't use $p and $l, but <xsl:if test="position() != last()">.

So, you have then

<xsl:for-each select="$dbdef[key('dbdef-cols', $dbcolumn)]">
  <xsl:value-of select="$dbcolumn"/>
  <xsl:if test="position() != last()">
    <xsl:text>, </xsl:text>
  </xsl:if>
</xsl:for-each>

Regards,

Joerg

John Sands schrieb:
I have some XSLT that builds a SQL select statement from several input
documents. Here's a fragment that builds the column list by getting
each distinct column name from a separate file ($pbsdef) and checking
that is is defined in another file (referenced by variable $dbdef).

   <xsl:text>select </xsl:text>
   <xsl:for-each select="document($pbsdef)/pbsdef/column[not(@dbcolumn=preceding-sibling::column/@dbcolumn)]">
      <xsl:variable name="p" select="position()"/>
      <xsl:variable name="l" select="last()"/>
      <xsl:variable name="dbcolumn" select="@dbcolumn"/>
      <xsl:for-each select="$dbdef">
         <xsl:if test="key('dbdef-cols', $dbcolumn)">
            <xsl:value-of select="$dbcolumn"/>
            <xsl:if test="$p &lt; $l">
               <xsl:text>, </xsl:text>
            </xsl:if>
         </xsl:if>
      </xsl:for-each>
   </xsl:for-each>

The output of this fragment might be:

select col1, col2, col3

This all works fine, except for one case - where the last column is
not found in the $dbdef file (where the 'if test=key' fails). Then I
get:

select col1, col2,

The position() < last() test doesn't work here. Can someone see a
better way to avoid that last comma?

Thanks,
John Sands


XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list


Current Thread