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>