我在xslt中有以下两个模板:
fixed
并且
我运行了一些与撒克逊人一起进行的分析9.4.-TP:profile.html template calculateAbsoluteEntryNodeIndex 25268028 在此模板上花费的总时间为174966.587ms。 整个xslts在总时间内执行:337196.696毫秒。 似乎存在大约14万行xml的大表变换的问题。不知道这里有什么问题。
表的结构是。
<xsl:template name="calculateAbsoluteEntryNodeIndex">
<!-- current 'entry' node -->
<xsl:param name="entryNode"/>
<!-- current 'entry' node index (position) in xml tree-->
<xsl:param name="entryNodePosition"/>
<xsl:choose>
<!--if the current 'entry' node contains 'namest' attribute then its ('namest') value is treated as
the absolute index (of the current 'entry' node)-->
<xsl:when test="$entryNode/@namest">
<!--writing result-->
<xsl:value-of select="number($entryNode/@namest)"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="number($entryNode/@nameend)"/>
</xsl:when>
<xsl:otherwise>
<!--getting last 'Nameend' attribute value-->
<xsl:variable name="lastNameEndValue">
<xsl:choose>
<!--check if exists any 'entry' node before the current 'entry' node (on the current 'row' level) having 'nameend' attribute defined
('entry' has to have index number less than $entryNodePosition) -->
<xsl:when test="$entryNode/preceding-sibling::entry[@nameend]">
<!--get 'named' attribute value of the last matched "entry" node and convert it to number -->
<xsl:value-of select="number(($entryNode/preceding-sibling::entry/@nameend)[last()])"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="0"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!--getting 'entry' node index of the matched 'Nameend' attribute -->
<xsl:variable name="lastNameendNodePosition">
<xsl:choose>
<!-- if lastNameEndValue != 0 -->
<xsl:when test="$lastNameEndValue != '0'">
<!-- calculate index of the 'entry' node matched in $lastNameEndValue selection =>it is done by counting all preceding siblings of the node matched in
$lastNameEndValue increased by 1-->
<xsl:value-of select="count(($entryNode/preceding-sibling::entry[@nameend])[last()]/preceding-sibling::entry) + 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="0"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!--writing result-->
<xsl:value-of select="$entryNodePosition - $lastNameendNodePosition + $lastNameEndValue"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="$entryNodePosition - $lastNameendNodePosition + $lastNameEndValue"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
答案 0 :(得分:0)
这里的信息不够充分:例如,entry
中的兄弟row
元素的典型数量是多少?这个模板的执行频率是多少?我猜你可能每次都要执行一次,而且条目数量显然是二次方。
重复表达$entryNode/preceding-sibling::entry[@nameend]
显然是浪费。
很难提供关于是否有其他编写方式更快的建议,而不知道代码实际上在做什么。也许使用xsl:number进行一些计数会更好;这很难说。或者,而不是做每个&#34; for-each&#34;它独立地处理每个条目,考虑进行通过节点向前工作的兄弟递归,传递有关已经处理的节点的参数信息,这样你就不必向后搜索到兄弟节点。