[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] RE: XSL resources - Flat to hierarchy - Common ancesto
Eureka! With the answers received, and (I admit) blindly playing around with templates, I've got something which works for my second question: I'm posting the entire stylesheet here in case anyone needs it, and also in case anyone higher up the learning tree has any comments on how it should be done. > 2. Transforming 'flat' structures to hierarchies: > I've adapted a stylesheet found in this list, for creating the hierarchy > of this: > <Menus> > <Menu MenuId="58" MenuName="LeftMenu"/> > <Menu MenuId="1" MenuParentId="58" MenuName="Home"/> > <Menu MenuId="60" MenuParentId="1" MenuName="About us/> > ...etc > </Menus> > > Question: is there any way of also adding the numbering (<xsl:number > level="multiple" format="1.1"/>) directly, or do I have to run the > output through a second stylesheet? My answer is: <?xml version="1.0"?> <!--XSL to Transform 'flat' Menu structure into hierarchy (expects format <Menus><Menu MenuId="1" MenuParentId="58" MenuName="Home"/></Menus>)--> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> <xsl:output method="xml" version="1.0" encoding="UTF-8" omit-xml-declaration="no" standalone="no" indent="yes" /> <xsl:template match="/"> <xsl:variable name="menus"> <xsl:apply-templates select="Menus"/> </xsl:variable> <xsl:apply-templates select="msxsl:node-set($menus)/*" mode="addTOC"/> </xsl:template> <xsl:template match="Menus"> <xsl:copy> <xsl:apply-templates select="Menu[not(@MenuParentId)]"> </xsl:apply-templates> </xsl:copy> </xsl:template> <xsl:template match="Menu"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:if test="count(../Menu[@MenuParentId = current()/@MenuId])"> <xsl:attribute name="hasChild">true</xsl:attribute> </xsl:if> <xsl:apply-templates select="../Menu[@MenuParentId = current()/@MenuId]"/> </xsl:copy> </xsl:template> <!--Last template to process results of others and add toc--> <xsl:template match="Menu" mode="addTOC"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:attribute name="TOC"> <xsl:number level="multiple" format="1.1"/> </xsl:attribute> <xsl:apply-templates select="Menu" mode="addTOC"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|