Ключ XSLT в преобразовании push, лучшая производительность - PullRequest
1 голос
/ 18 марта 2011

Я использую <xsl:key> в push-преобразовании, используя его в шаблонах, например:

<xsl:template match="key('div', 'MAIN')">
...
</xsl:template>

... вместо:

<xsl:template match="html:div[upper-case(@id) = 'MAIN']">
...
</xsl:template>

Однако я не наденуНе знаю, имеет ли это какие-либо преимущества в производительности, и в последнее время я думал, так как это принудительное преобразование, и узел все равно посещается, действительно ли ключ полезен?

Ответы [ 2 ]

2 голосов
/ 19 марта 2011

Хотя разница в производительности может быть незначительной, при сравнении производительности:

<xsl:template match="key('div', 'MAIN')"> 

с:

<xsl:template match="html:div[upper-case(@id) = 'MAIN']">

кажется, что последняя равна более эффективен в любом случае, когда функция key() выбирает значительное количество узлов.

Пояснение :

  1. Соответствует key()эквивалентно сопоставлению объединения узлов в наборе узлов, возвращаемом функцией key().Таким образом, процессор XSLT должен решить, принадлежит ли текущий узел этому набору узлов.Это может быть довольно неэффективной операцией, особенно если набор узлов, выбранных функцией key(), является значительным.

  2. Во втором случае мы имеем простое совпадение.Решение о том, соответствует ли текущий узел выражению соответствия, включает в себя только один тест узла и проверку простого условия.Как правило, это будет проще, чем проверка принадлежности текущего узла к большому набору узлов.

1 голос
/ 20 марта 2011

Я очень редко вижу ключ (), используемый в шаблоне совпадения.Я думаю, что это вряд ли даст какие-либо существенные преимущества в производительности, если только условие «использования» ключа не является очень сложным, а ключ используется достаточно часто, чтобы амортизировать стоимость построения индекса.Как всегда в вопросах производительности, это зависит от процессора, который вы используете, и единственный реальный способ узнать это - измерить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...