JoeLeBaron
JoeLeBaron

Reputation: 348

XSLT to remove an Element's Value

I need to remove a value from an element, but preserve the element itself in the output XML as an empty element.

My input file:

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

The output file should retain element c, but the numbers in the element should be gone.

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

Upvotes: 3

Views: 3707

Answers (2)

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243599

Even simpler/shorter:

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

Upvotes: 3

Daniel Haley
Daniel Haley

Reputation: 52888

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>

Note: <c/> and <c></c> are equivalent.

Upvotes: 1

Related Questions