XSLT stylesheet: Time logics relations in TASX files

The following XSLT stylesheet produces the list of segments of a TASX file with their related segments from other tiers, using the time calculus relations from Allen and Ferguson (1994). The relations before and after are not processed.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     version="1.1">
  <xsl:output method="xml" version="1.0" encoding="utf-8" 
       omit-xml-declaration="yes" indent="yes"/> 

  <xsl:template match="/">
      <xsl:apply-templates/> 
  </xsl:template>

  <xsl:template match="session">
   <xsl:element name="struct_rel">
     <xsl:apply-templates select="layer"/>
   </xsl:element> 
  </xsl:template>

  <xsl:template match="layer">
   <xsl:variable name="layerid" select="@l-id"/>
     <xsl:for-each select="event[@start < @end and text()]">
       <xsl:variable name="startevent" select="@start"/>
       <xsl:variable name="endevent" select="@end"/>
       <xsl:variable name="element" select="text()"/>
       <xsl:variable name="eventid" select="@e-id"/>

       <xsl:for-each select="../../layer[not(@l-id = $layerid)]">
         <xsl:for-each select="event[@start < @end and text()]">
           <xsl:variable name="meta2">
             <xsl:copy-of select="meta"/>
           </xsl:variable>
           <xsl:variable name="OUTPUT_OF_PARAMS">
             <xsl:element name="baselayerid">
               <xsl:value-of select="$layerid"/> 
             </xsl:element>
             <xsl:element name="baseeventid">
               <xsl:value-of select="$eventid"/> 
             </xsl:element>
             <xsl:element name="basestartevent">
               <xsl:value-of select="$startevent"/> 
             </xsl:element>
             <xsl:element name="baseendevent">
               <xsl:value-of select="$endevent"/> 
             </xsl:element>
             <xsl:element name="baseelement">
               <xsl:value-of select="$element"/>
             </xsl:element>
             <xsl:element name="complayer">
               <xsl:value-of select="../@l-id"/> 
             </xsl:element>
             <xsl:element name="compeventid">
               <xsl:value-of select="@e-id"/> 
             </xsl:element>
             <xsl:element name="compstartevent">
               <xsl:value-of select="@start"/> 
             </xsl:element>
             <xsl:element name="compendevent">
               <xsl:value-of select="@end"/> 
             </xsl:element>
             <xsl:element name="compelement">
               <xsl:value-of select="text()"/>
             </xsl:element>
	   </xsl:variable>

<!-- 1. Case: Identity of start times-->
           <xsl:if test="$startevent=@start"> 
 <!-- Case 1.1: start identical, end smaller than compared value-->            
             <xsl:if test="$endevent < @end">
	       <xsl:element name="relationpair">
                 <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>
		 <xsl:element name="relation">
                   <xsl:attribute name="rel">
                    <xsl:text>starts</xsl:text>
                   </xsl:attribute>
                 </xsl:element>
               </xsl:element>
             </xsl:if>
<!-- Case 1.2: start and end identical -->          
             <xsl:if test="$endevent = @end">
               <xsl:element name="relationpair">
                 <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>
                 <xsl:element name="relation">
                   <xsl:attribute name="rel">
                     <xsl:text>ident</xsl:text>
                   </xsl:attribute>
                 </xsl:element>
               </xsl:element>
             </xsl:if>
<!-- Case 1.3: start identical, end greater than comp. value -->  
             <xsl:if test="$endevent > @end">
               <xsl:element name="relationpair">
                 <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>
                   <xsl:element name="relation">
                    <xsl:attribute name="rel">
                      <xsl:text>started_by</xsl:text>
                    </xsl:attribute>
                   </xsl:element>
                </xsl:element>
              </xsl:if>
           </xsl:if>

<!-- 2. Case: event start before the one compared to it -->
           <xsl:if test="$startevent < @start"> <!-- -->
<!-- Case 2.1 event is completely before the one compared 
          to: not dealt with -->
          <!-- <xsl:if test="$endevent < @start">
               <xsl:element name="relationpair">
               <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>
               <xsl:element name="relation">
               <xsl:attribute name="rel">
               <xsl:text>before</xsl:text>
               </xsl:attribute>
               </xsl:element>
               </xsl:element>
               </xsl:if>  
            -->

