[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: multiple attribute values in XSL
- From: Adam Turoff <ziggy@panix.com>
- To: Lyndon J B Nixon <nixon@fokus.gmd.de>
- Date: Fri, 11 May 2001 11:42:43 -0400
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.