This is the mail archive of the xsl-list@mulberrytech.com 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
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


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