[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: SQL BTree to XML Tree?

Subject: RE: SQL BTree to XML Tree?
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 18 Jan 2006 10:57:36 -0000
descendants sql
> I'm storing a btree in sql in the following manner:
> 
> +----------------------------+
> | Table: Departments         |
> +----------------------------+
> | id | name        | lh | rh |
> +----------------------------+
> | 1  | Managers    | 1  | 6  |
> | 2  | Supervisors | 2  | 5  |
> | 3  | Employees   | 3  | 4  |
> | 4  | Directors   | 7  | 8  |
> +----------------------------+
> 

The Celko technique. Illustrating the lengths people will go to to bend
their data to make it fit in a relational database!


> This is being converted to xml, resulting in:
> 
> <output>
>   <item>
>     <id>1</id>
>     <name>Managers</name>
>     <lh>1</lh>
>     <rh>2</rh>
----------^ should be 6, I assume
>   </item>
> <!-- etc -->
> </output>
> 
> I need to translate this using XSL to this:
> 
> <group>
>   <department title="Managers">
>     <department title="Supervisors" />
>     <department title="Employees" />
>   </department>
>   <department title="Directors" />
> </group>
> 

May not be very efficient, but what comes to mind is that your data gives
you the descendant relationship very easily:

<xsl:function name="f:descendants" as="element(item)*">
  <xsl:param name="boss" as="element(item)"/>
  <xsl:sequence select="$boss/../item[lh gt $boss/lh and rh le $boss/rh]"/>
</xsl:function>

and you can deduce from this the child relationship (as being those
descendants who are not descendants of a descendant):

<xsl:function name="f:children" as="element(item)*">
  <xsl:param name="boss" as="element(item)"/>
  <xsl:variable name="descendants" select="f:descendants($boss)
  <xsl:sequence select="$descendants except 
         (for $i in $descendants return f:descendant($i))"/>
</xsl:function>

and then you can do a recursive descent using the logical child relationship
in the usual way:

<xsl:template match="item">
  <department title="@name">
    <xsl:apply-templates select="f:children(.)"/>
  </department>
</xsl:template>

Not tested and almost certainly needs a bit of fine tuning. And of course if
you're in XSLT 1.0 you'll have to rewrite the algorithm completely.

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

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.