RE: if a condition is not met
Very pretty. I was thinking in terms of grouping, time arithmetic, min/max... Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: George Cristian Bina [mailto:george@xxxxxxxxxxxxx] > Sent: 15 May 2007 16:09 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: Re: if a condition is not met > > Here it is a 1.0 solution, it walks on the time elements and > copies the ones that do not start cell, then it skips the > ones that start a cell and are inside that cell: > > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > <xsl:output indent="yes"/> > <xsl:key name="cellByStartTime" match="cell" use="@startTime"/> > <xsl:key name="time" match="time" use="@time"/> > > <xsl:template match="/*"> > <free> > <xsl:apply-templates select="times/time"/> > </free> > </xsl:template> > > <xsl:template match="time"> > <xsl:variable name="cell" > select="key('cellByStartTime', @time)"/> > <xsl:choose> > <xsl:when test="$cell"><xsl:apply-templates > select="key('time', $cell/@endTime)"/></xsl:when> > <xsl:otherwise><xsl:copy-of > select="."/><xsl:apply-templates > select="following-sibling::time"/></xsl:otherwise> > </xsl:choose> > </xsl:template> > <xsl:template match="time[position()=last()]"/> </xsl:stylesheet> > > Regards, > George > --------------------------------------------------------------------- > George Cristian Bina - http://aboutxml.blogspot.com/ > <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger > http://www.oxygenxml.com > > > David J Birnbaum wrote: > > Dear xsl-list, > > > > I've run into a blind spot with an XSLT problem, and I was > wondering > > whether someone might be able to advise. Here's the problem: > > > > I have a set of times and set of people scheduled at different time > > ranges, e.g.: > > > > <times> > > <time time="t1100">11:00</time> > > <time time="t1130">11:30</time> > > <time time="t1200">12:00</time> > > <time time="t1230">12:30</time> > > <time time="t0100">1:00</time> > > <time time="t0130">1:30</time> > > <time time="t0200">2:00</time> > > <time time="t0230">2:30</time> > > <time time="t0300">3:00</time> > > <time time="t0330">3:30</time> > > <time time="t0400">4:00</time> > > <time time="t0430">4:30</time> > > <time time="t0500">5:00</time> > > </times> > > <cells> > > <cell startTime="t1100" endTime="t0100">Marquette</cell> > > <cell startTime="t0200" endTime="t0300">Birnbaum</cell> > > <cell startTime="t0300" endTime="t0400">Konsko</cell> > > <cell startTime="t0400" endTime="t0500">Frasier</cell> > > </cells> > > > > The <time> elements denote half-hour blocks, with only the > beginning > > specified in a "time" attribute (since the end is predictable by > > grabbing the "time" attribute of the immediately following sibling; > > there isn't a real 5:00 block, and that element exists only > because it > > defines the end of the 4:30 block). The <cell> elements > indicate who > > works at which time, with the time spans expressed in human > terms. In > > other words, that Marquette works from t1100-t0100 (in the attribute > > values) means that she works in the 11:00-11:30, 11:30-12:00, > > 12:00-12:30, and 12:30-1:00 time blocks (but not the > 1:00-1:30 one). > > One rule for this schedule is that no time assignments can > overlap, so > > if (for example) Marquette is scheduled between 11:00 and > 1:00, I can > > be confident that nobody else will be scheduled then. > > > > I need to walk through the list of times and determine for each one > > whether someone is scheduled then or not. I can do an > <xsl:for-each> > > over the time elements to examine each one in turn, of > course, but I > > can't seem to figure out an elegant strategy for > determining which are > > *not* busy (determining which are busy is easier; see > below). I need > > to treat start times differently fom spanned times (that is, if > > someone works from 11:00-1:00, > > > > I need to do one thing with the 11:00 slot and something different > > with the 11:30, 12:00, and 12:30 slots) The start times for > the four > > cells in the example above (11:00, 2:00, 3:00, and 4:00) are easy > > because I can save the value of the "time" attribute (as something > > like variable > > "$inWhichTime") on each pass through the <time> loop and do an: > > > > <xsl:for-each select="cell"> > > <xsl:if test="./@startTime=$inWhichTime"> > > <!-- yes, a scheduling event starts at this time, so > the time is > > occupied --> > > </xsl:if> > > </xsl:for-each> > > > > The problem them, is with the spanned times, the ones that occur > > within but do not start an event. How do I find out whether no > > scheduling event is going on at 11:30 (for example)? I need to > > generate a result (but only one result) if the time is *not* > > scheduled, so I can't just loop over the four cells, > because if I do > > that I'll find that nothing is going on during three of > them and I'll > > generate three results, instead of the one I need. What I > want to do in pseudo-code is: > > > > for each time element > > is there a cell that occurs during (but does not begin) that time? > > if any cell meets that condition, do nothing at all > within that > > pass through the time loop > > if no cell meets that condition, do something, but do it only > > once > > (total) during that pass through the time loop > > > > My intuition tells me that I may not be seeing the solution because > > I've conceptualized the problem badly, but I've been > banging on it for > > a couple of days now and it isn't getting any clearer. Any insights > > would be welcome! > > > > Thanks, > > > > David > > djbpitt+xml@xxxxxxxx
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