[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
Re: [xsl] max string-length for context grandchildren
Subject: Re: [xsl] max string-length for context grandchildren From: Michel Hendriksen <michel.hendriksen@xxxxx> Date: Wed, 5 Oct 2011 10:39:36 +0200 |
<xsl:variable name="longest-label" select="max(string-length(deflist/label))"/> seems to have a typo: "deflist" which makes for the zero result. Might not be the only problem as compared to solutions of the others. Michel On Wed, Oct 5, 2011 at 7:23 AM, Dimitre Novatchev <dnovatchev@xxxxxxxxx> wrote: >> I'm trying to determine which of the three <label> elements >> is the longest, so my desired output is: 14, which is the string >>length of list/defitem/label[2]. The calculation needs to be made >> while <list> is the context node > > Use: > > max(defitem/label/string-length()) > > The result is: 14 > > > > > > -- > Cheers, > Dimitre Novatchev > --------------------------------------- > Truly great madness cannot be achieved without significant intelligence. > --------------------------------------- > To invent, you need a good imagination and a pile of junk > ------------------------------------- > Never fight an inanimate object > ------------------------------------- > You've achieved success in your field when you don't know whether what > you're doing is work or play > ------------------------------------- > Facts do not cease to exist because they are ignored. > ------------------------------------- > I finally figured out the only reason to be alive is to enjoy it. > > > > > On Tue, Oct 4, 2011 at 7:08 PM, Eric Harbeson > <kiteeatingtree@xxxxxxxxxxxxx> wrote: >> Dear all, >> >> I am trying to determine the length of the longest string of a given element, which is the grand-child of the context node. I've looked all over the archives and haven't found anything that I can get to work (possibly an indictment of my searching skills). So I'm hoping a kind soul will take pity and help me. >> >> Details first: I'm using XSLT 2.0, though a 1.0 solution would be fine too. I've tried processing using Saxon [PE | HE | EE] 9.3.0.5, as contained in oXygen 12.2. >> >> >> I have the following XML: >> >> <record> >> <list type="deflist"> >> <head>This is a test list</head> >> <defitem> >> <label>Processed by</label> >> <item>Lynette Stoudt</item></defitem> >> <defitem> >> <label>Date Completed</label> >> <item>February 1999</item></defitem> >> <defitem> >> <label>Encoded by</label> >> <item>William Landis</item> >> </defitem> >> </list> >> </record> >> >> I'm trying to determine which of the three <label> elements is the longest, so my desired output is: 14, which is the string length of list/defitem/label[2]. The calculation needs to be made while <list> is the context node. I've tried two different approaches: >> >> 1) It seems to me that it should be possible to do something like this: >> >> <xsl:template match="list"> >> <template match="list"> >> <xsl:variable name="longest-label" select="max(string-length(deflist/label))"/> >> <xsl:value-of select="$longest-label"/> >> </template> >> </xsl:template> >> >> ...but this returns the number zero. >> >> 2) The closest thing I've found to an answer is the dual parameter solution recommended by Michael Kay and as implemented by Phil Lanch on the dpawson FAQ site (http://www.dpawson.co.uk/xsl/sect2/N8090.html#d10874e649 (#16: How to find the longest node in a node-set)). >> >> My implementation of that (which follows) generates the following error, which I can't explain: "Required item type of first operand of '<' is numeric; supplied value has item type xs:string." >> >> <xsl:template match="list"> >> <xsl:variable name="longest-label"> >> <xsl:call-template name="getlongest"> >> <xsl:with-param name="nodeset" select="defitem/label"/> >> <xsl:with-param name="longest"/> >> </xsl:call-template> >> </xsl:variable> >> <xsl:text>LongestLabel </xsl:text><xsl:value-of select="$longest-label"></xsl:value-of> >> </xsl:template> >> >> <xsl:template name="getlongest"> >> <xsl:param name="nodeset"/> >> <xsl:param name="longest" select="0"/> >> <xsl:choose> >> <xsl:when test="$nodeset"> >> <xsl:choose> >> <xsl:when test="string-length($nodeset[1]) > $longest"> >> <xsl:call-template name="getlongest"> >> <xsl:with-param name="nodeset" select="$nodeset[position() > 1]"/> >> <xsl:with-param name="longest" select="string-length($nodeset[1])"/> >> </xsl:call-template> >> </xsl:when> >> <xsl:otherwise> >> <xsl:call-template name="getlongest"> >> <xsl:with-param name="nodeset" select="$nodeset[position() > 1]"/> >> <xsl:with-param name="longest" select="$longest"/> >> </xsl:call-template> >> </xsl:otherwise> >> </xsl:choose> >> </xsl:when> >> <xsl:otherwise> >> <xsl:value-of select="$longest"/> >> </xsl:otherwise> >> </xsl:choose> >> </xsl:template> >> >> I can't actually find the "<" that is at issue here. When debugging, I noted that the value of $nodeset is never a number, but some thing like "<label><label><label>", though I can't see why. >> >> Any thoughts would be very appreciated. >> >> With thanks in advance, >> Eric Harbeson
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] max string-length for con, Dimitre Novatchev | Thread | Re: [xsl] max string-length for con, Andrew Welch |
[xsl] Define internal xsl variable, Susanne Wunsch | Date | Re: [xsl] Define internal xsl varia, Michael Kay |
Month |