RE: [xsl] Group problem with blank elements

Subject: RE: [xsl] Group problem with blank elements
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 1 Jul 2005 00:07:44 +0100
When you do xsl:value-of select="." directly inside xsl:for-each-group, "."
refers to the first item in the group. You want to output the concatenation
of all the items in the group, which you can do with

string-join(current-group(), ' ')

Also, each empty element that's followed by another empty element is being
treated as a group containing a single member.

I think I would tackle this using

 group-adjacent="string-length(.)=0"

This will create a sequence of groups, alternating a sequence of empty
elements with a sequence of non-empty elements. You can then test if the
first element in the current group is non-empty, and if so, output the
string-join as above.

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: Ed Yau [mailto:eyau@xxxxxxxxxxxxxxx] 
> Sent: 30 June 2005 18:31
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Group problem with blank elements
> 
> Hiya,
> 
> Having loads of trouble with this.  On the face of it a really easy
> problem.
> I have a bunch of elements like so:
> 
> <statement-message>Your account is now seriously in arrears.
> To</statement-message>
> 
> <statement-message>avoid further action a payment 
> of</statement-message>
> 
> <statement-message>$82.00 is required immediately.
> Any</statement-message>
> 
> <statement-message>purchases will now be declined.</statement-message>
> 
> <statement-message>
> </statement-message>
> 
> <statement-message>  More text </statement-message>
> 
> <statement-message>
> </statement-message>
> 
> <statement-message>
> </statement-message>
> 
> <statement-message>
> </statement-message>
> 
> I want to strip out the empty tags and merge adjacent elements as
> follows:
> 
> <statement-message> Your account is now seriously in arrears. To avoid
> further action a payment of
> 82.00 is required immediately. Any purchases will now be
> declined.</statement-message>
> 
> <statement-message>  More text </statement-message>
> 
> My code at the moment is:
> <xsl:for-each-group select="statement-message"
> group-ending-with="statement-message[string-length(normalize-s
> pace(follo
> wing-sibling::statement-message[1]))=0]">
> 	<statement-message>
> 		<xsl:value-of select="."/>
> 	</statement-message>
> </xsl:for-each-group>
> 
> My understanding of this is that it should start grouping from the 1st
> statement message, with the groups ending as soon as an empty 
> element is
> reached.  The empty tags at the end would still be there, but at least
> it should do the merge.  However, the result looks like:
> 
>      <statement-message>Your account is now seriously in arrears.
> To</statement-message>
>      <statement-message>
>      </statement-message>
>      <statement-message>  More text </statement-message>
>      <statement-message>
>      </statement-message>
>      <statement-message>
>      </statement-message>
>      <statement-message>
>      </statement-message>
> 
> So where am I going wrong?
> 
> Ed

Current Thread