2012-03-26 29 views
3

要素から値を削除する必要がありますが、要素自体を出力XMLに空要素として保持する必要があります。要素の値を削除するXSLT

私の入力ファイル:

<a> 
    <b>TEXT1 
     <c>123</c> 
     <d>qwe</d> 
     <e>rty</e> 
    </b> 
    <b>TEXT2 
    <c>345</c> 
    <d>iop</d> 
    <e>jkl</e> 
    </b> 
</a> 

は、出力ファイルには、要素cを保持する必要がありますが、要素内の数字は消えてしなければなりません。

<a> 
<b>TEXT1 
    <c></c> 
    <d>qwe</d> 
    <e>rty</e> 
</b> 
<b>TEXT2 
    <c></c> 
    <d>iop</d> 
    <e>jkl</e> 
</b> 
</a> 

答えて

0

XSLT 1.0

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

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

    <xsl:template match="c"> 
    <c/> 
    </xsl:template> 

</xsl:stylesheet> 

XML出力

<a> 
    <b>TEXT1 
    <c/> 
     <d>qwe</d> 
     <e>rty</e> 
    </b> 
    <b>TEXT2 
    <c/> 
     <d>iop</d> 
     <e>jkl</e> 
    </b> 
</a> 

注:<c/><c></c>は同等です。

3

短い/さらに簡単:

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

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

<xsl:template match="c/text()"/> 
</xsl:stylesheet> 
+0

そしてもちろんの|ソースドキュメント属性が格納されていない場合は、 "@ *" は冗長です。 –

+2

@MichaelKay:はい。この冗長性を保つことで、特定の提供されたドキュメントだけでなく、属性のあるドキュメントのクラスを同じコードで正しく処理することができます。 –

関連する問題