2009-06-01 4 views
0

Кто-нибудь использовал кумулятивный максимум functoid и заметил проблемы с производительностью?Кумулятивный максимум, рассчитать для каждой родительской записи

Аннотация
Если один хочет отобразить максимальное значение поля вы можете использовать functoid накопительное Maximum.

Проблема
После того, как мы использовали его на некоторое время мы заметили пониженную производительность на больших файлах.

Изучения XSLT один замечает, что максимальный расчет производится для каждого обхвата записи ...

Можно перенести расчет на грандиозный родитель, и указать на новый XSLT в пользовательском пути XSL, но я действительно нравится сохранять возможность отображения в инструменте сопоставления.

Любые предложения?

С наилучшими пожеланиями
Мартина Принесите

http://martinbring.blogspot.com

+0

@Martin, не могли бы вы изменить и сделать свой вопрос более явным? –

ответ

3

Удаляя накопительный Максимум и добавление 3 сценариев functoids, делая расчет по-другому, то проблема решена. Время отображения сократилось в 40 раз.

11 Мб, 10 000 строк, ранее отображаемых за 200 минут, теперь отображается в 5 минутах.

Решение
Один сценарии functoid, «Инлайн XSLT-шаблон вызовов» без ввода или вывода, содержащий не более() части библиотеки из EXSLT Math library found here. Вместо использования всей библиотеки я распаковал файл и «извлек» шаблон max().

<xsl:template name="GetMax"> 
    <xsl:param name="nodes" /> 

    <xsl:choose> 
     <xsl:when test="not($nodes)">NaN</xsl:when> 
     <xsl:otherwise> 
     <xsl:for-each select="$nodes"> 
      <xsl:sort data-type="number" order="descending" /> 
      <xsl:if test="position() = 1"> 
      <xsl:value-of select="number(.)" /> 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

Один сценариев functoid, «Встроенный XSLT-вызовов Шаблон» без ввода или вывода, содержащие переменную, которая выбрать точки атрибута в шаблоне с узлом набора для расчета

<xsl:variable name="var:MaxValueDate"> 
    <xsl:call-template name ="GetMax"> 
      <xsl:with-param name ="nodes" select="Root//Parent/ValueToCalculate" /> 
    </xsl:call-template> 
</xsl:variable> 

One сценариев functoid, «Inline XSLT» с одним выходом, используя переменную, чтобы заполнить выходной элемент своим значением.

<OutputElement> 
     <xsl:value-of select="$var:MaxValueDate" /> 
</OutputElement> 

Voila!

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

  • Нет связанных вопросов^_^