Entfernen Sie bestimmte Knoten mit xslt3.0 aus einer XML

Nov 23 2020

Derzeit versuche ich, bestimmte Knoten mit xslt3.0 unter Verwendung einer Identitätsvorlage aus einer XML zu entfernen. Dies dauert jedoch lange. Benötigen Sie einen Vorschlag zur Verbesserung der Leistung mit 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>

Antworten

MartinHonnen Nov 23 2020 at 22:17

Wie im vorherigen Beispiel besteht eine Alternative darin, einen statischen Parameter und ein Schattenattribut zu verwenden:

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

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

Sie müssen Details zu Ihren Leistungsproblemen angeben, damit wir beurteilen können, ob xsl:evaluateder Schuldige der Schuldige ist. Das Obige wird hauptsächlich als alternativer Ansatz veröffentlicht. Testen Sie selbst, ob es mit Ihren Anwendungsfällen besser abschneidet. Ihr Beispiel mit dem einfachen xsl:variablemacht nicht einmal deutlich, ob dieser Teil variabel ist oder nicht, wenn Sie die Transformation ausführen.

Übrigens: In XSLT 3 können Sie deklarieren, <xsl:mode on-no-match="shallow-copy"/>anstatt die Identitätsvorlage einzurichten.

MichaelKay Nov 23 2020 at 22:39

Eine Leistungsfrage ist wirklich nur dann sinnvoll, wenn Sie sie quantifizieren können: Wie groß ist das Quelldokument, wie lange dauert es, wie ist dies im Vergleich zu Ihrer Leistungsanforderung?

Ich kann nicht verstehen, warum Sie xsl:evaluatehier verwenden, da der Pfadausdruck festgelegt ist. Vielleicht ist es nicht in Ihrem echten Code behoben? Aber wenn dies nicht Ihr richtiger Code ist, haben Sie uns vielleicht nicht die tatsächliche Ursache des Problems gezeigt? Wenn es sich um ein großes Quelldokument handelt und Sie das xsl: evaluieren Sie es nur einmal, ist es wahrscheinlich nicht die Ursache des Problems.

Das <xsl:template match="$changed-nodes"/>könnte auch ein Problem, wenn $changed-nodeseine sehr große Knotenmenge ist. Ich habe das Gefühl, wir haben kürzlich einige Arbeiten durchgeführt, um dies zu beheben: Sie haben nicht gesagt, welche sächsische Version Sie verwenden. Aber selbst mit diesen Verbesserungen ist es besser, jeden Knoten zu testen, um festzustellen, ob er den Löschkriterien entspricht, als die Menge aller dieser Knoten zu bilden und dann jeden Knoten zu testen, um festzustellen, ob er Mitglied dieser Menge ist.