萨克森他9.4性能-xslt

时间:2015-10-09 14:13:24

标签: performance saxon

我在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>

1 个答案:

答案 0 :(得分:0)

这里的信息不够充分:例如,entry中的兄弟row元素的典型数量是多少?这个模板的执行频率是多少?我猜你可能每次都要执行一次,而且条目数量显然是二次方。

重复表达$entryNode/preceding-sibling::entry[@nameend]显然是浪费。

很难提供关于是否有其他编写方式更快的建议,而不知道代码实际上在做什么。也许使用xsl:number进行一些计数会更好;这很难说。或者,而不是做每个&#34; for-each&#34;它独立地处理每个条目,考虑进行通过节点向前工作的兄弟递归,传递有关已经处理的节点的参数信息,这样你就不必向后搜索到兄弟节点。