|
Subject: Re: [xsl] A better way to build a comma-delimited list From: John Sands <WonkoWatson@xxxxxxxxx> Date: Wed, 15 May 2002 06:55:42 -0400 |
Hi Joerg,
> <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>
I loved the solution because it would fix the problem AND make the
code shorter. Unfortunately it doesn't work because position() and
last() are both 1 so I get:
select col1col2col3
John
> -----Original Message-----
> From: Joerg Heinicke <joerg.heinicke@xxxxxx>
> Sent: Wednesday, May 15, 2002, 3:15:02 AM,
> Subject: [xsl] A better way to build a comma-delimited list
> 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
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] how to apply sum to a com, Mike Brown | Thread | Re: [xsl] A better way to build a c, Joerg Heinicke |
| Re:Re: [xsl] regarding the extensio, william locksman | Date | Re: [xsl] With or without PSVI, Dan Holmsand |
| Month |