1

以前は、以下に示すように別の変換を使用して空のタグを削除していましたが、現在は同じ 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>

トランスフォーム内の残りのテンプレートに影響を与えずにタグの削除を変数内に組み込む方法の答えは、私を逃れているようです。おそらく明らかなことで私を助けてもらえますか?

「ポリシー」出力の周りに変数を提案している理由は、変換からいくつかのメッセージを抽出して他の場所に出力する必要があるため、既に宣言しているためです。

4

2 に答える 2

1

元の変換を使用するだけですが、次を置き換えます。

<xsl:template match="*[not(node()) and not(./@*)]"/>

:

<xsl:template match="policy/*[not(node()) and not(@*)]"/>
于 2012-08-09T16:13:51.637 に答える
0

ルールを単純に組み込むことができない理由は私には明らかではありません

<xsl:template match="*[not(node()) and not(./@*)]"/>

おそらく優先度を上げて、既存のスタイルシートで。他のテンプレートルールが何をしているかに依存すると思います。$completepolicy にバインドされたツリーに空のノードが存在する必要があり、処理の第 2 段階でそれらを削除する必要がある場合は、モードを使用してそれを行います。処理の各段階に適用されるテンプレート ルールの 1 つのモードです。

于 2012-08-09T20:57:49.917 に答える