xsl-list
[Top] [All Lists]

RE: [xsl] Transforming tabular information to hierarchical

2007-02-14 00:31:07
I'm struggling with this problem and if any kind soul could provide some
guidance I'd be very grateful.  I began with a table (adjacency list) of csv
values that I transformed using Andrew Welch's stylesheet suggestion.  This
provided me with an XML representation of the data but I have been unable to
use Michael's suggestion for xsl:key to produce the desired output.  I have
managed to associate each child node with its parent but that's as far as
I've been able to get.

Simon

The latest I have is...

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:key name="parentKey" match="row" use="ChildID"/>

  <xsl:template match="root">
    <html>
      <head></head>
        <body>
          <ul>
            <xsl:apply-templates select="row" />
          </ul>
        </body>
    </html>
  </xsl:template>
  
  <xsl:template match="ChildID">
    <xsl:value-of select="key('parentKey',@pid)/ChildID"/>
  </xsl:template>
</xsl:stylesheet> 

Which transforms 

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <row>
    <ChildID id="1">1</ChildID>
    <Name>One</Name>
    <col1>bla1</col1>
    <col2>bla1</col2>
    <col3>bla1</col3>
  </row>
  <row>
    <ChildID id="2">2</ChildID>
    <ParentID pid="1">1</ParentID>
    <Name>Two</Name>
    <col1>bla2</col1>
    <col2>bla2</col2>
    <col3>bla2</col3>
  </row>
  <row>
    <ChildID id="3">3</ChildID>
    <ParentID pid="2">2</ParentID>
    <Name>Three</Name>
    <col1>bla3</col1>
    <col2>bla3</col2>
    <col3>bla3</col3>
  </row>
  <row>
    <ChildID id="4">4</ChildID>
    <ParentID pid="3">3</ParentID>
    <Name>Four</Name>
    <col1>bla4</col1>
    <col2>bla4</col2>
    <col3>bla4</col3>
  </row>
  <row>
    <ChildID id="5">5</ChildID>
    <ParentID pid="1">1</ParentID>
    <Name>Five</Name>
    <col1>bla5</col1>
    <col2>bla5</col2>
    <col3>bla5</col3>
  </row>
  <row>
    <ChildID id="6">6</ChildID>
    <ParentID pid="4">4</ParentID>
    <Name>Six</Name>
    <col1>bla6</col1>
    <col2>bla6</col2>
    <col3>bla6</col3>
  </row>
  <row>
    <ChildID id="7">7</ChildID>
    <ParentID pid="4">4</ParentID>
    <Name>Seven</Name>
    <col1>bla7</col1>
    <col2>bla7</col2>
    <col3>bla7</col3>
  </row>
  <row>
    <ChildID id="8">8</ChildID>
    <ParentID pid="7">7</ParentID>
    <Name>Eight</Name>
    <col1>bla8</col1>
    <col2>bla8</col2>
    <col3>bla8</col3>
  </row>
  <row>
    <ChildID id="9">9</ChildID>
    <ParentID pid="3">3</ParentID>
    <Name>Nine</Name>
    <col1>bla9</col1>
    <col2>bla9</col2>
    <col3>bla9</col3>
  </row>
  <row>
    <ChildID id="10">10</ChildID>
    <ParentID pid="9">9</ParentID>
    <Name>Ten</Name>
    <col1>bla10</col1>
    <col2>bla10</col2>
    <col3>bla10</col3>
  </row>
</root> 


into

<html>
  <head>
    <META http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <ul>
    
    One
    bla1
    bla1
    bla1
  
    
    1
    Two
    bla2
    bla2
    bla2
  
    
    2
    Three
    bla3
    bla3
    bla3
  
    
    3
    Four
    bla4
    bla4
    bla4
  
    
    1
    Five
    bla5
    bla5
    bla5
  
    
    4
    Six
    bla6
    bla6
    bla6
  
    
    4
    Seven
    bla7
    bla7
    bla7
  
    
    7
    Eight
    bla8
    bla8
    bla8
  
    
    3
    Nine
    bla9
    bla9
    bla9
  
    
    9
    Ten
    bla10
    bla10
    bla10
  </ul>
  </body>
</html>

-----Original Message-----
From: Michael Kay [mailto:mike(_at_)saxonica(_dot_)com] 
Sent: February 13, 2007 9:13 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] Transforming tabular information to hierarchical


Write a stylesheet that has the same structure as a normal one: start with a
template that processes the root node, and call apply-templates when you
want to process its children. The only difference is that the children are
not physical XML children, but logical children found by using a key. Define
a key for nodes based on the ParentID property, and to find the logical
children of a node, use key('parentKey', @ID).

Michael Kay
http://www.saxonica.com/
 

-----Original Message-----
From: Simon Shutter [mailto:simon(_at_)schemax(_dot_)com]
Sent: 13 February 2007 16:32
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Transforming tabular information to hierarchical

If I have a tabular data set that defines parent-child relationships, 
is it possible to transform this into a hierarchical tree format using 
XSLT?

eg source:

ID    ParentID        Name    col1    col2    col3
1     null            One     bla1    bla1    bla1
2     1               Two     bla2    bla2    bla2
3     2               Three   bla3    bla3    bla3
4     3               Four    bla4    bla4    bla4
5     1               Five    bla5    bla5    bla5
6     4               Six     bla6    bla6    bla6
7     4               Seven   bla7    bla7    bla7
8     7               Eight   bla8    bla8    bla8
9     3               Nine    bla9    bla9    bla9
10    9               Ten     bla10   bla10   bla10

desired output:

<?xml version="1.0" encoding="utf-8"?> <ul id='root' 
xmlns:bla="http://www.blablabla.com/bla";>
  <li id='1' bla:col1='bla1' bla:col2='bla1' bla:col3='bla1'>
    One
    <ul>
      <li bla:col1='bla2' bla:col2='bla2' bla:col3='bla2'>
        Two
        <ul>
        <li bla:col1='bla3' bla:col2='bla3' bla:col3='bla3' />Three
        <ul>
          <li id='4' bla:col1='bla4' bla:col2='bla4' 
bla:col3='bla4' />Four
          <ul>
            <li id='6' bla:col1='bla6' bla:col2='bla6'
bla:col3='bla6'>Six</li>
            <li id='7' bla:col1='bla7' bla:col2='bla7' 
bla:col3='bla7'>
              Seven
              <ul>
                <li id='8' bla:col1='bla8' bla:col2='bla8'
bla:col3='bla8'>Eight</li>
              </ul>
            </li>
          </ul>
          <li id='9' bla:col1='bla9' bla:col2='bla9' bla:col3='bla9'>
            Nine
            <ul>
              <li id='10' bla:col1='bla10' bla:col2='bla10'
bla:col3='bla10'>Ten</li>
            </ul>
          </li>
        </ul>
      </ul>
      </li>
      <li id='5' bla:col1='bla5' bla:col2='bla5' 
bla:col3='bla5'>Five</li>
    </ul>
  </li>
</ul>


Thanks, Simon


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--