Usuń określone węzły z XML za pomocą xslt3.0
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
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:evaluate
jest 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:variable
nawet 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.
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:evaluate
tutaj 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-nodes
jest 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.