Usuń określone węzły z XML za pomocą xslt3.0

Nov 23 2020

Obecnie próbuję usunąć niektóre węzły z XML za pomocą xslt3.0 przy użyciu szablonu tożsamości. Ale to zajmuje dużo czasu. potrzebuję sugestii, aby poprawić wydajność za pomocą 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>

Odpowiedzi

MartinHonnen Nov 23 2020 at 22:17

Podobnie jak w poprzednim przykładzie, alternatywą jest użycie parametru statycznego i atrybutu cienia:

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

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

Będziesz musiał podać szczegóły dotyczące swoich problemów z wydajnością, abyśmy mogli ocenić, czy xsl:evaluatejest to winowajca. Powyższe jest głównie publikowane jako podejście alternatywne, sprawdź sam, czy działa lepiej w Twoich przypadkach użycia. Twój przykład z prostym xsl:variablenawet nie wyjaśnia, czy ta część jest zmienna, czy nie, za każdym razem, gdy uruchamiasz transformację.

BTW: w XSLT 3 możesz zadeklarować <xsl:mode on-no-match="shallow-copy"/>zamiast konfigurować szablon tożsamości.

MichaelKay Nov 23 2020 at 22:39

Pytanie dotyczące wydajności ma sens tylko wtedy, gdy można je określić ilościowo: jaki jest rozmiar dokumentu źródłowego, jak długo to trwa, jak wypada to w porównaniu z wymaganiami dotyczącymi wydajności?

Nie rozumiem, dlaczego xsl:evaluatetutaj używasz , biorąc pod uwagę, że wyrażenie ścieżki jest naprawione. Być może nie jest to naprawione w Twoim prawdziwym kodzie? Ale jeśli to nie jest twój prawdziwy kod, być może nie pokazałeś nam rzeczywistego źródła problemu? Z pewnością, jeśli jest to duży dokument źródłowy i oceniasz plik xsl: oceń tylko raz, to jest mało prawdopodobne, aby był przyczyną problemu.

<xsl:template match="$changed-nodes"/>Potęga dobrze być problem, jeśli $changed-nodesjest to bardzo duży węzeł-set. Mam wrażenie, że ostatnio trochę popracowaliśmy, aby rozwiązać ten problem: nie powiedziałeś, którego wydania Saxon używasz. Ale nawet przy tych ulepszeniach przetestowanie każdego węzła w celu sprawdzenia, czy spełnia on kryteria usunięcia, będzie lepsze niż utworzenie zbioru wszystkich takich węzłów, a następnie przetestowanie każdego węzła, aby sprawdzić, czy należy do tego zestawu.