Re: [xsl] Get an element with max. number of certain children element

Subject: Re: [xsl] Get an element with max. number of certain children element
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Fri, 18 Jan 2002 10:07:55 +0000
Hi Xiaocun,

> I have researched archive and been using Jeni's solution on getting
> the element with max. number of certain children element via
> xsl:sort.
>
> <xsl:variable name="maxAttachment">
>   <xsl:for-each select="LineItem">
>     <xsl:sort select="count(Attachment)" order="descending" />
>     <xsl:if test="position() = 1">
>       <xsl:value-of select="."/>
>     </xsl:if>
>   </xsl:for-each>
> </xsl:variable>
>
> Then I wish to use this variable later in:
> <xsl:for-each select="$maxAttachment/Attachment">
>   <xsl:text>,Name,URL,Description</xsl:text>
> </xsl:for-each>
>
> The problem seems that xsl:variable will not produce node-set, which
> I need. I am aware of the solutions (via recursion or temp node-set)
> that uses $maxAttachment as a number (count(Attachment)), but is
> there a more elegent solution that does not require
> processor-dependent extensions?

If by 'more elegant', you mean shorter, then I think that what you're
after is a way of finding the LineItem elements that contain the
$maxAttachment number of Attachment elements. You could do this with:

  <xsl:for-each select="LineItem[count(Attachment) = $maxAttachment][1]
                          /Attachment">
    <xsl:text>,Name,URL,Description</xsl:text>
  </xsl:for-each>

[Note that if there's more than one LineItem with the same (maximum)
number of Attachment children, then you'll get the first one in
document order.]
  
It's short, but it is not very efficient - not only do you have to go
through all the LineItem elements in order to work out what the
$maxAttachment is, you have to go through them all again, doing
exactly the same calculation on them, to work out whether they're the
one with the maximum number of attachments. But you might not care
about performance, I guess...

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/


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


Current Thread