[xsl] Fill the value for multiple element items from preceding non-empty element

Subject: [xsl] Fill the value for multiple element items from preceding non-empty element
From: "E100 SFYang" <SFYang@xxxxxxxxxxxxx>
Date: Wed, 5 Dec 2001 08:46:42 +0800
Hi, Dear listers; 
I have a xml like as following: 
***   xml list ** 
<docs> 
<row> 
<id>1</id> 
<key>10</key> 
</row> 
<row> 
<id></id> 
<key></key> 
</row> 
<row> 
<id>3</id> 
<key>12</key> 
</row> 
<row> 
<id></id> 
<key></key> 
</row> 
<row> 
<id></id> 
<key>10</key> 
</row> 
</docs> 
and want to fill the empty stream with the value from preceding
corresponding element 

**  desired transformed xml list *** 
<docs> 
<row> 
<id>1</id> 
<key>10</key> 
</row> 
<row> 
<id>1</id> 
<key>10</key> 
</row> 
<row> 
<id>3</id> 
<key>12</key> 
</row> 
<row> 
<id>3</id> 
<key>12</key> 
</row> 
<row> 
<id>3</id> 
<key>10</key> 
</row> 
</docs> 
I can get transformation from following xsl list;  but since it deal
with 
with multiple empty stream items (in my case, id and key), 
I feel it is cumbsome to use a lot of xpath 
preceding expression  and xsl:choose elements explicitly.
Is there a neat and clean way for this kind of transformation 
task?   Thanks. 
. 
***  xslt  **** 
<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";> 
<xsl:template match="node()"> 
  <xsl:copy> 
    <xsl:apply-templates select="node()"/> 
  </xsl:copy> 
</xsl:template> 
<xsl:template match="id|key"> 
   <xsl:choose> 
   <xsl:when test="not(string(.))"> 
        <xsl:choose><!--  check id element --> 
         <xsl:when test="name(.)='id'"> 
        <id><xsl:value-of select="preceding::id[string(.)][1]"/></id> 
        </xsl:when> 
        <xsl:when test="name(.)='key'"><!--  check key element --> 
        <key><xsl:value-of select="preceding::key[string(.)][1]"/></key>
</xsl:when> 
        <xsl:otherwise/> 
        </xsl:choose> 
   </xsl:when> 
   <xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise> 
   </xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 


sfyang@xxxxxxxxxxxxx 

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


Current Thread