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

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:
http://www.meetscoresonline.com/test_sched.html

XSLT:
http://www.meetscoresonline.com/test_sched.xsl

XML Source:
http://www.meetscoresonline.com/sched.xml


Karl


-----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)]"/>
</xsl:for-each>

Michael Kay


Current Thread
Keywords