xsl-list
[Top] [All Lists]

Re: [xsl] Nested for-each-group and current-group()

2020-05-11 15:52:00
Rick,
Think on second group you want  <xsl:for-each-group select="current-group()/*">
Try this:
<?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:output indent="yes"/>
    <xsl:template match="/">
        <xsl:result-document href="rick-output.xml">
            <xsl:apply-templates/>
        </xsl:result-document>
    </xsl:template>
    <xsl:template match="root">
        <root>
            <xsl:for-each-group select="*"
                group-adjacent="
                    if (self::topic) then
                        1
                    else
                        0">
                <xsl:choose>
                    <xsl:when test="current-grouping-key() = 1">
                        <ol>
                            <xsl:for-each-group select="current-group()/*"
                                group-adjacent="
                                    if (self::subtopic) then
                                        1
                                    else
                                        0">
                                <xsl:choose>
                                    <xsl:when test="current-grouping-key() = 1">
                                        <ul>
                                            <xsl:apply-templates 
select="current-group()"/>
                                        </ul>
                                    </xsl:when>
                                    <xsl:otherwise>
                                        <li>
                                            <xsl:apply-templates 
select="current-group()"/>
                                        </li>
                                    </xsl:otherwise>
                                </xsl:choose>
                            </xsl:for-each-group>
                        </ol>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:apply-templates select="current-group()"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>
        </root>
    </xsl:template>
    <xsl:template match="topic | subtopic">
        <li>
            <xsl:apply-templates/>
        </li>
    </xsl:template>
    <!-- Identity transform. -->
    <xsl:template match="@* | node()">
        <xsl:copy copy-namespaces="no">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>



TerryBadger






On Monday, May 11, 2020, 12:36:32 PM EDT, Liam R. E. Quin 
liam(_at_)fromoldbooks(_dot_)org 
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote: 





On Mon, 2020-05-11 at 15:47 +0000, Wendell Piez 
wapiez(_at_)wendellpiez(_dot_)com
wrote:
Hi,

Alternatively, if you wish to continue using xsl:apply-templates
idiomatically and capture all nodes in traversal without the ungainly
"current-group()/node()", you could write

<xsl:for-each select="current-group()">
  <xsl:apply-templates/>
</xsl:for-each>

This does something slightly different in the presence of comments  and
processing instructions i think. THe coffee hasn't worked here yet.

Also, Rick already has <xsl:apply-templates select="current-group()">
elsewhere in their XSLT :)

Liam

-- 
Liam Quin, https://www.delightfulcomputing.com/
Available for XML/Document/Information Architecture/XSLT/
XSL/XQuery/Web/Text Processing/A11Y training, work & consulting.
Barefoot Web-slave, antique illustrations:  http://www.fromoldbooks.org
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--

<Prev in Thread] Current Thread [Next in Thread>