2015-10-09 3 views
0

Я после двух шаблонов в XSLT:Saxon он 9,4 производительности -xslt

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

И

Я запущенный некоторое профилирование, который идет с саксонским он 9.4.-TP: profile.html шаблона calculateAbsoluteEntryNodeIndex 25268028 Общее время нахождения на этом шаблоне - 174966.587мс. Всего xslts выполняется в Общее время: 337196.696 миллисекунд. Кажется, что возникают проблемы с трансфомацией больших столов вокруг 14 тысяч строк xml. Любая идея, что может быть здесь.

Структура таблицы.

<?xml version="1.0" encoding="UTF-8"?> 
<table tabledef="excel"> 
    <tgroup cols="1"> 
     <colspec colname="1" colnum="1" colwidth="100%"/> 
     <thead> 
      <row> 
       <entry morerows="1"> 
        <p> 
         Text 
        </p> 
       </entry> 
     </thead> 
     <tbody> 
      <row> 
       <entry align="left"> 
        <p>1</p> 
       </entry> 
      </row> 
     </tbody> 
    </tgroup> 
</table> 

ответ

0

Там не совсем достаточно информации здесь: например, что типичное количество двойников entry элементов в row? И как часто этот шаблон выполняется? Я думаю, вы, вероятно, выполняете его один раз за запись, и он, очевидно, квадратичен по количеству записей.

Повторение выражения $entryNode/preceding-sibling::entry[@nameend] явно расточительно.

Очень сложно предложить советы о том, есть ли другие способы написания этого, что будет быстрее, не зная ничего о том, что на самом деле делает код. Возможно, использование xsl: number для некоторого подсчета будет работать лучше; это очень сложно сказать. В качестве альтернативы вместо того, чтобы выполнять «для каждого», который обрабатывает каждую запись независимо, подумайте о том, чтобы выполнить рекурсию сестры, которая работает вперед через узлы, передавая информацию о параметрах об уже обработанных узлах, чтобы вам не приходилось искать назад к предыдущим узлам.

Смежные вопросы