Я был бы склонен заменить шаблон formatDateTime шаблоном соответствия:
<xsl:template match="@*" mode="formatDateTime">
<xsl:value-of select="concat(substring-before(., 'T'),
' ', substring-before(substring-after(., 'T'), '.'))" />
</xsl:template>
и изменить вызовы на
<StartDateTime>
<xsl:apply-templates select="$startDateTime" mode="formatDateTime"/>
</StartDateTime>
<EndDateTime>
<xsl:apply-templates select="$endDateTime" mode="formatDateTime"/>
</EndDateTime>
Просто потому, что синтаксис шаблона вызова настолько многословен.
(и я, вероятно, тоже включил бы переменные - они не видят, как добавить значение).