Reputation: 270
I'd like to repeatedly add a elect to and xml structure, the number of times depends on a value attribute.
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="zahlen.xsl" type="text/xsl"?>
<numbers>
<number value="8"/>
<number value="3"/>
<number value="13"/>
<number value="2"/>
<number value="9"/>
</numbers>
I have this XSLT that returns each number one time
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="numbers/number">
<p> <xsl:value-of select="@value"/></p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
what I want is something like:
<?xml version="1.0" encoding="utf-8"?>
<p>8 8 8 8 8 8 8 8</p>
<p>3 3 3</p>
<p>13 13 13 13 13 13 13 13 13 13 13 13 13</p>
<p>2 2</p>
<p>9 9 9 9 9 9 9 9 9</p>
I tried to look for loop examples for xslt, but I can't reproduce them.
Upvotes: 0
Views: 103
Reputation: 2714
Here's a solution in XSLT 1.0 that uses a recursive template.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<output>
<xsl:apply-templates select="numbers/number"/>
</output>
</xsl:template>
<xsl:template match="number">
<p>
<xsl:call-template name="iteration">
<xsl:with-param name="number" select="@value"/>
<xsl:with-param name="iter" select="@value"/>
</xsl:call-template>
</p>
</xsl:template>
<xsl:template name="iteration">
<xsl:param name="number"/>
<xsl:param name="iter"/>
<xsl:if test="$iter>0">
<xsl:value-of select="concat($number,' ')"/>
<xsl:call-template name="iteration">
<xsl:with-param name="number" select="$number"/>
<xsl:with-param name="iter" select="$iter - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
See it working here: https://xsltfiddle.liberty-development.net/6q1SDkS
Upvotes: 1