| 
 
Subject: Re: [xsl] Two possible group-ending-with nodes From: "rick@xxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 6 Jan 2023 15:47:49 -0000  | 
Martin, I see your solution in the previous post and it is cleaner using the
note variable. Thank you very much!
 
Rick
 
From: rick@xxxxxxxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> 
Sent: Friday, January 6, 2023 10:40 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Two possible group-ending-with nodes
 
This definitely makes sense. I think it is a group-adjacent problem. Here is
my modified input with the correct output:
 
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <p class="CBBodyIndented">Out 1</p>
    <p class="CBNote">In header</p>
    <p class="CBNoteBody">In content 1</p>
    <p class="CBBodyIndented" style="margin-left:96px;">In content 2</p>
    <p class="CBBodyIndented">Out 2</p>
    <p class="CBBody">Out 3</p>
    <p class="CBBodyIndented" style="margin-left:96px;">Out 4</p>
</root>
 
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <p class="CBBodyIndented">Out 1</p>
   <div class="note">
      <div class="note-header">
         <p class="CBNote">In header</p>
      </div>
      <div class="note-content">
         <p class="CBNoteBody">In content 1</p>
         <p class="CBBodyIndented" style="margin-left:96px;">In content
2</p>
      </div>
   </div>
   <p class="CBBodyIndented">Out 2</p>
   <p class="CBBody">Out 3</p>
   <p class="CBBodyIndented" style="margin-left:96px;">Out 4</p>
</root>
 
Below is my stylesheet. I am using the same for-each-group group-adjacent
loop twice because I need some content inside the <div class-"note-content">
and the rest of it outside. Any suggestions for a better approach will be
appreciated. Thank you!
 
<?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"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    exclude-result-prefixes="xs math"
    version="3.0" expand-text="yes">
    
    <xsl:output indent="yes"/>
    
    <xsl:template match="/root">
        <xsl:copy>
            <xsl:for-each-group select="*"
group-starting-with="p[@class='CBNote']">
                <xsl:choose>
                    <xsl:when test="self::p[@class='CBNote']">
                        <div class="note">
                            <div class="note-header">
                                <xsl:copy-of select="."/>
                            </div>
                            <div class="note-content">
                                <xsl:for-each-group
select="tail(current-group())"
group-adjacent="if(self::p[@class='CBNoteBody']|self::p[@class='CBBodyIndent
ed'][@style='margin-left:96px;']) then 1 else 0">
                                    <xsl:if test="current-grouping-key()=1
and position()=1">
                                        <xsl:copy-of
select="current-group()"/>
                                    </xsl:if>
                                </xsl:for-each-group>
                            </div>
                        </div>
                    </xsl:when>
                    <xsl:otherwise><xsl:apply-templates
select="current-group()"/></xsl:otherwise>
                </xsl:choose>
                <xsl:for-each-group select="tail(current-group())"
group-adjacent="if(self::p[@class='CBNoteBody']|self::p[@class='CBBodyIndent
ed'][@style='margin-left:96px;']) then 1 else 0">
                    <xsl:if test="current-grouping-key()=0 or
position()>1">
                        <xsl:copy-of select="current-group()"/>
                    </xsl:if>
                </xsl:for-each-group>
            </xsl:for-each-group>
        </xsl:copy>    
    </xsl:template>
    
    <xsl:mode on-no-match="shallow-copy"/>
    
</xsl:stylesheet>
 
From: Michael Kay michaelkay90@xxxxxxxxx <mailto:michaelkay90@xxxxxxxxx>
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx
<mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> > 
Sent: Friday, January 6, 2023 10:05 AM
To: xsl-list <xsl-list@xxxxxxxxxxxxxxxxxxxxxx
<mailto:xsl-list@xxxxxxxxxxxxxxxxxxxxxx> >
Subject: Re: [xsl] Two possible group-ending-with nodes
 
It ends the first inner group at the first element because it matches the
first condition, p[@class='CBNoteBody']; it ends the second inner group at
the second element because it matches the second condition
p[@class='CBBodyIndented'][@style='margin-left:96px;'], and it ends the
third inner group at the third element because everything after the last
matching element goes in a final group regardless.
Michael Kay
Saxonica
 
XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>  
EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/612310>  (by
email) 
XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>  
EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/612310>  (by
email <> ) 
| Current Thread | 
|---|
  | 
| <- Previous | Index | Next -> | 
|---|---|---|
| Re: [xsl] Two possible group-ending, rick@xxxxxxxxxxxxxx | Thread | [xsl] [ANN] Saxon 12.0, Michael Kay michaelk | 
| Re: [xsl] Two possible group-ending, rick@xxxxxxxxxxxxxx | Date | [xsl] [ANN] Saxon 12.0, Michael Kay michaelk | 
| Month |