XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
todd jacksonSubject: check all parent node groups sibling nodes for date attrbute expired
Author: todd jackson
Date: 05 Jul 2009 03:44 AM
Originally Posted: 05 Jul 2009 12:25 AM
hi , I output a list courses which have their class timeslots, I group these all under their respective campus locations, and I only display their timeslots if they are scheduled later than the date the xslt is run.

I need to display a notification e.g. "No courses have been scheduled at this time" only if all the course occurrence start dates for a campus have expired.

Could anyone suggest an xpath query that could achieve this

xml source;
.....
<COURSEOCCURRENCES>
<COURSEOCCURRENCE>
<OCCURRENCE_CODE>182.023-091B</OCCURRENCE_CODE>
<START_DATE>02/07/2009</START_DATE>
<ENDDATE>24/07/2009</ENDDATE>
<CAMPUS>Parnell</CAMPUS>
<ACTIVITYOCCURRENCES>
<ACTIVITYOCCURRENCE>
<ACTIVITY_CODE>182.023-091B-S01-01</ACTIVITY_CODE>
<START_DATE>02/07/2009</START_DATE>
<END_DATE>04/07/2009</END_DATE>
<STATUS>Live</STATUS>
<SUBSTATUS>Running</SUBSTATUS>
<TIMESLOTS>
<TIMESLOT>
<START_TIME>02 July 2009, 09:00:00</START_TIME>
<END_TIME>02 July 2009, 12:00:00</END_TIME>
</TIMESLOT>
<TIMESLOT>
<START_TIME>03 July 2009, 09:00:00</START_TIME>
<END_TIME>03 July 2009, 12:00:00</END_TIME>
</TIMESLOT>
<TIMESLOT>
<START_TIME>04 July 2009, 09:00:00</START_TIME>
<END_TIME>04 July 2009, 12:00:00</END_TIME>
</TIMESLOT>
</TIMESLOTS>
</ACTIVITYOCCURRENCE>
</ACTIVITYOCCURRENCES>
</COURSEOCCURRENCE>
<COURSEOCCURRENCE>
<OCCURRENCE_CODE>182.023-091B</OCCURRENCE_CODE>
<START_DATE>10/06/2009</START_DATE>
<ENDDATE>24/06/2009</ENDDATE>
<CAMPUS>Parnell</CAMPUS>
<ACTIVITYOCCURRENCES>
<ACTIVITYOCCURRENCE>
<ACTIVITY_CODE>182.023-091B-S01-01</ACTIVITY_CODE>
<START_DATE>10/06/2009</START_DATE>
<END_DATE>24/06/2009</END_DATE>
<STATUS>Live</STATUS>
<SUBSTATUS>Running</SUBSTATUS>
<TIMESLOTS>
<TIMESLOT>
<START_TIME>10 June 2009, 09:00:00</START_TIME>
<END_TIME>10 June 2009, 12:00:00</END_TIME>
</TIMESLOT>
<TIMESLOT>
<START_TIME>17 June 2009, 09:00:00</START_TIME>
<END_TIME>17 June 2009, 12:00:00</END_TIME>
</TIMESLOT>
<TIMESLOT>
<START_TIME>24 June 2009, 09:00:00</START_TIME>
<END_TIME>24 June 2009, 12:00:00</END_TIME>
</TIMESLOT>
</TIMESLOTS>
</ACTIVITYOCCURRENCE>
</ACTIVITYOCCURRENCES>
</COURSEOCCURRENCE>
<COURSEOCCURRENCE>
<OCCURRENCE_CODE>182.023-091B</OCCURRENCE_CODE>
<START_DATE>10/09/2009</START_DATE>
<ENDDATE>24/09/2009</ENDDATE>
<CAMPUS>Glenbrook</CAMPUS>
<ACTIVITYOCCURRENCES>
<ACTIVITYOCCURRENCE>
<ACTIVITY_CODE>182.023-091B-S01-01</ACTIVITY_CODE>
<START_DATE>10/08/2009</START_DATE>
<END_DATE>24/08/2009</END_DATE>
<STATUS>Live</STATUS>
<SUBSTATUS>Running</SUBSTATUS>
<TIMESLOTS>
<TIMESLOT>
<START_TIME>10 August 2009, 09:00:00</START_TIME>
<END_TIME>10 August 2009, 12:00:00</END_TIME>
</TIMESLOT>
<TIMESLOT>
<START_TIME>17 August 2009, 09:00:00</START_TIME>
<END_TIME>17 August 2009, 12:00:00</END_TIME>
</TIMESLOT>
</TIMESLOTS>
</ACTIVITYOCCURRENCE>
</ACTIVITYOCCURRENCES>
</COURSEOCCURRENCE>
</COURSEOCCURRENCES>