<!-- Case 2.2 event finisehs when the one compared to 
      it starts -->
              <xsl:if test="$endevent = @start">
                <xsl:element name="relationpair">
                  <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>
                  <xsl:element name="relation">
                   <xsl:attribute name="rel">
                    <xsl:text>meets</xsl:text>
                   </xsl:attribute>
                  </xsl:element>
                 </xsl:element>
              </xsl:if>
<!-- Case 2.3 event finishes while the one compared to 
       it is already running -->
              <xsl:if test="$endevent > @start">
<!-- Case 2.3.1 event finishes before the one compared to -->
               <xsl:if test="$endevent < @end">
                 <xsl:element name="relationpair">
                   <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>    
                   <xsl:element name="relation">
                    <xsl:attribute name="rel">
                     <xsl:text>overlaps</xsl:text>
                    </xsl:attribute>
                   </xsl:element>
                 </xsl:element>
               </xsl:if>
<!-- Case 2.3.2 -->
               <xsl:if test="$endevent > @end">
                 <xsl:element name="relationpair">
                   <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>
                   <xsl:element name="relation">
                    <xsl:attribute name="rel">
                     <xsl:text>contains</xsl:text>
                    </xsl:attribute>
                   </xsl:element>
                 </xsl:element>
               </xsl:if>
<!-- Case 2.3.3 -->
               <xsl:if test="$endevent = @end">
                 <xsl:element name="relationpair">
                   <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>
                   <xsl:element name="relation">
                    <xsl:attribute name="rel">
                     <xsl:text>finished_by</xsl:text>
                    </xsl:attribute>
                   </xsl:element>
                 </xsl:element>
               </xsl:if>
<!-- end Case 2.3 --> 
              </xsl:if>
<!--  end Case 2 -->
            </xsl:if>
<!-- 3. Case event beginns after the one compared with -->
            <xsl:if test="$startevent > @start">
<!-- Case 3.1 -->
             <xsl:if test="$startevent < @end">
<!-- Case 3.1.1 -->
              <xsl:if test="$endevent < @end">
                <xsl:element name="relationpair">
                  <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>
                  <xsl:element name="relation">
                   <xsl:attribute name="rel">
                    <xsl:text>during</xsl:text>
                   </xsl:attribute>
                  </xsl:element>
                </xsl:element>
              </xsl:if>
<!-- Case 3.1.2 -->
              <xsl:if test="$endevent =@end">
                <xsl:element name="relationpair">
                 <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>
                 <xsl:element name="relation">
                  <xsl:attribute name="rel">
                   <xsl:text>finishes</xsl:text>
                  </xsl:attribute>
                 </xsl:element>
                </xsl:element>
              </xsl:if>
<!-- Case 3.1.3 -->
              <xsl:if test="$endevent > @end">
               <xsl:element name="relationpair">
                <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>
                <xsl:element name="relation">
                 <xsl:attribute name="rel">
                  <xsl:text>overlapped_by</xsl:text>
                 </xsl:attribute>
                </xsl:element>
               </xsl:element>
              </xsl:if>
            </xsl:if>
<!-- Case 3.2 -->
            <xsl:if test="$startevent = @end">
              <xsl:element name="relationpair">
                <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>
                <xsl:element name="relation">
                 <xsl:attribute name="rel">
                  <xsl:text>met_by</xsl:text>
                 </xsl:attribute>
                </xsl:element>
             </xsl:element>
            </xsl:if>
<!-- Case 3.3 -->
<!-- not dealt with
          <!--        
               <xsl:if test="$startevent > @end">
               <xsl:element name="relationpair">
               <xsl:copy-of select="$OUTPUT_OF_PARAMS"/>
               <xsl:element name="relation">
               <xsl:attribute name="rel">
               <xsl:text>after</xsl:text>
               </xsl:attribute>
               </xsl:element>
               </xsl:element>
               </xsl:if> 
             -->
         </xsl:if>
       </xsl:for-each>
      </xsl:for-each>
     </xsl:for-each>
   </xsl:template>

   <xsl:template match="meta">
   </xsl:template>

</xsl:stylesheet>

Thorsten Trippel 2006-11-18