[xsl] Re: The longest node in a node set

Subject: [xsl] Re: The longest node in a node set
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Thu, 18 Jul 2002 11:25:08 -0700 (PDT)
--- Antonio Fiol Bonnín <fiol at w3ping dot com> wrote:

> Hello,
> 
> I am trying to find an XPath expression that gives me the longest
> element in a node set.
> 
> I know how to do that for an attribute. e.g //element[not(@attr &lt;
> following-sibling::element/@attr)]
> 
> But how can I do that for the string-length(element).
> 
> I tried //element[not(string-length(.) &lt;
> string-length(following-sibling::element))]
> 
> But this obviously does not work, because following-sibling::element
> is
> not an element or string, but a node-set.
> 
> Any ideas?
> 
> (I think this one is for Michael Kay... Am I wrong?)
> 
> Thank you very much.
> 
> 
> Antonio Fiol


Hi Antonio,

Just use -- simply, mechanically -- the maximum() function from FXSL:

Sample source xml:
-----------------

<t>
 <e1>abc</e1>
 <e2>a</e2>
 <e3>abcdef</e3>
 <e4>abcd</e4>
 <e5>ab</e5>
 <e6>abcde</e6>
</t>

Transformation:
--------------

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:myLengthCompare="f:myLengthCompare" 
exclude-result-prefixes="xsl myLengthCompare"
>
   <xsl:import href="maximum.xsl"/>
 <!-- This transformation must be applied to:
        testMaximum3.xml                     
-->  
   <myLengthCompare:myLengthCompare/>
   
   <xsl:output omit-xml-declaration="yes"/>
    <xsl:template match="/">
    
    <xsl:variable name="vFunCompLength"
         select="document('')/*/myLengthCompare:*[1]"/>
    
      <xsl:call-template name="maximum">
        <xsl:with-param name="pList" select="/*/*"/>
        <xsl:with-param name="pCMPFun" select="$vFunCompLength"/>
      </xsl:call-template>
    </xsl:template>
    
    <xsl:template match="myLengthCompare:*">
      <xsl:param name="arg1" select="/.."/>
      <xsl:param name="arg2" select="/.."/>
      
      <xsl:if test="string-length($arg1) 
                   > 
                    string-length($arg2)">1</xsl:if>
    </xsl:template>
</xsl:stylesheet>

Result:
------
<e3>abcdef</e3>


Hope this helped.




=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL

__________________________________________________
Do You Yahoo!?
Yahoo! Autos - Get free new car price quotes
http://autos.yahoo.com

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


Current Thread