Firstly, I hate to see a template rule whose whole body is an xsl:choose. Split
<xsl:template match="*">
<xsl:choose>
<xsl:when test="@ShippingType='Collection'">
<xsl:call-template name="ShippingType"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="copy"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
into:
<xsl:template match="*">
<xsl:call-template name="copy"/>
</xsl:template>
and
<xsl:template match="*[@ShippingType='Collection']">
<xsl:call-template name="ShippingType"/>
</xsl:template>
and then simplify further, because a template can have both a name and a match pattern so you can do:
<xsl:template name="ShippingType" match="*[@ShippingType='Collection']">
....
</xsl:template>
Then you can just add your match="DateAdd" template as another rule. There's a built-in set of priority rules if the same element matches multiple rules, for example match="XYZ[A='2']" takes precedence over match="XYZ" which takes precedence over match="*". But if things get more complicated (or if you want to be explicit) you can attach explicit priorities with the "priority" attribute.
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference