2012-03-26 8 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> 

Выходной файл должен сохранить элемент с, но цифры в элементе должны исчезнуть.

<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 Output

<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: Да. Сохранение этой избыточности позволяет одному и тому же коду правильно обрабатывать не только конкретный предоставленный документ, но и класс документов, некоторые из которых будут иметь атрибуты. –

Смежные вопросы