以前は、以下に示すように別の変換を使用して空のタグを削除していましたが、現在は同じ XSLT 2.0 変換内で行う必要があります。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="*[not(node()) and not(./@*)]"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
この XML を考慮して、ポリシー ノードからすべての空のタグを削除したいと考えています。XML は最大 40 MB 程度です。
<?xml version="1.0" encoding="UTF-8"?>
<myroot>
<data>
<data1>abc</data1>
<data2>123</data2>
</data>
<policy>
<policydata1>Hello World!</policydata1>
<policydata2/>
</policy>
</myroot>
私の考えでは、XSLT 2.0 を使用しています。ポリシー ノードに関連する変換の出力を「要素」として定義された変数に保持できるので、それを XML のように扱い、変数を反復処理して空のタグを削除できます。
<xsl:variable name="completepolicy" as="element()">
<policy>
<policydata1>Hello World!</policydata1>
<policydata2/>
</policy>
</xsl:variable>
トランスフォーム内の残りのテンプレートに影響を与えずにタグの削除を変数内に組み込む方法の答えは、私を逃れているようです。おそらく明らかなことで私を助けてもらえますか?
「ポリシー」出力の周りに変数を提案している理由は、変換からいくつかのメッセージを抽出して他の場所に出力する必要があるため、既に宣言しているためです。