|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] RE: Fixed Line Length Output
Hi,
> Given the following xml fragment
>
> <item>Len_5</item>
> <item>Len_5</item>
> <item>Length_8</item>
> <item>Length__9</item>
> <item>Length__10</item>
> <item>Len__6</item>
> <item>L_3</item>
> <item>Le_4</item>
> <item>L_3</item>
> ..
>
> I want to create the following output
>
> <line>Len_5 Len_5 Length_8</line>
> <line>Length__9 Length__10</line>
> <line>Len__6 L_3 Le_4 L_3 </line>
>
> I other words , I want to regroup my items into fixed length of lines.
Dimitre already gave you a solution that used a LINE FEED to break the lines, but if you need the line elements, e.g.
<xsl:param name="max" select="20"/>
<xsl:param name="delim" select="' '"/>
<xsl:param name="pad" select="' '"/>
<xsl:template match="*[item]">
<xsl:apply-templates select="item[1]"/>
</xsl:template>
<xsl:template match="item">
<xsl:variable name="count">
<xsl:call-template name="coil"/>
</xsl:variable>
<line>
<xsl:variable name="line">
<xsl:for-each select=". | following-sibling::item[position() <= $count]">
<xsl:if test="not(position() = 1)">
<xsl:value-of select="$delim"/>
</xsl:if>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$line"/>
<xsl:call-template name="fill">
<xsl:with-param name="length" select="string-length($line)"/>
</xsl:call-template>
</line>
<xsl:apply-templates select="following-sibling::item[position() = $count + 1]"/>
</xsl:template>
<xsl:template name="coil">
<xsl:param name="n" select="."/>
<xsl:param name="l" select="0"/>
<xsl:param name="i" select="0"/>
<xsl:choose>
<xsl:when test="$l + boolean($i)+ string-length($n) <= $max and $n">
<xsl:call-template name="coil">
<xsl:with-param name="n" select="$n/following-sibling::item[1]"/>
<xsl:with-param name="l" select="$l + boolean($i) + string-length($n)"/>
<xsl:with-param name="i" select="$i + 1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$i - 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="fill">
<xsl:param name="length" select="0"/>
<xsl:if test="$length < $max">
<xsl:value-of select="$pad"/>
<xsl:call-template name="fill">
<xsl:with-param name="length" select="$length + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
will get you there. Though, you can tokenize the output from Dimitre's stylesheet to get the line element and add padding. Anyhow.
Cheers,
Jarno - Seabound: Contact
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








