RE: [xsl] Match nodes with a range of values

Subject: RE: [xsl] Match nodes with a range of values
From: "Karl J. Stubsjoen" <karl@xxxxxxxxxxxxxxxxxxxx>
Date: Thu, 15 Jul 2004 09:41:44 -0700
I would settle for:

1)  select all event nodes id=1
2)  pass off current() to a named template
3)  in a for-each loop, (identify, find, mark, return) the conflicting
times -- an ugly <xsl:choose> would suffice, or a simple <xsl:if> if that
works.  The XML source is not huge, and by examining each event by id makes
the source even smaller.

Does something like this seem reasonable?  What I don't need to do, is
return a document tree fragment.  (hope that made sense)

VISUALLY:  I might add a layer to my HTML source that is the presumed
overlapping / conflicting scheduled event.  I have uploaded a sample of what
I have so far here:

HTML Sample Result:


XML Source:


-----Original Message-----
From: Michael Kay [mailto:mhk@xxxxxxxxx]
Sent: Thursday, July 15, 2004 8:43 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: [xsl] Match nodes with a range of values

> "Select all nodes where current nodes timebeg falls between
> the timebeg and timeend of all event 1's".

You can do this in XPath 2 as

//node[every $n in //node[@id=1] satisfies
        (@timebeg ge $n/@timebeg and @timebeg le $n/@timeend)]

You can't do general joins in XPath 1 (it's not relationally complete). The
nearest you can get is

<xsl:for-each select="//node">
  <xsl:variable name="n" select="."/>
  <xsl:copy-of select="$n[not(//node[@id=1][@timebeg &lt;= $n/@timebeg or
                                            @timeget &gt;= $n/@timeend)]"/>

Michael Kay

Current Thread