RE: [xsl] if a condition is not met

Subject: RE: [xsl] if a condition is not met
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 15 May 2007 18:16:26 +0100
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: [xsl] 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[1]"/>
>          </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[1]"/></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

Current Thread