OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: multiple attribute values in XSL



On Fri, May 11, 2001 at 04:33:11PM +0200, Lyndon J B Nixon wrote:
> hi,
> 
> i couldnt find any help on this online, so i hope someone on list can give 
> me some pointers
> 
> i want to transform a XML tag with an attribute with multiple values into 
> multiple tags each of which is determined by each
> of the attribute values, eg.
> 
> <X position="1,2,3"/>
> 
> is transformed by XSLT into
> 
> <Y value="1"/>
> <Y value="2"/>
> <Y value="3"/>
> 
> is there a way to do this?

Yes.

Here's a sample transform.  If you have trouble deciphering this, 
please read up on recursion, or better yet, a good text on LISP or Scheme.

<xsl:template match="X">
 <root>
 <xsl:call-template name="emit-Y">
  <xsl:with-param name="first" select="substring-before(@position, ',')"/>
  <xsl:with-param name="rest" select="substring-after(@position, ',')"/>
 </xsl:call-template>
 </root>
</xsl:template>

<xsl:template name="emit-Y">
 <xsl:param name="first"/>
 <xsl:param name="rest"/>

 <Y value="{$first}"/>

 <xsl:if test="$rest">
  <xsl:choose>
   <xsl:when test="contains($rest, ',')">
    <xsl:call-template name="emit-Y">
     <xsl:with-param name="first" select="substring-before($rest,',')"/>
     <xsl:with-param name="rest" select="substring-after($rest,',')"/>
    </xsl:call-template>
   </xsl:when>
   <xsl:otherwise>
    <xsl:call-template name="emit-Y">
     <xsl:with-param name="first" select="$rest"/>
    </xsl:call-template>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:if>
</xsl:template>

Z.