XSLT extract;
........
<p><span class="Subhead3">Dates and Times</span></p>

<!-- The Muenchian Method -->
<xsl:for-each select="COURSEDEFINITION/COURSEOCCURRENCES/COURSEOCCURRENCE[count(. | key('courseoccurrences-by-campus', CAMPUS)[1]) = 1]">
<xsl:sort select="CAMPUS" />

<div class="Subhead0"><xsl:value-of select="CAMPUS" /></div>

<xsl:apply-templates select="key('courseoccurrences-by-campus', CAMPUS)"/>

</xsl:for-each>


<xsl:template match="COURSEOCCURRENCE">

<xsl:if test="((php:function('dateUnixFormated', string(./START_DATE)) >= $currUDate) and ((./TIMETABLE) or (./ACTIVITYOCCURRENCES/ACTIVITYOCCURRENCE//TIMESLOTS/TIMESLOT)))">

<div class="tmslthr"><hr /></div>
<xsl:for-each select="ACTIVITYOCCURRENCES/ACTIVITYOCCURRENCE/TIMESLOTS/TIMESLOT">

<div id="dtwrappernb">

<div id="dtcontainer">
<div id="dtheader">
<span class="Subhead4"><xsl:value-of select="php:function('date', 'l', php:function('strtotime', substring-before(./START_TIME,',')))"/></span>
</div>
<div id="dtside-a">
<xsl:value-of select="substring-before(./START_TIME,',')"/>
</div>
<div id="dtside-b">



<xsl:value-of select="php:function('date', 'g:i', php:function('strtotime', php:function('trim', substring-after(./START_TIME,','))))"/> - <xsl:value-of select="php:function('date', 'g:ia', php:function('strtotime', php:function('trim', substring-after(./END_TIME,','))))"/>
</div>

</div>
</div>

</xsl:for-each>

</xsl:if>

</xsl:template>


xhtml output;

Dates and Times

Parnell
--------------------------------------------
No courses have been scheduled at this time

Glenbrook
--------------------------------------------
Monday 10 August 2009 9:00 - 12:30pm

Monday 17 August 2009 9:00 - 12:30pm

.........


I need to check all the occurrences for each campus and check all the start dates for each course occurence if these are older than date the xslt is run then I need to output the "no courses.." message.

I'm not sure how to do this with the The Muenchian Method of grouping?

I was thinking there could be an xpath query that could test for this in a choose when otherwise block.

Hope someone can help. Cheers.

Posttop
todd jacksonSubject: check all parent node groups sibling nodes for date attrbute expired
Author: todd jackson
Date: 06 Jul 2009 09:39 AM
This was tricky, the best that I could come with was to define a template and pass the distinct campus name to the template and dynamically define an xpath query which will count all the start_date nodes listed under each campus which has a start_date greater than the run date of xslt (as this is run as a batch script daily);

hence my template is;

<xsl:template name="CampusTSCnt">
<xsl:param name="camp"/>
<xsl:param name="validtscnt"/>
<xsl:param name="inc" select="0"/>

