This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Finding the maximum depth from a node
- From: Dimitre Novatchev <dnovatchev at yahoo dot com>
- To: xsl-list at lists dot mulberrytech dot com
- Date: Fri, 10 May 2002 13:11:20 -0700 (PDT)
- Subject: [xsl] Re: Finding the maximum depth from a node
- Reply-to: xsl-list at lists dot mulberrytech dot com
"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