Subject: [xsl] Variation on adjaceny list question From: "Simon Shutter" <simon@xxxxxxxxxxx> Date: Fri, 16 Mar 2007 10:36:14 -0700 |
A few weeks ago I presented a problem in which I needed to transform a tabular data set into a hierarchical set. I then reframed my question slightly to that the input is an XML representation of an adjacency list where each <row> element has 0 or 1 parent element where the ParentID element points to the ID element of the parent. Sergey Dubinets provided a solution on the MSDN newsgroup that looks like this. For an input of : <root> <row><ID>1</ID><Name>One</Name></row> <row><ID>2</ID><ParentID>1</ParentID><Name>Two</Name></row> <row><ID>3</ID><ParentID>2</ParentID><Name>Three</Name></row> <row><ID>4</ID><ParentID>1</ParentID><Name>Four</Name></row> </root> Use this stylesheet : <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output version="1.0" indent="yes" omit-xml-declaration="yes"/> <xsl:template match="/"> <html> <head> <title>Tree</title> </head> <body> <xsl:apply-templates select="root/row[not(ParentID)]"/> </body> </html> </xsl:template> <xsl:template match="row"> <ul> <li> <xsl:value-of select="Name"/> <xsl:variable name="id" select="ID"/> <xsl:apply-templates select="../row[ParentID = $id]"/> </li> </ul> </xsl:template> </xsl:stylesheet> To produce this output : <html> <head> <title>Tree</title> </head> <body> <ul> <li>One<ul><li>Two<ul><li>Three</li></ul></li></ul><ul><li>Four</li></ul></l i> </ul> </body> </html> However, what if I have more than one node (eg IDs 1 and 3) without a ParentID like this: <root> <row><ID>1</ID><Name>One</Name></row> <row><ID>2</ID><ParentID>1</ParentID><Name>Two</Name></row> <row><ID>3</ID><Name>Three</Name></row> <row><ID>4</ID><ParentID>3</ParentID><Name>Four</Name></row> </root> The stylesheet produces : <html> <head> <title>Tree</title> </head> <body> <ul> <li>One<ul><li>Two</li></ul></li> </ul> <ul> <li>Three<ul><li>Four</li></ul></li> </ul> </body> </html> My question is - how can I change the stylesheet such that the two unordered lists are combined to produce this desired output: <html> <head> <title>Tree</title> </head> <body> <ul> <li>One<ul><li>Two</li></ul></li> <li>Three<ul><li>Four</li></ul></li> </ul> </body> </html> Thanks, Simon
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Grouping - using Referenc, Wendell Piez | Thread | RE: [xsl] Variation on adjaceny lis, cknell |
Re: [xsl] Sequential numbers in pur, Dimitre Novatchev | Date | Re: [xsl] Sequential numbers in pur, Abel Braaksma |
Month |