<xsl:choose>
<xsl:when test="$inc &lt; 1">
<xsl:variable name="query" select="count(/COURSEDEFINITION/COURSEOCCURRENCES/COURSEOCCURRENCE[CAMPUS=$camp]/START_DATE[(php:function('dateUnixFormated', string(.)) >= $currUDate)])"/>

<xsl:call-template name="CampusTSCnt">
<xsl:with-param name="validtscnt" select="$query"/>
<xsl:with-param name="inc" select="$inc + 1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$validtscnt = 0">
<p>There are no available courses scheduled at this time</p>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="key('courseoccurrences-by-campus', CAMPUS)"/>
</xsl:otherwise>
</xsl:choose>
<!--<xsl:value-of select="$validtscnt"/>-->
</xsl:otherwise>
</xsl:choose>
</xsl:template>

user defined template is called from the place in the xslt where I use the Muenchian Method for grouping each course_occurrence by campus

<xsl:for-each select="COURSEDEFINITION/COURSEOCCURRENCES/COURSEOCCURRENCE[count(. | key('courseoccurrences-by-campus', CAMPUS)[1]) = 1]">
<xsl:sort select="CAMPUS" />
<div class="Subhead0"><xsl:value-of select="CAMPUS" /></div>
<xsl:call-template name="CampusTSCnt">
<xsl:with-param name="camp" select="CAMPUS"/>
</xsl:call-template>


</xsl:for-each>

Using the keys defined at the top of the xslt page & called from the 'CampusTSCnt' template which then calls the 'COURSEOCCURRENCE' template if for each campus at least one current start-date is found for every course_occurrence in the source tree, and displays the time slots or timetable nodes for each respective campus.

<xsl:template match="COURSEOCCURRENCE">

<xsl:if test="((php:function('dateUnixFormated', string(./START_DATE)) >= $currUDate) and ((./TIMETABLE) or (./ACTIVITYOCCURRENCES/ACTIVITYOCCURRENCE//TIMESLOTS/TIMESLOT)))">


<xsl:choose>
<xsl:when test="./TIMETABLE">
<div id="dtwrapper">

<div id="dtcontainer">

<div id="dtside-ab">

<xsl:copy-of select="php:function('CreateTxtNode::tok2htmltag', string(./TIMETABLE))"/>
</div>

<xsl:if test="contains(php:function('strtolower', string(./ALLOW_WEB_ENROL)), 'true')">
<xsl:call-template name="ALLOW_WEB_ENROL"/>
</xsl:if>

</div>
</div>

</xsl:when>

<xsl:otherwise>
<div class="tmslthr"><hr /></div>
<xsl:for-each select="ACTIVITYOCCURRENCES/ACTIVITYOCCURRENCE/TIMESLOTS/TIMESLOT">

<div id="dtwrappernb">

<div id="dtcontainer">
<div id="dtheader">
<span class="Subhead4"><xsl:value-of select="php:function('date', 'l', php:function('strtotime', substring-before(./START_TIME,',')))"/></span>
</div>
<div id="dtside-a">
<xsl:value-of select="substring-before(./START_TIME,',')"/>
</div>
<div id="dtside-b">



<xsl:value-of select="php:function('date', 'g:i', php:function('strtotime', php:function('trim', substring-after(./START_TIME,','))))"/> - <xsl:value-of select="php:function('date', 'g:ia', php:function('strtotime', php:function('trim', substring-after(./END_TIME,','))))"/>
</div>

<xsl:if test="contains(php:function('strtolower', string(../../../../ALLOW_WEB_ENROL)), 'true')">
<xsl:call-template name="ALLOW_WEB_ENROL"/>
</xsl:if>

</div>
</div>


</xsl:for-each>

</xsl:otherwise>

</xsl:choose>
</xsl:if>

</xsl:template>

I'm just posting here for my future reference, also hope this helps someone. Maybe somebody can point out a more elegant solution, as i've only tested on one course this may not run well on 250+ courses.

 
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.