XSLT to remove element value

I need to remove the value from an element, but keep 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 contain element c, but the numbers in the element should disappear.

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

      

+3


source to share


2 answers


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 are <c></c>

equivalent.

+1


source


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>

      

+3


source







All Articles