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>