This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: A better way to build a comma-delimited list
- From: Joerg Heinicke <joerg dot heinicke at gmx dot de>
- To: xsl-list at lists dot mulberrytech dot com
- Date: Wed, 15 May 2002 09:15:02 +0200
- Subject: Re: [xsl] A better way to build a comma-delimited list
- References: <13757452703.20020514223447@Yahoo.com>
- Reply-to: xsl-list at lists dot mulberrytech dot com
Hello John,
> <xsl:for-each select="$dbdef">
> <xsl:if test="key('dbdef-cols', $dbcolumn)">
> <xsl:value-of select="$dbcolumn"/>
> <xsl:if test="$p < $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 < $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