2017-08-17 26 views
0

多くの異なるプロセスの出力を「クリーンアップ」するxsltを作成しようとしています。私はすべての空の要素を削除したいが、いくつかは常に存在する必要があります。XSLT:特定の深さから空の要素を削除する

したがって、たとえば次のよう

<soap:Envelope> 
    <soap:Body> 
    <typ:GetSomeStuffReturn> 
     <typ:abcd>qwer</typ:abcd> 
     <typ:efgh/> 
     <typ:ijkl>asdf</typ:ijkl> 
    </typ:GetSomeStuffReturn> 
    </soap:Body> 
</soap:Envelope> 

は、これを実現する方法の例の多くは十分

<soap:Envelope> 
    <soap:Body> 
    <typ:GetSomeStuffReturn> 
     <typ:abcd>qwer</typ:abcd> 
     <typ:ijkl>asdf</typ:ijkl> 
    </typ:GetSomeStuffReturn> 
    </soap:Body> 
</soap:Envelope>  

簡単になるはずです。

しかし、この例

<soap:Envelope> 
    <soap:Body> 
    <typ:GetSomeStuffReturn> 
     <typ:abcd/> 
     <typ:efgh/> 
     <typ:ijkl/> 
    </typ:GetSomeStuffReturn> 
    </soap:Body> 
</soap:Envelope> 

は、私はこれを行う方法を考え出すことはできません

<soap:Envelope> 
    <soap:Body> 
    <typ:GetSomeStuffReturn/> 
    </soap:Body> 
</soap:Envelope> 

になるはずです。私が試したものは、どちらか一方の例では動作しますが、両方では動作しません。

私がいつも封筒、ボディ、そして第三が必要なコードもかかわらず、第3のノードが何であるかの仕事に必要という点で、それが最も可能性が高い常に「リターン」

に終わるさらに複雑になりますノードそう

<soap:Envelope> 
    <soap:Body> 
    <typ2:LookupThingsReturn> 
     <typ2:wxyz/> 
     <typ2:stuv/> 
    </typ2:LookupThingsReturn> 
    </soap:Body> 
</soap:Envelope> 

は、任意のヘルプやアドバイスをありがたく受け取っ

<soap:Envelope> 
    <soap:Body> 
    <typ2:LookupThingsReturn/> 
    </soap:Body> 
</soap:Envelope> 

になるはずです。

+0

あなたはすでにあなたは「私はすべての空の要素を削除したいのですが、いくつかは、常にべきと言ったときに、自分自身と矛盾しているように見える –

+0

行った作業を表示存在する」。私はあなたが空であるものを除いて、入力ツリーからすべての要素をコピーしたいと思っていると思います。そうすれば、出力ツリーに空のノードが生成されるかもしれません。 –

+0

さらに、入力ツリーで空であっても、これらの要素を必ず結果ツリーにコピーする必要があるなど、第3レベルの入力要素に特別な意味を付けるかどうかは不明です。それとも、空の場合に取り除かなければならない要素の子供だけですか? –

答えて

1

試してみてください。

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[not(node()) and count(ancestor::*) > 2]"/> 

</xsl:stylesheet> 
+0

完璧に見えます。ありがとうございました。 –

+0

良い'>'を '='に変更するとどうなるか注意してください。 –

関連する問題