Хороший вопрос, + 1.
Мне кажется, что вместо :
<xsl:value-of select="$test1[position()]" />
это должно быть :
<xsl:value-of select="$test1[position() = current()]" />
Точно такое же наблюдение справедливо для второго <xsl:value-of>
Пояснение :
Любое выражение
$var[position()]
эквивалентно:
$var
, поскольку position()
может иметь только значения> = 1, а [position()]
означает логическое значение position()
илогическое значение любого неотрицательного числа по определению равно true()
.
Если мы хотим выбрать $ k-й узел в наборе узлов $ var, в XPath 1.0, который имеет слабую типизацию инеизвестно, что $k
содержит целое число, мы должны написать:
$var[position() = $k]
Вот полное, соответствующее решение XSLT 2.0 :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="test1" select=
"tokenize('1$,$2$,$3$,$4$,$5','\$,\$')" />
<xsl:variable name="test2" select=
"tokenize('a$,$b$,$c$,$d$,$e','\$,\$')" />
<xsl:for-each select="tokenize('1a$,$2b$,$3c$,$4d$,$5e','\$,\$')">
<row>
<cell Index="1">
<xsl:value-of select="$test1[position()]" />
</cell>
<cell Index="2">
<xsl:value-of select="$test2[position()]" />
</cell>
</row>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
при применении к любому XML-документу (игнорируется), получается нужный, правильный результат :
<row xmlns:xs="http://www.w3.org/2001/XMLSchema">
<cell Index="1">1 2 3 4 5</cell>
<cell Index="2">a b c d e</cell>
</row>
<row xmlns:xs="http://www.w3.org/2001/XMLSchema">
<cell Index="1">1 2 3 4 5</cell>
<cell Index="2">a b c d e</cell>
</row>
<row xmlns:xs="http://www.w3.org/2001/XMLSchema">
<cell Index="1">1 2 3 4 5</cell>
<cell Index="2">a b c d e</cell>
</row>
<row xmlns:xs="http://www.w3.org/2001/XMLSchema">
<cell Index="1">1 2 3 4 5</cell>
<cell Index="2">a b c d e</cell>
</row>
<row xmlns:xs="http://www.w3.org/2001/XMLSchema">
<cell Index="1">1 2 3 4 5</cell>
<cell Index="2">a b c d e</cell>
</row>