[xsl] Grouping problem

Subject: [xsl] Grouping problem
From: "rick@xxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Tue, 29 Mar 2022 21:01:31 -0000
Hi All,

 

I am missing something obvious with grouping but I am not sure what. Here is
my input:

 

<?xml version='1.0' encoding='UTF-8'?>

<doc>

  <pgf href="control-panel.dita" level="1" topictype="concept"/>

  <pgf href="r_zt230-printer-control-panel.dita" level="2"
topictype="reference"/>

  <pgf href="r_zt220-printer-control-panel.dita" level="2"
topictype="reference"/>

  <pgf href="r_zt210-printer-control-panel.dita" level="2"
topictype="reference"/>

  <pgf href="c_navigating-through-screens-in-the-zt230-printer-display.dita"
level="2" topictype="concept"/>

  <pgf href="t_idle-display.dita" level="3" topictype="task"/>

  <pgf href="t_home-menu.dita" level="3" topictype="task"/>

  <pgf href="t_user-menus.dita" level="3" topictype="task"/>

  <pgf href="c_idle-display-home-menu-and-user-menus.dita" level="2"
topictype="concept"/>

</doc>

 

I want to produce this output:

 

<map>

    <topicref href="control-panel.dita" type="concept">

        <topicref href="r-zt230-printer-control-panel.dita"
type="reference"/>

        <topicref href="r-zt220-printer-control-panel.dita" type="reference
"/>

        <topicref href="r-zt210-printer-control-panel.dita"
type="reference"/>

        <topicref
href="c-navigating-through-screens-in-the-zt230-printer-display.dita"
type="concept">

            <topicref href="t-idle-display" type="task"/>

            <topicref href="t-home-menu.dita" type="task"/>

            <topicref href="t-user-menus.dita" type="task"/>

        </topicref>

        <topicref href="c-idle-display-home-menu-and-user-menus.dita"
type="concept"/>

    </topicref>

</map>

 

This 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="/doc">

        <map>

            <xsl:for-each-group select="pgf"
group-starting-with="@level[.='1']">

                <xsl:apply-templates select="." mode="group"/>

            </xsl:for-each-group>

        </map>

    </xsl:template>

    

    <xsl:template match="pgf[@level='1']" mode="group">

        <topicref href="{./@href}">

            <xsl:for-each-group select="current-group() except ."
group-starting-with="@level[.='2']">

                <xsl:apply-templates select="." mode="group"/>

            </xsl:for-each-group>

        </topicref>

    </xsl:template>

    

    <xsl:template match="pgf[@level='2']" mode="group">

        <topicref href="{./@href}">

            <xsl:for-each-group select="current-group() except ."
group-starting-with="@level[.='3']">

                <xsl:apply-templates select="." mode="group"/>

            </xsl:for-each-group>

        </topicref>

    </xsl:template>

    

    <xsl:template match="pgf" mode="group">

        <topicref href="{@href}"/>

    </xsl:template>

    

    <xsl:mode on-no-match="shallow-skip"/>

    

</xsl:stylesheet>

 

Thanks in advance for any pointers.

 

Rick

Current Thread