xsl-list
[Top] [All Lists]

Re: [xsl] Find the node with maximum elements

2007-11-04 05:46:15
Hi Mike,
  Thanks for your observations.

The following solution is likely more efficient than Ken's (because,
it calculates 'max' only once):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="2.0">

 <xsl:output method="text" />

 <xsl:template match="/Sample">
   <xsl:variable name="max-count" select="max(*/count(Car))" />
   <xsl:for-each select="*">
     <xsl:if test="count(Car) = $max-count">
       <xsl:value-of select="local-name()" /><xsl:text> </xsl:text>
     </xsl:if>
   </xsl:for-each>
 </xsl:template>

</xsl:stylesheet>


On 11/4/07, Michael Kay <mike(_at_)saxonica(_dot_)com> wrote:
Yes, I read the requirement "return the node", not the example "return Honda
and Mitsubishi".

The solution *[count(*) = max(current()/*/count(*))] is easy to write, but
it's very dependent on optimization. Saxon will move the condition
max(current()/*/count(*)) out of the loop if it's written this way, but not
if it's written *[count(*) = max(../*/count(*))]. Even if the max() is
calculated outside the loop, you're visiting each node twice and calculating
the "key" (count(*) twice for each node. Hence the slight preference for the
sorting approach.

The most efficient solution is probably a recursive function, but that's not
the easiest to write. It really calls out for a higher-order function along
the lines of saxon:highest().

Michael Kay
http://www.saxonica.com/


-- 
Regards,
Mukul Gandhi

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--