xsl-list
[Top] [All Lists]

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

2005-05-03 02:13:37

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

--~------------------------------------------------------------------
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>
--~--





--~------------------------------------------------------------------
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>
--~--



<Prev in Thread] Current Thread [Next in Thread>