XSLT très lent - XML/XSL - Programmation
Marsh Posté le 28-02-2017 à 14:41:55
C'est clairement l'appel
select="$communes//fn:map[@key=$insee]/fn:number[@key='HOLL_PRES_2012']"
qui reparcourt ton arbre a chaque svg:polygon qui va être lent. Les // c'est coûteux en temps.
Il y a peut-être moyen de ne faire qu'une passe et indexer avec un xsl:key.
Par contre, il y a manifestement des bouts de code que tu n'as pas donné, car je ne comprends pas des choses comme:
fn:number[@key='HOLL_PRES_2012']
fn:number est une fonction, donc ca devrait etre qque chose comme fn:number(...)
Si tu expliques un peu mieux ce que tu veux faire, je devrais être en mesure de t'aider (si je trouve le temps, car la j'ai moi aussi plein de code xsl a écrire.)
On dirait du MarkLogic, tes fn:map et fn:number.
A+,
Marsh Posté le 28-02-2017 à 18:57:10
Merci pour ta réponse gilou,
En réponse à ta première remarque, j'ai modifié un peu le code
Code :
|
Le code de communes.xml est généré automatiquement (de json en XML via basex)
Code :
|
Du coup comme tu le vois il y a un namespace dedans et si je n'utilise pas ce namespace fn: mes requêtes xpath échouent.
Du coup si c'est une partie du problème, je ne sais pas trop comment le régler :s
Marsh Posté le 28-02-2017 à 22:26:14
Ah! OK!
Mais ton namespace est bizarre alors: http://www.w3.org/2005/xpath-functions est le namespace des fonctions standard xpath, et a priori tu as ici des éléments, pas des fonctions.
Comme j'utilise SaxonEE et non Saxonb, je ne sais pas trop ce que c'est dans ton cas.
Bon, tu aurais xslt 3, tu pourrais utiliser les xsl:map, mais en xslt2, tu n'as que les xsl:key, et ils ne peuvent indexer que la source.
Ce que je ferais:
- importer tes deux fichier dans un englobant (technique comme ici par exemple) et passer celui ci comme source de données a ta feuille de style
- passer a la trappe ce qui vient de ../communes.xml qui ne sert qu'a créer un index dans ta feuille de style, index qui associe la valeur de fn:key au sous arbre fn:map
- faire une xsl:key qui indexe les elements map avec comme cle leur attribut key
<xsl:key name="citykey" match="lfn:map[@key]" use="@key"/>
- utiliser cette xsl:key dand ton <xsl:variable name="red" select="... afin de ne chercher la donnée que sur sa liste de number, ce qui est petit, et non sur tout $communes a chaque fois
<xsl:variable name="city" select="key('citykey', substring-before(@id, ' '))"/>
<xsl:variable name="red" select="$city/fn:number[@key='HOLL_PRES_2012']" />
A+,
Marsh Posté le 01-03-2017 à 01:13:24
Merci beaucoup, super cette histoire de key, je fais ça demain!
Marsh Posté le 01-03-2017 à 23:57:50
Autre chose: éviter l'emploi de //
Dans le code initial,
$communes//fn:map[@key=$insee]/fn:number[@key='HOLL_PRES_2012']
passe en
$communes/fn:map/fn:map[@key=$insee]/fn:number[@key='HOLL_PRES_2012']
aurait sans doute été un poil plus efficace
Sinon, après avoir parlé avec le guru XML de ma boite, il y a une astuce avec key permettant de l'utiliser sur un document précis: c'est pas avec la définition xsl:key, mais a la première invocation avec le 3e paramètre.
Ça permet de se passer des contorsions indiquées vis a vis des fichiers comme indique dans mon post précédent.
Il suffit juste de transformer ton code comme suit:
Code :
|
Et tu peux peut etre encore gagner un chouia de perf en ne calculant qu'une fois, dans une variable la valeur 255-round(255 * $red div 100) et en la réutilisant.
A+,
Marsh Posté le 02-03-2017 à 01:36:52
Merci beaucoup! Tu as répondu avant que je puisse m'y atteler à nouveau.
Ça marche du tonnerre!
J'avais jamais utilisé les key, XSL m'étonne toujours, vraiment très puissant
Marsh Posté le 02-03-2017 à 02:11:25
Et xsl 3, qui devrait passer au statut de "proposed recommendation" d'ici un mois environ est bien plus puissant encore (try/catch, iterate...) en particulier avec les fonctions xpath évoluées.
A+,
Marsh Posté le 27-02-2017 à 20:42:54
Bonjour,
Je reproduis une carte SVG en modifiant certains attribuer (pour la colorier) mais c'est très lent (avec libsaxonb-java).
Sachant que mon fichier svg possède quelques dizaines de milliers de polygones, et que mon fichier "communes.xml" contient à peu près le même nombre d'entrées.
Il peut prendre plus de 10 minutes à s'exécuter...
Des idées ?
Merci d'avance!