Subject: Re: [xsl] creating multi-level TOC from existing list From: "Martin Honnen martin.honnen@xxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 5 Jun 2020 05:55:43 -0000 |
Am 05.06.2020 um 01:18 schrieb Charlie0 charlieo0@xxxxxxxxxxx:title="RVZXKR LUBV
I need help with XSLT 2.0. I am completely stumped on how to proceed. I
have tried doing string comparisons and that is not working. I am sure
there is way to use grouping to accomplish what I need, but I just don't
know how to create two separate groups and build the TOC I need. I have
no code to show. Any help to put me in the right direction is appreciated.
Below is the input, followed by the desired output. Text has been
distorted due company policies.
Input snippet:
<toc>
B B B B <tocEntry title="01 VNGKNV">
B B B B B B B B <tocEntry title="0100 VNGKNV XSSVMBLY">
B B B B B B B B B B B B <tocEntry filename="M2390992350401.xml"
title="RVZLXCV
CKL FKLTVR XSSVMBLY"/>
B B B B B B B B </tocEntry>
B B B B </tocEntry>
B B B B <tocEntry title="01 VNGKNV">
B B B B B B B B <tocEntry title="0100 VNGKNV XSSVMBLY">
B B B B B B B B B B B B <tocEntry filename="M2812292350401.xml"
SHKZZKNG/STCRXGV CCNTXKNVR"/>
HYDRXULKC RVSVRVCKR BRXCKVT"/>
B B B B B B B B </tocEntry>
B B B B </tocEntry>
B B B B <tocEntry title="01 VNGKNV">
B B B B B B B B <tocEntry title="0100 VNGKNV XSSVMBLY">
B B B B B B B B B B B B <tocEntry filename="M3007592350401.xml"
B B B B B B B B B B B B B B B B title="RVZLXCV VNGKNV FRCM
CRXNKSHXFT ZULLVY"/>
B B B B B B B B </tocEntry>
B B B B </tocEntry>
B B B B <tocEntry title="01 VNGKNV">
B B B B B B B B <tocEntry title="0102 CRXNKSHXFT">
B B B B B B B B B B B B <tocEntry filename="M2356292350401.xml"
B B B B B B B B B B B B B B B B title="RVZLXCV VKBRXTKCN DXMZVR XND
title="RVZLXCV RVXR
B B B B B B B B </tocEntry>
B B B B </tocEntry>
B B B B <tocEntry title="01 VNGKNV">
B B B B B B B B <tocEntry title="0102 CRXNKSHXFT">
B B B B B B B B B B B B <tocEntry filename="M2357392350401.xml"
title="RVZLXCV
CRXNKSHXFT SVXL"/>
B B B B B B B B </tocEntry>
B B B B </tocEntry>
B B B B <tocEntry title="01 VNGKNV">
B B B B B B B B <tocEntry title="0103 FLYWHVVL XSSVMBLY">
B B B B B B B B B B B B <tocEntry filename="M2357292350401.xml"
title="RVZLXCV RVXR
FLYWHVVL"/>
B B B B B B B B </tocEntry>
B B B B </tocEntry>
B B B B <tocEntry title="01 VNGKNV">
B B B B B B B B <tocEntry title="0103 FLYWHVVL XSSVMBLY">
B B B B B B B B B B B B <tocEntry filename="M2390892350401.xml"
title="RVZLXCV XKR
CRXNKSHXFT XDXZTVR"/>
B B B B B B B B </tocEntry>
B B B B </tocEntry>
B B B B <tocEntry title="03 FUVL SYSTVM">
B B B B B B B B <tocEntry title="0304 XKR CLVXNVR">
B B B B B B B B B B B B <tocEntry filename="M2142592350401.xml"
KNTXKV
CLVXNVR BCCT"/>
B B B B B B B B </tocEntry>
B B B B </tocEntry>
B B B B <tocEntry title="03 FUVL SYSTVM">
B B B B B B B B <tocEntry title="0304 XKR CLVXNVR">
B B B B B B B B B B B B <tocEntry filename="M2376292350401.xml"
B B B B B B B B B B B B B B B B title="RVZLXCV TURBCCHXRGVR CCMZRVSSCR
CR
ZRVSSURV/TVMZVRXTURV SVNSCR"/>
B B B B B B B B </tocEntry>
B B B B </tocEntry>
B B B B <tocEntry title="03 FUVL SYSTVM">
B B B B B B B B <tocEntry title="0305 SUZVRCHXRGVR, BLCWVR, TURBCCHXRGVR
title="RVZLXCV
XLTKTUDV CCMZVNSXTCR">
B B B B B B B B B B B B <tocEntry filename="M2249792350401.xml"
title="RVZXKR LUBV
TURBCCHXRGVR "/>
B B B B B B B B </tocEntry>
B B B B </tocEntry>
</toc>
Desired output:
<toc>
B B B B <tocEntry title="01 VNGKNV">
B B B B B B B B <tocEntry title="0100 VNGKNV XSSVMBLY">
B B B B B B B B B B B B <tocEntry filename="M2390992350401.xml"
SHKZZKNG/STCRXGV
CKL FKLTVR XSSVMBLY"/>
B B B B B B B B <tocEntry filename="M2812292350401.xml" title="RVZLXCV
HYDRXULKC RVSVRVCKR BRXCKVT"/>
B B B B B B B B B B B B <tocEntry filename="M3007592350401.xml"
B B B B B B B B B B B B B B B B title="RVZLXCV VNGKNV FRCM
title="RVZLXCV
CCNTXKNVR"/></tocEntry>
B B B B B B B B <tocEntry title="0102 CRXNKSHXFT">
B B B B B B B B B B B B <tocEntry filename="M2356292350401.xml"
title="RVZLXCV RVXR
VKBRXTKCN DXMZVR XND CRXNKSHXFT ZULLVY"/>
B B B B B B B B B B B B <tocEntry filename="M2357392350401.xml"
title="RVZLXCV
CRXNKSHXFT SVXL"/>
B B B B B B B B </tocEntry>
B B B B B B B B <tocEntry title="0103 FLYWHVVL XSSVMBLY">
B B B B B B B B B B B B <tocEntry filename="M2357292350401.xml"
title="RVZLXCV
FLYWHVVL"/>
B B B B B B B B B B B B <tocEntry filename="M2390892350401.xml"
title="RVZLXCV XKR
CRXNKSHXFT XDXZTVR"/>
B B B B B B B B </tocEntry>
B B B B </tocEntry>
B B B B <tocEntry title="03 FUVL SYSTVM">
B B B B B B B B <tocEntry title="0304 XKR CLVXNVR">
B B B B B B B B B B B B <tocEntry filename="M2142592350401.xml"
KNTXKV
CLVXNVR BCCT"/>
B B B B B B B B B B B B <tocEntry filename="M2376292350401.xml"
B B B B B B B B B B B B B B B B title="RVZLXCV TURBCCHXRGVR CCMZRVSSCR
CR
ZRVSSURV/TVMZVRXTURV SVNSCR"/>
B B B B B B B B </tocEntry>
B B B B B B B B <tocEntry title="0305 SUZVRCHXRGVR, BLCWVR, TURBCCHXRGVR
title="RVZLXCV
XLTKTUDV CCMZVNSXTCR">
B B B B B B B B B B B B <tocEntry filename="M2249792350401.xml"
select="current-group()/tocEntry"
TURBCCHXRGVR "/>
B B B B B B B B </tocEntry>
B B B B </tocEntry>
</toc>
For two levels you can just nest two for-each-group
B <xsl:template match="toc">
B B B B B <xsl:copy>
B B B B B B B B B <xsl:for-each-group select="tocEntry" group-by="@title">
B B B B B B B B B B B B B <xsl:copy>
B B B B B B B B B B B B B B B B B <xsl:apply-templates select="@*"/>
B B B B B B B B B B B B B B B B B <xsl:for-each-group
group-by="@title">select="@*,
B B B B B B B B B B B B B B B B B B B B B <xsl:copy>
B B B B B B B B B B B B B B B B B B B B B B B B B <xsl:apply-templates
current-group()/tocEntry"/>
B B B B B B B B B B B B B B B B B B B B B </xsl:copy>
B B B B B B B B B B B B B B B B B </xsl:for-each-group>
B B B B B B B B B B B B B </xsl:copy>
B B B B B B B B B </xsl:for-each-group>
B B B B B </xsl:copy>
B </xsl:template>
for arbitrary levels you would need to morph that into a recursive function or template.
<xsl:function name="mf:group" as="element(tocEntry)*"> <xsl:param name="entries" as="element(tocEntry)*"/> <xsl:for-each-group select="$entries" group-by="@title"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:sequence select="mf:group(current-group()/tocEntry)"/> </xsl:copy> </xsl:for-each-group> </xsl:function>
<xsl:template match="toc"> <xsl:copy> <xsl:sequence select="mf:group(tocEntry)"/> </xsl:copy> </xsl:template>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] creating multi-level TOC , Martin Honnen martin | Thread | [xsl] Stylesheet parameters and pac, David Birnbaum djbpi |
Re: [xsl] creating multi-level TOC , Martin Honnen martin | Date | Re: [xsl] Random number generator t, Roger L Costello cos |
Month |