| 
 
Subject: [xsl] Two possible group-ending-with nodes From: "rick@xxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 6 Jan 2023 14:42:22 -0000  | 
Hi All,
 
I am trying to add some hierarchy to flat content. I have this as an input
file:
 
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <p class="CBNote"/>
    <p class="CBNoteBody"/>
    <p class="CBBodyIndented" style="margin-left:96px;"/>
    <p class="CBBodyIndented"/>
    <p class="CBBody"/>
</root>
 
This is my desired output:
 
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <div class="note">
        <div class="note-header">
            <p class="CBNote"/>
        </div>
        <div class="note-content">
            <p class="CBNoteBody"/>
            <p class="CBBodyIndented" style="margin-left:96px;"/>
        </div>
    </div>
    <p class="CBBodyIndented"/>
    <p class="CBBody"/>
</root>
 
After the note-header, the bottom boundary of the note content is either one
of these:
 
p[@class='CBNoteBody']|p[@class='CBBodyIndented'][@style='margin-left:96px;'
]
 
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"
    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>
                            <xsl:for-each-group
select="tail(current-group())"
group-ending-with="p[@class='CBNoteBody']|p[@class='CBBodyIndented'][@style=
'margin-left:96px;']">
                                <xsl:copy-of
select="current-group()[1]"></xsl:copy-of>
                            </xsl:for-each-group>
                        </div>
                    </xsl:when>
                </xsl:choose>
            </xsl:for-each-group>
        </xsl:copy>    
    </xsl:template>
    
    <xsl:mode on-no-match="shallow-skip"/>
    
</xsl:stylesheet>
 
Here is my current output:
 
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <div class="note">
      <div class="note-header">
         <p class="CBNote"/>
      </div>
      <p class="CBNoteBody"/>
      <p class="CBBodyIndented" style="margin-left:96px;"/>
      <p class="CBBodyIndented"/>
   </div>
</root>
 
It looks like my group-ending-with is giving me 3 groups instead of 2 like I
expected. Any pointers will be appreciated. Thank you.
 
Rick
| Current Thread | 
|---|
  | 
| <- Previous | Index | Next -> | 
|---|---|---|
| Re: [xsl] [ANN] spaces available in, Liam R. E. Quin liam | Thread | Re: [xsl] Two possible group-ending, Martin Honnen martin | 
| Re: [xsl] [ANN] spaces available in, Liam R. E. Quin liam | Date | Re: [xsl] Two possible group-ending, Martin Honnen martin | 
| Month |