xslt3.0を使用してxmlから特定のノードを削除します

Nov 23 2020

現在、IDテンプレートを使用してxslt3.0を使用してxmlから特定のノードを削除しようとしています。しかし、これには長い処理時間がかかります。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>

回答

MartinHonnen Nov 23 2020 at 22:17

前の例のように、別の方法は静的パラメーターとシャドウ属性を使用することです。

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

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

パフォーマンスの問題の詳細を提供してxsl:evaluate、原因であるかどうかを判断できるようにする必要があります。上記は主に代替アプローチとして投稿されています。ユースケースでパフォーマンスが向上するかどうかを自分でテストしてください。単純な例ではxsl:variable、変換を実行するたびにその部分が可変であるかどうかさえ明確になりません。

ところで:XSLT 3<xsl:mode on-no-match="shallow-copy"/>では、IDテンプレートを設定する代わりに宣言できます。

MichaelKay Nov 23 2020 at 22:39

パフォーマンスの質問は、定量化できる場合にのみ意味があります。ソースドキュメントのサイズ、所要時間、パフォーマンス要件との比較はどうですか。

xsl:evaluateパス式が固定されているので、なぜここで使用しているのかわかりません。おそらくそれはあなたの実際のコードで修正されていませんか?しかし、これが実際のコードではない場合は、問題の実際の原因を示していない可能性がありますか?確かに、それが大きなソースドキュメントであり、xsl:evaluateを1回だけ評価している場合は、問題の原因である可能性はほとんどありません。

<xsl:template match="$changed-nodes"/>場合かもしれないがよく問題になり$changed-nodes、非常に大きなノードセットです。最近、これに対処するためにいくつかの作業を行ったように感じます。使用しているSaxonリリースをまだ言っていません。ただし、これらの改善があっても、各ノードをテストして削除の基準に一致するかどうかを確認する方が、そのようなすべてのノードのセットを作成してから各ノードをテストしてそのセットのメンバーであるかどうかを確認するよりも優れています。