XSL: проблема с токенизацией в цикле for - PullRequest
1 голос
/ 01 декабря 2011

Я использую следующую таблицу стилей для отображения таблицы в книге Excel с данными. Я не могу получить желаемый результат, вместо этого он отображается так же, как указано ниже.

Предложения Pls?

Используемая таблица стилей:

<xsl:stylesheet>
<xsl:template match="/">
    <xsl:variable name="test1" select="str:tokenize('1$,$2$,$3$,$4$,$5','$,$')" />
    <xsl:variable name="test2" select="str:tokenize('a$,$b$,$c$,$d$,$e','$,$')" />
    <xsl:for-each select="str:split('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>

Ожидаемый результат:

1 a

2 б

3 с

4 д

5 е

Где в результате отображается как

a b

c d

е

Похоже, он отображает последние значения токенизации. Как получить уважаемые ценности.

1 Ответ

2 голосов
/ 01 декабря 2011

Хороший вопрос, + 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>
...