Re: [xsl] for-each-group

Subject: Re: [xsl] for-each-group
From: "Eliot Kimber ekimber@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 28 Mar 2018 16:33:49 -0000
If you simply want to distinguish figures from everything else then you can
make the grouping key the same for all non-figure elements and unique for
figures, e.g.:



group-adjacent="if (self::figure) then concat(bfigure-b, position()) else
bnot-a-figureb))"



I constructed the keys to be clear when reflected e.g., in messages for
debugging purposes.



Cheers,



Eliot

--

Eliot Kimber

http://contrext.com





From: "Rick Quatro rick@xxxxxxxxxxxxxx"
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Reply-To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wednesday, March 28, 2018 at 11:22 AM
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 <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Wednesday, March 28, 2018 12:06 PM
To: 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
<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";

    xmlns:xs="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.

rick@xxxxxxxxxxxxxxx

FrameMaker toys: www.frameexpert.com/store

585-366-4017







XSL-List info and archive

EasyUnsubscribe (by email)



XSL-List info and archive

EasyUnsubscribe (by email)

XSL-List info and archive

EasyUnsubscribe (by email)

Current Thread