Subject: [xsl] Nested for-each-group and current-group() From: "Rick Quatro rick@xxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Mon, 11 May 2020 14:33:48 -0000 |
Hi All, I have this as my input XML: <?xml version="1.0" encoding="UTF-8"?> <root> <topic> <para>topic 1</para> <subtopic> <para>subtopic 1a</para> </subtopic> <subtopic> <para>subtopic 1b</para> </subtopic> <subtopic> <para>subtopic 1c</para> </subtopic> <subtopic> <para>subtopic 1d</para> </subtopic> </topic> <topic> <para>topic 2</para> </topic> <topic> <para>topic 3</para> <subtopic> <para>subtopic 3a</para> </subtopic> <subtopic> <para>subtopic 3b</para> </subtopic> <subtopic> <para>subtopic 3c</para> </subtopic> </topic> </root> My goal is to convert adjacent topic elements into an <ol> element and adjacent subtopic elements into a <ul> element. <?xml version="1.0" encoding="UTF-8"?> <root> <ol> <li> <para>topic 1</para> <ul> <li> <para>subtopic 1a</para> </li> <li> <para>subtopic 1b</para> </li> <li> <para>subtopic 1c</para> </li> <li> <para>subtopic 1d</para> </li> </ul> </li> <li> <para>topic 2</para> </li> <li> <para>topic 3</para> <ul> <li> <para>subtopic 3a</para> </li> <li> <para>subtopic 3b</para> </li> <li> <para>subtopic 3c</para> </li> </ul> </li> </ol> </root> I am using nested xsl:for-each-group constructs but I don't get the inner <ul> elements. I think I am incorrect in my use of current-grouping-key() or current-group() on the inner group. Thanks in advance. <?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="/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> <xsl:apply-templates select="current-group()"/> </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> Rick Rick Quatro Carmen Publishing Inc. rick@xxxxxxxxxxxxxxx 585-729-6746 www.frameexpert.com/store/
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] A super-efficient way to , Costello, Roger L. c | Thread | Re: [xsl] Nested for-each-group and, Martin Honnen martin |
Re: [xsl] A super-efficient way to , Dimitre Novatchev dn | Date | Re: [xsl] Nested for-each-group and, Martin Honnen martin |
Month |