|
Subject: Re: [xsl] for-each-group From: "Rick Quatro rick@xxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Wed, 28 Mar 2018 16:28:17 -0000 |
I just flipped Michael's solution around a bit and it seems to work fine:
group-adjacent="if (self::figure) then concat(local-name(),position()) else
0"
I forgot that you can use non-node values for grouping. XSLT is a great
language! Thanks again for the help.
Rick
From: Rick Quatro rick@xxxxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Wednesday, March 28, 2018 12:23 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] for-each-group
OK, I think I get it. You are grouping on a string derived from the node
name instead of the node itself. This doesn't work for my general intent,
because the other elements may not all be the same. For example, I might
have this:
<steps>
<step>
<para>Intro stuff</para>
<para>More intro stuff</para>
<figure/>
<figure/>
<para>Conclusion stuff</para>
<table>More conclusion stuff</table>
<para>More conclusion stuff</para>
</step>
</steps>
and I would want the three elements following the last figure to be in a
single group. But now that I see what you are doing, I will try to work it
out. Thanks.
Rick
From: Michael Kay mike@xxxxxxxxxxxx <mailto:mike@xxxxxxxxxxxx>
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx
<mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> >
Sent: Wednesday, March 28, 2018 12:06 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx <mailto:xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Subject: Re: [xsl] for-each-group
Try group-adjacent="concat(local-name(), if (self::figure) then position()
else 0))"
which will work for your example though it may not match your general
intent...
Michael Kay
Saxonica
On 28 Mar 2018, at 16:53, Rick Quatro rick@xxxxxxxxxxxxxx
<mailto:rick@xxxxxxxxxxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx
<mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> > wrote:
Hi All,
I have a <step> element that looks something like this:
<steps>
<step>
<para>Intro stuff</para>
<para>More intro stuff</para>
<figure/>
<figure/>
<para>Conclusion stuff</para>
<para>More conclusion stuff</para>
</step>
</steps>
I want 4 separate groups:
1) First two <para> elements.
2) First <figure>
3) Second <figure>
4) Last two <para> elements.
Here is my stylesheet:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl=" <http://www.w3.org/1999/XSL/Transform>
http://www.w3.org/1999/XSL/Transform"
xmlns:xs=" <http://www.w3.org/2001/XMLSchema>
http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="/steps">
<xsl:apply-templates select="step"/>
</xsl:template>
<xsl:template match="step">
<xsl:for-each-group select="*" group-starting-with="figure">
<xsl:message select="count(current-group())"></xsl:message>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
I get the first two groups, but the last two <para> elements are part of the
last <figure>'s group instead of being separate.
I tried using group-by="figure" but I don't get any output. Any help would
be appreciated. Thank you very much.
Rick
Rick Quatro
Carmen Publishing Inc.
<mailto:rick@xxxxxxxxxxxxxxx> rick@xxxxxxxxxxxxxxx
FrameMaker toys: <http://www.frameexpert.com/store>
www.frameexpert.com/store
585-366-4017
<http://www.mulberrytech.com/xsl/xsl-list> XSL-List info and archive
EasyUnsubscribe (by email)
XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
EasyUnsubscribe (by email)
XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
EasyUnsubscribe <-list/612310> (by
email <> )
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] for-each-group, Michael Kay mike@xxx | Thread | Re: [xsl] for-each-group, Eliot Kimber ekimber |
| Re: [xsl] for-each-group, Michael Kay mike@xxx | Date | Re: [xsl] for-each-group, Eliot Kimber ekimber |
| Month |