J'utilise le code XSL 2.0 ci-dessous pour trouver les identifiants des nœuds de texte contenant la liste d'indices que je donne en entrée. Le code fonctionne parfaitement, mais en termes de performances, il prend beaucoup de temps pour les fichiers volumineux. Même pour les gros fichiers si les valeurs d'index sont petites, le résultat est rapide en quelques ms. J'utilise le processeur Java saxon9he pour exécuter le XSL.Amélioration des performances de 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>
Dans la solution ci-dessus si la valeur de l'indice est trop grand alors le dire 270962 temps pris pour l'exécuter est XSL pour 83427ms. Dans les fichiers énormes si la valeur de l'index est énorme, disons 4605415, 4605431, il faut plusieurs minutes pour l'exécuter. Semble le calcul de la variable "insert-data" prend du temps mais c'est une variable globale et calculée une seule fois. Faut-il ajouter le XSL ou le processeur? Comment puis-je améliorer les performances du XSL.
Merci pour votre reposnse. Je vais essayer cela et mettre à jour bientôt. – Rachel
Super, la réponse est en quelques ms. Il a été réduit de 82242 à 813. Merci beaucoup! La valeur du noeud "data" seul ne figure pas dans le résultat. Ligne: qui est en cours de lecture, . –
Rachel
@Rachel: C'est bon d'entendre que votre temps de réponse s'est amélioré. Il y avait un bogue dans ma définition de clé originale, vous devez utiliser ' ' pour obtenir des résultats corrects. –
markusk