I'm using XSLT 1.0 Input xml document:
<Table>
<Numbers>10,100,1000</Numbers>
<Values>
<Value>1</Value>
<Value>2</Value>
<Value>3</Value>
</Values>
</Table>
Expected output:
<Table>
<Results>
<Values>
<Value>1</Value>
<Number>10</Number>
</Values>
<Values>
<Value>2</Value>
<Number>100</Number>
</Values>
<Values>
<Value>3</Value>
<Number>1000</Number>
</Values>
</Results>
</Table>
I've implemented common solution for tokenize function in XSLT 1.0, described here: http://www.heber.it/?p=1088
Current implementation:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<table name="Results">
<xsl:variable name="Numbers">
<xsl:value-of select="Table/Numbers"/>
</xsl:variable>
<Results>
<xsl:for-each select="Table/Values/Value">
<Values>
<xsl:variable name="Value" select="."/>
<xsl:variable name="n" select="count(preceding-sibling::*)+1."/>
<Value>
<xsl:value-of select="$Value"/>
</Value>
<xsl:call-template name="tokenizeString">
<xsl:with-param name="list" select="$Numbers"/>
<xsl:with-param name="delimiter" select="','"/>
</xsl:call-template>
</Values>
</xsl:for-each>
</Results>
</table>
</xsl:template>
<xsl:template name="tokenizeString">
<!--passed template parameter -->
<xsl:param name="list"/>
<xsl:param name="delimiter"/>
<xsl:choose>
<xsl:when test="contains($list, $delimiter)">
<!-- get everything in front of the first delimiter -->
<Number>
<xsl:value-of select="substring-before($list,$delimiter)"/>
</Number>
<xsl:call-template name="tokenizeString">
<!-- store anything left in another variable -->
<xsl:with-param name="list" select="substring-after($list,$delimiter)"/>
<xsl:with-param name="delimiter" select="$delimiter"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<Number>
<xsl:value-of select="$list"/>
</Number>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Current output:
<table xmlns:fo="http://www.w3.org/1999/XSL/Format" name="Results">
<Results>
<Values>
<Value>1</Value>
<Number>10</Number>
<Number>100</Number>
<Number>1000</Number>
</Values>
<Values>
<Value>2</Value>
<Number>10</Number>
<Number>100</Number>
<Number>1000</Number>
</Values>
<Values>
<Value>3</Value>
<Number>10</Number>
<Number>100</Number>
<Number>1000</Number>
</Values>
</Results>
</table>
But the output is not correct. I can't get, how can I return results, after applying the tokenize template, in correct order, but not all of those for each Value node.
It is clear how to implement the same using XSLT 2.0, as there I can do following:
<xsl:variable name"Foo" select="tokenize($string,$delimter)[$n]">
Update: solution to use node-set works fine to me to represent tokenize function, using XSLT1. But I got another case, which is additional to initial requirements. The case is to have only one Number corresponding to a set of Values:
<Table>
<Foo>
<Numbers>10,100,1000</Numbers>
<Values>
<Value>1</Value>
<Value>2</Value>
<Value>3</Value>
</Values>
</Foo>
<Foo>
<Numbers>10</Numbers>
<Values>
<Value>4</Value>
<Value>5</Value>
<Value>6</Value>
</Values>
</Foo>
</Table>
Expected output:
<Table>
<Results>
<Values>
<Value>1</Value>
<Number>10</Number>
</Values>
<Values>
<Value>2</Value>
<Number>100</Number>
</Values>
<Values>
<Value>3</Value>
<Number>1000</Number>
</Values>
</Results>
<Results>
<Values>
<Value>4</Value>
<Number>10</Number>
</Values>
<Values>
<Value>5</Value>
<Number>10</Number>
</Values>
<Values>
<Value>6</Value>
<Number>10</Number>
</Values>
</Results>
</Table>
My vision is to add following condition to michael-hor257k:
<Number>
<xsl:choose>
<xsl:when test="$numbers-set[$i] != ''">
<xsl:value-of select="$numbers-set[$i]"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$numbers-set[1]"/>
</xsl:otherwise>
</xsl:choose>
</Number>
Does that looks sensible or I can avoid hardcode and place such case in template?