I have a transformation that takes roughly 2.8 sec to run (using MSXML). I
made some changes to it, moving some of the template matches into a choose
within a broader template. This change was made for functional reasons, but
it cut the transformation time down to 1.4 sec. I was just curious if
someone could shed light on why there was the performance improvement.
Sample differences:
slower version was structured as -
<xsl:template match="KH[(_at_)Type='401']/Key[(_at_)ProdID ='83' and
translate(@StopVal, '-','') <='20050911']/MD[(_at_)ACPID='100']/@AAvl"
priority="1001" >
<xsl:attribute name="AAvl">1</xsl:attribute>
</xsl:template>
<xsl:template match="KH[(_at_)Type='401']/Key[(_at_)ProdID ='83' and
translate(@StopVal, '-','') <='20050911']/MD[(_at_)BCPID='100']/@BAvl"
priority="1002" >
<xsl:attribute name="BAvl">1</xsl:attribute>
</xsl:template>
<xsl:template match="KH[(_at_)Type='401']/Key[(_at_)ProdID ='83' and
translate(@StopVal, '-','') <='20030911']/MD[(_at_)ACPID='10']/@AAvl"
priority="1003" >
<xsl:attribute name="AAvl">1</xsl:attribute>
</xsl:template>
<xsl:template match="KH[(_at_)Type='401']/Key[(_at_)ProdID ='83' and
translate(@StopVal, '-','') <='20030911']/MD[(_at_)BCPID='10']/@BAvl"
priority="1004" >
<xsl:attribute name="BAvl">1</xsl:attribute>
</xsl:template>
<xsl:template match="KH[(_at_)Type='401']/Key[(_at_)ProdID ='83' and
translate(@StopVal, '-','') <='20030311']/MD[(_at_)ACPID='3']/@AAvl"
priority="1005" >
<xsl:attribute name="AAvl">1</xsl:attribute>
</xsl:template>
<xsl:template match="KH[(_at_)Type='401']/Key[(_at_)ProdID ='83' and
translate(@StopVal, '-','') <='20030311']/MD[(_at_)BCPID='3']/@BAvl"
priority="1006" >
<xsl:attribute name="BAvl">1</xsl:attribute>
</xsl:template>
faster version as -
<xsl:template match="KH/Key[(_at_)ProdID ='83']/MD/@AAvl" priority="1001">
<xsl:attribute name="AAvl">
<xsl:choose>
<xsl:when test="translate(ancestor::Key/@StopVal, '-','') <='20030311'
and (parent::MD/@ACPID='3')">1</xsl:when>
<xsl:when test="translate(ancestor::Key/@StopVal, '-','') <='20030911'
and (parent::MD/@ACPID='10')">1</xsl:when>
<xsl:when test="translate(ancestor::Key/@StopVal, '-','') <='20050911'
and (parent::MD/@ACPID='100')">1</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:template>
<xsl:template match="KH/Key[(_at_)ProdID ='83']/MD/@BAvl" priority="1001">
<xsl:attribute name="BAvl">
<xsl:choose>
<xsl:when test="translate(ancestor::Key/@StopVal, '-','') <='20030311'
and (parent::MD/@BCPID='3')">1</xsl:when>
<xsl:when test="translate(ancestor::Key/@StopVal, '-','') <='20030911'
and (parent::MD/@BCPID='10')">1</xsl:when>
<xsl:when test="translate(ancestor::Key/@StopVal, '-','') <='20050911'
and (parent::MD/@BCPID='100')">1</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:template>
All other things (other named templates and unrelated template matches) in
the XSL documents were unchanged.
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list