This is the mail archive of the mailing list .

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Finding the maximum depth from a node

"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
> 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:
	<folder name="1">
		<folder name="2"/>
		<folder name="3">
			<folder name="4"/>
	<folder name="5">
		<folder name="6">
			<folder name="7">
				<folder name="8"/>

<xsl:stylesheet version="1.0"
exclude-result-prefixes="xsl myDepthCompare"
   <xsl:import href="maximum.xsl"/>
   <xsl:output omit-xml-declaration="yes"/>
    <xsl:template match="/">
    <xsl:variable name="vFunCompDepth"
      <xsl:call-template name="maximum">
        <xsl:with-param name="pList" select="//folder"/>
        <xsl:with-param name="pCMPFun" select="$vFunCompDepth"/>
    <xsl:template match="myDepthCompare:*">
      <xsl:param name="arg1" select="/.."/>
      <xsl:param name="arg2" select="/.."/>
      <xsl:if test="$arg1/@name > $arg2/@name">1</xsl:if>

<folder name="8" />

Dimitre Novatchev.

Do You Yahoo!?
Yahoo! Shopping - Mother's Day is May 12th!

 XSL-List info and archive:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]