[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: max string-length for context grandchildren
> 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. B 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). B 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. B 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> > B B <list type="deflist"> > B B B B <head>This is a test list</head> > B B B B <defitem> > B B B B B B <label>Processed by</label> > B B B B B B <item>Lynette Stoudt</item></defitem> > B B B B <defitem> > B B B B B B <label>Date Completed</label> > B B B B B B <item>February 1999</item></defitem> > B B B B <defitem> > B B B B B B <label>Encoded by</label> > B B B B B B <item>William Landis</item> > B B B B </defitem> > B B </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]. B The calculation needs to be made while <list> is the context node. B I've tried two different approaches: > > 1) It seems to me that it should be possible to do something like this: > > B B <xsl:template match="list"> > B B B B <template match="list"> > B B B B B B <xsl:variable name="longest-label" select="max(string-length(deflist/label))"/> > B B B B B B <xsl:value-of select="$longest-label"/> > B B B B </template> > B B </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." > > B B <xsl:template match="list"> > B B B B <xsl:variable name="longest-label"> > B B B B B B <xsl:call-template name="getlongest"> > B B B B B B B B <xsl:with-param name="nodeset" select="defitem/label"/> > B B B B B B B B <xsl:with-param name="longest"/> > B B B B B B </xsl:call-template> > B B B B </xsl:variable> > B B B B <xsl:text>LongestLabel </xsl:text><xsl:value-of select="$longest-label"></xsl:value-of> > B B </xsl:template> > > B B <xsl:template name="getlongest"> > B B B B <xsl:param name="nodeset"/> > B B B B <xsl:param name="longest" select="0"/> > B B B B <xsl:choose> > B B B B B B <xsl:when test="$nodeset"> > B B B B B B B B <xsl:choose> > B B B B B B B B B B <xsl:when test="string-length($nodeset[1]) > $longest"> > B B B B B B B B B B B B <xsl:call-template name="getlongest"> > B B B B B B B B B B B B B B <xsl:with-param name="nodeset" B select="$nodeset[position() B > 1]"/> > B B B B B B B B B B B B B B <xsl:with-param name="longest" select="string-length($nodeset[1])"/> > B B B B B B B B B B B B </xsl:call-template> > B B B B B B B B B B </xsl:when> > B B B B B B B B B B <xsl:otherwise> > B B B B B B B B B B B B <xsl:call-template name="getlongest"> > B B B B B B B B B B B B B B <xsl:with-param name="nodeset" B select="$nodeset[position() B > 1]"/> > B B B B B B B B B B B B B B <xsl:with-param name="longest" select="$longest"/> > B B B B B B B B B B B B </xsl:call-template> > B B B B B B B B B B </xsl:otherwise> > B B B B B B B B </xsl:choose> > B B B B B B </xsl:when> > B B B B B B <xsl:otherwise> > B B B B B B B B <xsl:value-of select="$longest"/> > B B B B B B </xsl:otherwise> > B B B B </xsl:choose> > B B </xsl:template> > > I can't actually find the "<" that is at issue here. B 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
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|