Я использую приведенный ниже код XSL 2.0, чтобы найти идентификаторы текстовых узлов, которые содержат список индексов, которые я даю в качестве входных данных. код работает отлично, но с точки зрения производительности он занимает много времени для огромных файлов. Даже для больших файлов, если значения индекса малы, результат будет быстрым за несколько мс. Я использую Java-процессор saxon9he для выполнения XSL.
<xsl:variable name="insert-data" as="element(data)*">
<xsl:for-each-group
select="doc($insert-file)/insert-data/data"
group-by="xsd:integer(@index)">
<xsl:sort select="current-grouping-key()"/>
<data
index="{current-grouping-key()}"
text-id="{generate-id(
$main-root/descendant::text()[
sum((preceding::text(), .)/string-length(.)) ge current-grouping-key()
][1]
)}">
<xsl:copy-of select="current-group()/node()"/>
</data>
</xsl:for-each-group>
</xsl:variable>
В приведенном выше решении, если значение индекса слишком велико, скажем, 270962, тогда время, необходимое для выполнения XSL, составляет 83427 мс. В больших файлах, если значение индекса велико, скажем, 4605415, 4605431, выполнение занимает несколько минут. Кажется, вычисление переменной «insert-data» занимает время, хотя это глобальная переменная и вычисляется только один раз. Должен ли XSL быть добавлен или процессор? Как я могу улучшить производительность XSL.