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

Re: Finding the maximum depth from a node

Subject: Re: Finding the maximum depth from a node
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Fri, 10 May 2002 13:11:20 -0700 (PDT)
maximum folder depth
"Dave Townsend" <dave at brass-bullet dot co dot uk> wrote:

> Ok, I have basically almost a file structure in an xml document, 
> something like this:
> 
> <root>
> 	<folder name="1">
> 		<folder name="2"/>
> 		<folder name="3">
> 			<folder name="4"/>
> 		</folder>
> 	<folder name="5">
> 		<folder name="6">
> 			<folder name="7">
> 				<folder name="8"/>
> 			</folder>
> 		</folder>
> 	</folder>
> </root>

This is not well-formed xml -- I had to touch it a little.

> I need to be able to find out how deep the nodes go, i.e. when the 
> template has matched root, I need to work out how deep the deepest 
> folder is (folder 8 in this case). I know how to calculate a depth 
> from a nodes context, but not the depth of its children.
> 
> Anybody got any ideas. I'm quite new to XSL so chances are I've
missed
> something obvious, but I have searched the faq and the list archive 
> and found nothing helpful.

Here's a very simple solution -- use FXSL and its maximum()
function/template. Pass to it the list of "folder" nodes and a
reference to your comparison function, which will return 1 if the
"name" attribute of the first argument is bigger than the name
attribute of the second argument.

Here's the complete code:

corrected xml document:
----------------------
<root>
	<folder name="1">
		<folder name="2"/>
		<folder name="3">
			<folder name="4"/>
		</folder>
  </folder>
	<folder name="5">
		<folder name="6">
			<folder name="7">
				<folder name="8"/>
			</folder>
		</folder>
	</folder>
</root>

stylesheet:
----------
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:myDepthCompare="f:myDepthCompare" 
exclude-result-prefixes="xsl myDepthCompare"
>
   <xsl:import href="maximum.xsl"/>
   
   <myDepthCompare:myDepthCompare/>
   
   <xsl:output omit-xml-declaration="yes"/>
    <xsl:template match="/">
    
    <xsl:variable name="vFunCompDepth"
         select="document('')/*/myDepthCompare:*[1]"/>
    
      <xsl:call-template name="maximum">
        <xsl:with-param name="pList" select="//folder"/>
        <xsl:with-param name="pCMPFun" select="$vFunCompDepth"/>
      </xsl:call-template>
    </xsl:template>
    
    <xsl:template match="myDepthCompare:*">
      <xsl:param name="arg1" select="/.."/>
      <xsl:param name="arg2" select="/.."/>
      
      <xsl:if test="$arg1/@name > $arg2/@name">1</xsl:if>
    </xsl:template>
</xsl:stylesheet>

Result:
------
<folder name="8" />


Cheers,
Dimitre Novatchev.



__________________________________________________
Do You Yahoo!?
Yahoo! Shopping - Mother's Day is May 12th!
http://shopping.yahoo.com

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


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.