Subject: RE: 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: 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
|