Toon posts:

[xsl] tokenize alternatief

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik heb in een xsl stylesheet een string die een spatiegescheiden lijst voorsteld. Nu wil ik in een loopje items uit die lijst pikken. Heel nuttig hiervoor is de xpath tokenize() functie, alleen is die helaas nog niet echt geimplementeerd ergens.

Wat rondzoeken bracht me wel op een alternatief: http://www.exslt.org/str/...okenize/str.tokenize.html

dit is een template een string netjes kan splitsen, werkt prima, alleen deze jongen geeft een nodeset terug, iets als
XML:
1
2
3
4
5
<token>20060429</token>
<token>20060430</token>
<token>20060501</token>
<token>20060502</token>
<token>20060503</token>


en nu wil ik eigenlijk iedere keer in die loop precies 1 element daarvan hebben, maar hoe doe ik dat nu?

erg versimpeld heb ik dit:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<xsl:param name="calSequence" select="'20060429 20060430 20060501 20060502 20060503'"/>

<xsl:template match="/">
    <table>
        <xsl:call-template name="rows">
            <xsl:with-param name="start" select="0"/>
            <xsl:with-param name="end" select="3"/>
        </xsl:call-template>
    </table>
</xsl:template>

<xsl:template name="rows">
    <xsl:param name="start" />
    <xsl:param name="end" />
    <xsl:param name="counter" select="0" />
    <xsl:if test="$start &lt;= $end">
        <tr>
            <td>[hier dus nr 1]</td>
            <td>[hier nr 2 en de volgende loop 3 en 4 etc]</td>
        </tr>
        <xsl:call-template name="rows">
            <xsl:with-param name="start" select="$start+1"/>
            <xsl:with-param name="end" select="$end"/>
            <xsl:with-param name="counter" select="$counter+1"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

[ Voor 41% gewijzigd door Verwijderd op 29-04-2006 19:14 ]


Verwijderd

Topicstarter
flops, zelf maar antwoord geven

na een hoop gezoek en voorbeelden bekeken te hebben ben ik zelf aan de slag gegaan, bleek uiteindelijk toch een stuk simpeler dan verwacht, bovendien is het ook wat toegespitster op wat ik wilde (het zoveelste item uit een lijst)

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<xsl:template name="item-at">
    <xsl:param name="string" />
    <xsl:param name="delimiter" select="' '" />
    <xsl:param name="index" />
    
    <xsl:choose>
        <xsl:when test="not(contains($string,$delimiter))">
            <xsl:value-of select="$string"/>
        </xsl:when>
        <xsl:when test="$index=0">
            <xsl:value-of select="substring-before($string,$delimiter)"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:call-template name="item-at">
                <xsl:with-param name="string" select="substring-after($string,$delimiter)"/>
                <xsl:with-param name="delimiter" select="$delimiter"/>
                <xsl:with-param name="index" select="$index - 1"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

voordeel/nadeel/feature is dat als je een hogere index meegeeft dan wat erin zit, dat ie dan de laatste blijft teruggeven.

Aanroep voorbeeld:
XML:
1
2
3
4
<xsl:call-template name="item-at">
    <xsl:with-param name="string" select="aap noot mies"/>
    <xsl:with-param name="index" select="0"/>
</xsl:call-template>

als default neemt ie de spatie als scheidingskarakter, maar heb even ingebouwd dat je ook wat anders kan meegeven.