Кто-нибудь измерял производительность выполнения эквивалента похожих XSL-преобразований итеративно или рекурсивно с использованием различных библиотек? Меня больше всего интересуют библиотеки Java, но приветствуются и другие предложения.
Пример для итерации (допустимо, дано при условии , что //*
, вероятно, соответствует довольно нескольким элементам для примера, но не "верно" для "духа" XSLT) :
<xsl:for-each select="//*[position() <= string-length(MyData/MyValue)]">
<someTags>
<xsl:value-of select="substring(MyData/MyValue, position(), 1)"/>
</someTags>
</xsl:for-each>
Пример рекурсии (чистый, но довольно многословный для той же задачи):
<xsl:template match="data/node">
<xsl:call-template name="for-each-character">
<xsl:with-param name="data" select="."/>
</xsl:call-template>
</xsl:template>
<xsl:template name="for-each-character">
<xsl:param name="data"/>
<xsl:if test="string-length($data) > 0">
<someTags>
<xsl:value-of select="substring($data,1,1)"/>
</someTags>
<xsl:call-template name="for-each-character">
<xsl:with-param name="data" select="substring($data,2)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
Оба примера были взяты из этого вопроса:
XSLT для каждой буквы в строке
Примечание : Переполнение стека, как правило, является местом жарких дискуссий о чистоте XSLT, а новичкам приходится правильно изучать XSLT. Хотя меня не волнует многословность «чистоты» или сама по себе субъективная «чистота», я действительно задаюсь вопросом о производительности здесь.