Re: [xsl] How to prevent copying non-existing elements?

Subject: Re: [xsl] How to prevent copying non-existing elements?
From: Michael Ludwig <mlu@xxxxxxxxxxxxx>
Date: Tue, 04 Aug 2009 15:16:10 +0200
Ben Stover schrieb:
Lets start with the following simplified piece of XSLT code :

<xsl:template match="/">
   ....
  <moxx:someelement>
      <xsl:value-of select="/moxx:aaa/moxx:bbb"/>
  </moxx:someelement>
  ....

So when bbb is an optional element and it does NOT exist in the source
XML then the following chunk is still created in the target XML doc:

<moxx:someelement></moxx:someelement>

How can I prevent the creation of these frame element tags when there
is no source element?

You will want to learn about the difference between *pull* processing (your pseudocode and Michael Kay's XSLT example and Martin's "verbose way") and *push* processing (Martin's first suggestion, and my example below).

Also, you will want to learn about the identity template, which is a
very common and important XSLT pattern, given below.

<xsl:stylesheet version="1.0"
  xmlns:moxx="net.moxx"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

  <xsl:template match="/">
    <moxx:root>
      <xsl:apply-templates select="moxx:aaa/moxx:bbb"/>
    </moxx:root>
  </xsl:template>

  <xsl:template match="moxx:bbb"><!-- or moxx:aaa/moxx:bbb
    for greater precision in matching -->
    <moxx:someelement>
      <xsl:apply-templates/>
    </moxx:someelement>
  </xsl:template>

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

</xsl:stylesheet>

Michael Ludwig

Current Thread