xsl-list
[Top] [All Lists]

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

2009-08-04 09:16:50
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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--