Subject: [xsl] Re: Selecting previous node in newly-sorted group (not input document order) From: Tim Lebo <timleboxslt@xxxxxxxxx> Date: Fri, 27 Jan 2006 17:44:56 -0500 |
OBE. Solution: 2 <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 3 <xsl:output method="text"/> 4 5 <xsl:template match="/"> 6 <xsl:for-each-group select="//outline[@Start]" group-by="@Date"> 7 <xsl:value-of select="concat(current-grouping-key(),$NL)"/> 8 9 <xsl:variable name="todaysentries"> 10 <xsl:perform-sort select="current-group()"> 11 <xsl:sort select="substring-before(@Start,':')" data-type="number"/> 12 <xsl:sort select="substring-after(@Start,':')" data-type="number"/> 13 </xsl:perform-sort> 14 </xsl:variable> 15 16 <xsl:for-each select="$todaysentries/outline"> 17 <xsl:if test="position() > 1"> 18 <xsl:variable name="previousposition" select="position() - 1"/> 19 <xsl:variable name="previous" select="$todaysentries/outline[$previousposition]"/> 20 <xsl:value-of select="concat(@Date,' prev position ',$previousposition,' stopped ',$previous/@Stop, 21 ' current entry ',@Start,' ',@Stop,$NL)"/> 22 </xsl:if> 23 </xsl:for-each> 24 25 </xsl:for-each-group> 26 </xsl:template> 27 28 <xsl:variable name="NL"> 29 <xsl:text> 30 </xsl:text> 31 </xsl:variable> 32 33 </xsl:transform> On 1/27/06, Tim Lebo <timleboxslt@xxxxxxxxx> wrote: > I have task listings in OPML that looks like the following. I am > trying to write a transform that will point out temporal gaps existing > between the entries of a single day (e.g. 9:00 to 9:15 DNE in sample). > > I was making pretty good headway with the for-each-group and sort > constructs, which orders the entries just fine. However, I am unable > to select the previous node of the newly-ordered nodes. I think the > preceding-sibling axis on line 14 is looking back to the document > order and not the newly-ordered nodes. So, I tried to direct my scope > to the current-group with: > > 14 <xsl:variable name="previous" > select="$todaysentries/preceding-sibling::outline[position()=$previouspositio n]"/> > > But this selects more than one node. I also attempted a multivalue key > with @Date and @Stop to no avail. Does this require use of a sequence > constructor instead of the @use attribute? > > Thanks yet again, > Tim Lebo > > Input: > <?xml version="1.0" encoding="UTF-8"?> > <opml version="1.0"> > <body> > <outline text="2010.1.25"> > <outline text="task1" Date="2010.1.25" Start="7:00" Stop="8:00"/> > <outline text="task2" Date="2010.1.25" Start="8:00" Stop="9:00"/> > <outline text="skipped 15 minutes since last stop" > Date="2010.1.25" Start="9:15" Stop="9:30"/> > <outline text="multiple entries within an hour" Date="2010.1.25" > Start="9:30" Stop="9:45"/> > <outline text="multiple entries within an hour out of order" > Date="2010.1.25" Start="9:50" Stop="10:00"/> > <outline text="multiple entries within an hour" Date="2010.1.25" > Start="9:45" Stop="9:50"/> > <outline text="should be before first entry" Date="2010.1.25" > Start="6:00" Stop="7:00"/> > </outline> > </body> > </opml> > > XSLT 2.0 (Saxon8b): > 2 <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > version="2.0"> > 3 <xsl:output method="text"/> > 4 > 5 <xsl:template match="/"> > 6 <xsl:for-each-group select="//outline[@Start]" group-by="@Date"> > 7 <xsl:value-of select="concat(current-grouping-key(),$NL)"/> > 8 <xsl:variable name="todaysentries" select="current-group()"/> > 9 <xsl:for-each select="current-group()"> > 10 <xsl:sort select="substring-before(@Start,':')" > data-type="number"/> > 11 <xsl:sort select="substring-after(@Start,':')" > data-type="number"/> > 12 <xsl:if test="position() > 1"> > 13 <xsl:variable name="previousposition" select="position() - 1"/> > 14 <xsl:variable name="previous" > select="preceding-sibling::outline[position()=$previousposition]"/> > 15 <xsl:value-of select="concat(@Date,' prev position > ',$previousposition,' stopped ',$previous/@Stop, > 16 ' current entry > ',@Start,' ',@Stop,$NL)"/> > 17 </xsl:if> > 18 </xsl:for-each> > 19 </xsl:for-each-group> > 20 </xsl:template> > 21 > 22 <xsl:variable name="NL"> > 23 <xsl:text> > 24 </xsl:text> > 25 </xsl:variable> > 26 > 27 </xsl:transform> > > > Current Output: > 2010.1.25 > 2010.1.25 prev position 1 stopped current entry 7:00 8:00 > 2010.1.25 prev position 2 stopped current entry 8:00 9:00 > 2010.1.25 prev position 3 stopped current entry 9:15 9:30 > 2010.1.25 prev position 4 stopped current entry 9:30 9:45 > 2010.1.25 prev position 5 stopped 8:00 current entry 9:45 9:50 > 2010.1.25 prev position 6 stopped current entry 9:50 10:00 > > Desired Output: > 2010.1.25 > 2010.1.25 prev position 1 stopped 7:00 current entry 7:00 8:00 > 2010.1.25 prev position 2 stopped 8:00 current entry 8:00 9:00 > 2010.1.25 prev position 3 stopped 9:00 current entry 9:15 9:30 > 2010.1.25 prev position 4 stopped 9:30 current entry 9:30 9:45 > 2010.1.25 prev position 5 stopped 9:45 current entry 9:45 9:50 > 2010.1.25 prev position 6 stopped 9:50 current entry 9:50 10:00
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Selecting previous node in ne, Tim Lebo | Thread | [xsl] Selecting attribute from prev, Andrea Berman |
[xsl] Selecting attribute from prev, Andrea Berman | Date | RE: [xsl] Shallow copy and base URI, Florent Georges |
Month |