xsl-list
[Top] [All Lists]

RE: insert default node if it doesn't exist

2002-09-10 00:47:31
You need to handle this when processing the <a> element, not when
processing its children, otherwise, as you point out, you will insert
the default <c> element once for each child.

<xsl:template match="a">
  <xsl:apply-templates select="*"/>
  <xsl:if test="not(c)"><c>0</c></xsl:if>
</xsl:template>

Michael Kay
Software AG
home: Michael(_dot_)H(_dot_)Kay(_at_)ntlworld(_dot_)com
work: Michael(_dot_)Kay(_at_)softwareag(_dot_)com 

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
Thomas Olausson
Sent: 10 September 2002 01:04
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] insert default node if it doesn't exist


I always have trouble with xslt when processing something once:

Ia certain child doesn't exists, I'd like to insert a default value:

Like the one below. The 2nd 'a' should after processing 
include a <c>0</c> (since it doesn't have it).

before:
<data>
      <a>
              <b>100</b>
              <c>120</c>
      </a>
      <a>
              <b>100</b>
              <g>300</g>
      </a>
</data>
after:
<data>
      <a>
              <b>100</b>
              <c>120</c>
      </a>
      <a>
              <b>100</b>
              <g>300</g>
              <c>0</c>
      </a>
</data>


I've tried with this XSLT. Problem is that since the match 
doesn't find <c> for the 2nd both for b and g, I'll get a <c> 
for everyone of them. How can this be solved?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
      <xsl:output method="xml" version="1.0" encoding="UTF-8" 
indent="yes"/>
      
      <xsl:template match="a/*">
                      <xsl:copy>
                              <xsl:apply-templates 
select="@*|node()"/>                  
              </xsl:copy>
              <xsl:if test="not(../c)">
                      <c>0</c>                        
              </xsl:if>
      </xsl:template>

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

/Thomas


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>