Supprimer certains nœuds d'un XML en utilisant xslt3.0

Nov 23 2020

Actuellement, j'essaie de supprimer certains nœuds d'un XML en utilisant xslt3.0 en utilisant un modèle d'identité. Mais cela prend du temps de traitement. besoin de quelques suggestions pour améliorer les performances en utilisant Xslt30Transformer.

<xsl:stylesheet version="3.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://saxon.sf.net/">
 <xsl:output method="xml" indent="yes"/>

 <xsl:variable name="pathexcluded" select="'CATALOG/CD1 | CATALOG/CD2 '"/>
 <xsl:variable name="changed-nodes" as="node()*" >
  <xsl:evaluate xpath="$pathexcluded" context-item="/"/> </xsl:variable> <xsl:template match="node()|@*" name="identity"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="$changed-nodes">
</xsl:template>
</xsl:stylesheet>

Réponses

MartinHonnen Nov 23 2020 at 22:17

Comme dans l'exemple précédent, une alternative consiste à utiliser un paramètre statique et un attribut shadow:

<xsl:param name="pathexcluded" as="xs:string" static="yes" select="'CATALOG/CD1 | CATALOG/CD2 '"/>

<xsl:template _match="{$pathexcluded}"/>

Vous devrez fournir des détails sur vos problèmes de performances pour nous permettre de juger si xsl:evaluatec'est le coupable. Ce qui précède est principalement affiché comme une approche alternative, testez-vous si cela fonctionne mieux avec vos cas d'utilisation. Votre exemple avec le simple xsl:variablen'indique même pas clairement si cette partie est variable ou non à chaque fois que vous exécutez la transformation.

BTW: dans XSLT 3, vous pouvez déclarer <xsl:mode on-no-match="shallow-copy"/>au lieu de configurer le modèle d'identité.

MichaelKay Nov 23 2020 at 22:39

Une question de performance n'a vraiment de sens que si vous pouvez la quantifier: quelle est la taille du document source, combien de temps cela prend-il, comment cela se compare-t-il à votre exigence de performance?

Je ne vois pas pourquoi vous utilisez xsl:evaluateici, étant donné que l'expression de chemin est fixe. Ce n'est peut-être pas corrigé dans votre vrai code? Mais alors, si ce n'est pas votre vrai code, peut-être ne nous avez-vous pas montré la source réelle du problème? Certes, s'il s'agit d'un document source volumineux et que vous n'évaluez que xsl: evaluer une fois, alors il est peu probable que ce soit la cause du problème.

Cela <xsl:template match="$changed-nodes"/>pourrait bien être un problème s'il $changed-nodess'agit d'un très grand ensemble de nœuds. J'ai le sentiment que nous avons récemment travaillé pour résoudre ce problème: vous n'avez pas dit quelle version de Saxon vous utilisez. Mais même avec ces améliorations, tester chaque nœud pour voir s'il correspond aux critères de suppression vaudra mieux que de former l'ensemble de tous ces nœuds, puis de tester chaque nœud pour voir s'il est membre de cet ensemble.