[XSL] Aantal keer dat een template aangeroepen wordt tellen?

Pagina: 1
Acties:

  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Ik kom hier niet uit. IK zal het even uit leggen.

Dit is wat ik wil hebben uiteindelijk:

code:
1
2
3
4
5
6
7
8
9
10
<table border="1">
    <tr>
        <td>test1 - category:1</td>
        <td>test2 - category:2</td>
    </tr>
    <tr>
        <td>test3 - category:3</td>
        <td>test4 - category:4</td>
    </tr>
</table>


Lijkt simpel, maar toch lukt het me niet. Dit is mijn XML:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<xml>
    <test>
        <text>test1</text>
                                <category>1</category>
    </test>
    <test>
        <text>test2/text>
                                <category>2</category>
    </test>
    <test>
        <text>test3/text>
                                <category>3</category>
    </test>
    <test>
        <text>test4/text>
                                <category>4</category>
    </test>
</xml>


Ik heb nu dit:

code:
1
2
3
4
5
6
7
8
9
10
11
<xsl:template match="test">
    <td><xsl:value-of select="text"/></td>
</xsl:template>

<xsl:template name="row_open">
    <tr>
</xsl:template>

<xsl:template name="row_close">
    </tr>
</xsl:template>


De template match matched met alle test nodes in de XML, maar dan zou je dus 4x een TD naast elkaar krijgen, dus wat ik denk ik moet doen is tellen hoevaak de template is aangeroepen, is dat 2x dan roep ik template row_close aan, en gelijk template row_open aan.

Nu de vraag, is dit mogenlijk.. ik krijg het niet voor elkaar, kan iemand mij opweg helpen..

[ Voor 27% gewijzigd door didio op 09-03-2004 14:44 ]

weinig tot niks..


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 26-05 23:39

mulder

ik spuug op het trottoir

Misschien kan je dit gebruiken:
<xsl:if expr="depth(this) > 2">

oogjes open, snaveltjes dicht


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Ik kom er nog uit, krijg deze error:

Attribute 'expr' is invalid on 'xsl:if'.

Ik ben druk aan het zoeken naar voorbeelden waar ze dit ook gebruiken.

weinig tot niks..


  • mindcrash
  • Registratie: April 2002
  • Laatst online: 22-11-2019

mindcrash

Rebellious Monkey

uhm... hier heb je dus een stel mooie functies voor die al standaard in elke xslt implementatie zitten ... kijk eens bijvoorbeeld naar count() en position() ;)

(overigens kan het dynamisch bouwen van een table met behulp van xml data veel simpeler, maar daar laat ik je eerst zelf even over nadenken ;) )

[ Voor 32% gewijzigd door mindcrash op 05-03-2004 12:43 ]

"The people who are crazy enough to think they could change the world, are the ones who do." -- Steve Jobs (1955-2011) , Aaron Swartz (1986-2013)


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Ik ga het even uitzoeken..

weinig tot niks..


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
mindcrash schreef op 05 maart 2004 @ 12:42:
uhm... hier heb je dus een stel mooie functies voor die al standaard in elke xslt implementatie zitten ... kijk eens bijvoorbeeld naar count() en position() ;)

(overigens kan het dynamisch bouwen van een table met behulp van xml data veel simpeler, maar daar laat ik je eerst zelf even over nadenken ;) )
Kan je niet een tipje van de sluier oplichten over het makkelijker bouwen van tables.. ik heb heel google grijs gesurft maar er nog niets over gevonden, is ook moeilijk als je niet weet waarnaar je moet zoeken.

[ Voor 9% gewijzigd door didio op 05-03-2004 16:46 ]

weinig tot niks..


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Een vriend van mij heeft me al behoorlijk verder geholpen, maar het is nog steeds niet gelukt. Ik heb nu wel al twee rijen naast elkaar alleen dezelfde data staat er in.

Ik heb deze code nu:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<xsl:template match="test">
    <table border="1">

    <xsl:for-each select=".">
        <xsl:if test="(position() mod 2) = 1">
            <TR>
                                    <TD>
                    <xsl:call-template name="Ad"/>
                </TD>
                    <TD>
                    <xsl:if test="following-sibling::test[position()=1]">
                        <xsl:call-template name="Ad"/>
                    </xsl:if>
                </TD>
                 </TR>
        </xsl:if>
    </xsl:for-each>
    </table>
</xsl:template>

<xsl:template name="Ad">
    <xsl:value-of select="text"/> - category:<xsl:value-of select="category"/>
</xsl:template>


Maar krijg deze deze code terug:

code:
1
2
3
4
5
6
7
8
9
10
<table border="1">
    <tr>
        <td>test1 - category:1</td>
        <td>test1 - category:1</td>
    </tr>
    <tr>
        <td>test2 - category:2</td>
        <td>test2 - category:2</td>
    </tr>
</table>


Wat doe ik nou nog fout?

[ Voor 44% gewijzigd door didio op 09-03-2004 14:51 ]

weinig tot niks..


  • B-Man
  • Registratie: Februari 2000
  • Niet online
Volgens mij voer je hier enkel een test uit:
code:
1
2
3
<xsl:if test="following-sibling::test[position()=1]">
                        <xsl:call-template name="Ad"/>
                    </xsl:if>

terwijl je eigenlijk je template "Ad" de volgende row wil laten verwerken. Hoe dat moet weet ik zelf niet (misschien maar eens uitzoeken, hmmm), maar ik vermoed dat het in die hoek zit.

  • B-Man
  • Registratie: Februari 2000
  • Niet online
probeer het eens met:

-- deze code deed het niet

Eerste poging met XSLT overigens, dus weet niet zeker of het werkt ;)

[ Voor 78% gewijzigd door B-Man op 10-03-2004 14:59 ]


  • B-Man
  • Registratie: Februari 2000
  • Niet online
Als XSLT newbie is het me gelukt, ajb:

Je XML bestand:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>

<xml>
    <test>
        <text>test1</text>
        <category>1</category>
    </test>
    <test>
        <text>test2</text>
        <category>2</category>
    </test>
    <test>
        <text>test3</text>
        <category>3</category>
    </test>
    <test>
        <text>test4</text>
        <category>4</category>
    </test>
</xml>


En je XSL bestand:
code:
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
<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="*">
    <table border="1">

    <xsl:for-each select="test">
        <xsl:if test="position() mod 2 = 1">
            <xsl:call-template name="Ad"/>
        </xsl:if>
    </xsl:for-each>
    </table>
</xsl:template>

<xsl:template name="Ad">
    <TR>
        <TD>
            <xsl:value-of select="text"/> - category:<xsl:value-of select="category"/>
        </TD>
        <TD>
            <xsl:value-of select="following-sibling::test/text"/> - category:<xsl:value-of select="following-sibling::test/category"/>
        </TD>
    </TR>    
</xsl:template>

</xsl:stylesheet>


Graag gedaan ;)

  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
heel erg bedankt..

weinig tot niks..

Pagina: 1