[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] Xpath - Selecting node that matches a min() condition within two attributes


Subject: RE: [xsl] Xpath - Selecting node that matches a min() condition within two attributes
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 3 May 2005 10:13:37 +0100

> I'm trying to select the right node from a nodeset that might 
> match the
> following condition :
> 
> Select node, such as (@X1 - @Size) is the smallest.
> 
> Here a sample XML :
> 
> <Nodeset>
> 	<Node number="1" X1="600" size="300"/>
> 	<Node number="2" X1="500" size="300"/>
> 	<Node number="3" X1="400" size="220"/>
> 	<Node number="4" X1="300" size="299"/>
> 	<Node number="5" X1="200" size="20"/>
> </Nodeset>
> 
> Here, it should select node @number = 4

Your example uses the min() function so I assume you are using XSLT 2.0.

In fact min() gives you the smallest of a set of values (e.g. numbers), not
the node that has that value. It's not working in your example because you
are applying it to a single value, not to a collection. 

So you want:

<xsl:variable name="nodes" select="Nodeset/Node"/>
<xsl:variable name="minX_ID" select="$nodes[min($nodes/(@X1 - @Size)) = (@X1
- @Size)]"/>

It's probably as easy to use the 1.0 technique which is to sort the nodes
and take the first:

<xsl:variable name="sorted-nodes" as="element()*">
  <xsl:perform-sort select="Nodeset/Node">
    <xsl:sort select="@X1 - @Size"/>
  </xsl:perform-sort>
</xsl:variable>

<xsl:variable name="minX_ID" select="$sorted-nodes[1]"/>

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


> 
> Here the XSL code I used, but seems not to be correct :
> 
> <xsl:variable name="minX_ID" select="Nodeset/Node[min(@X1 -
> @Size)]/@number"/>
> 
> Thanks for your help
> 
> Lawrence


Current Thread
Keywords