Toon posts:

sorteren met XSL-stylesheet met for-each lus

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ben nu bezig om de elementen <subst> (betekent zelfstandig nw), <verbum> (=werkwoord), <adverbum> (=bijwoord) en <ptc> (=participium) uit een Latijnse tekst te halen om in een tabel met 4 kolommen te zetten. Probleem is de weergave: als ik nl. <xsl:value-of select="tekst/subst"/> zou gebruiken dan krijg ik natuurlijk maar één resultaat te zien in de kolom Substantivum. Nu wil ik dit oplossen met een for-each lus met daarin een <br/>, zodat alle resultaten onder elkaar in de kolommen van de tabel komen te staan. Probleem is, dat als ik deze aan zou roepen, dat dan alle resultaten zonder spaties direct na elkaar komen te staan i.p.v. onder elkaar. Hoe los ik dit op? :? Hier de code:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- dit is het begin van het xsl en html-gedeelte -->
<xsl:template match="/">
<html>
<h1 align="center">
Sortering op zn, ww, bijw en ptc</h1>
<style>
body {
background-color: lightblue;
}</style>
<body>
<table border="1" cellpadding="4" cellspacing="0">
<tr>
<th>Substantivum</th>
<th>Verbum</th>
<th>Adverbum</th>
<th>Participium</th>
</tr>
<xsl:apply-templates select="latijn/livius"/>
</table>
</body>
</html>
</xsl:template>
<!-- het html en xsl gedeelte wordt afgesloten en een sjabloon wordt gedefinieerd-->
<xsl:template match="latijn/livius">
<tr>
<td>
<!-- dit zou 1 resultaat leveren-->
<xsl:value-of select="tekst/subst"/>
</td>
<td>
<!-- dit geeft alle resultaten, maar niet onder elkaar-->
<xsl:apply-templates select="tekst/verbum"/>
</td>
<td>
<xsl:apply-templates select="tekst/adv"/>
</td>
<td>
<xsl:apply-templates select="tekst/ptc"/>
</td>
</tr>
</xsl:template>
<!-- een template om ervoor te zorgen dat de substantiva onder elkaar komen te staan, wordt aangemaakt-->
<xsl:template match="livius">
<xsl:for-each select="tekst">
<xsl:value-of select="subst"/>
<br/>
</xsl:for-each>
<br/>
</xsl:template>
<!-- ook voor de werkwoorden is dit nodig -->
<!--
<xsl:template match="livius">
<xsl:for-each select="tekst">
<xsl:value-of select="verbum"/>
<br/>
</xsl:for-each>
<br/>
</xsl:template>-->
</xsl:stylesheet>

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
a) gaan we hier niet je code debuggen; wat heb je zelf al geprobeerd?
b) gebruik code tags, dan zien we ook hoe je inspringt en is het al een stuk leesbaarder
c) dit al eens bekeken? Gebruik gewoon een xsl:sort...
d) gezien je historie is het misschien niet onverstandig om eens een tutorial XML/XSL te volgen alvorens je ermee aan de slag gaat. Je hebt het denk ik nog niet helemaal onder de knie.

Begrijp me niet verkeerd, ik wil we willen je best helpen, maar dat gaat zo natuurlijk nooit. Het moet van 2 kanten komen...
Enniewee, een xsl:sort zou dat dus moeten fixen...

[ Voor 66% gewijzigd door RobIII op 16-11-2004 18:23 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

code:
1
2
3
  </tr>
  <xsl:apply-templates select="latijn/livius"/>
</table>
^^ maak eerst je html eens in orde...

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 16 november 2004 @ 17:40:
code:
1
2
3
  </tr>
  <xsl:apply-templates select="latijn/livius"/>
</table>
^^ maak eerst je html eens in orde...
Wat is daar mis mee als je in die template weer een <tr> opent? Of bedoel je iets anders?

[ Voor 26% gewijzigd door RobIII op 16-11-2004 17:44 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Sorry, hoor ROBIII, ben nog maar een beginner. Had net de hele code mét inspringende tekst ingevoerd, maar deze hele opmaak is links uitgelijnd door het tekstveld, denk ik. In ieder geval is het document well-formed en valid. Heb dat allemaal al gecheckt.
Het gaat erom dat ik bij sortering ofwel slechts 1 resultaat krijg ofwel álle resultaten direct ná elkaar i.p.v. onder elkaar.
dus:
<td>
<!-- dit geeft alle resultaten, maar niet onder elkaar-->
<xsl:apply-templates select="tekst/verbum"/>
</td>

terwijl:

<xsl:template match="livius">
<xsl:for-each select="tekst">
<xsl:value-of select="subst"/>
<br/>
</xsl:for-each>
<br/>
</xsl:template>

alle resultaten zou moeten geven onder elkaar, maar dit niet doet. Weet ook niet waarom; de code zelf met de for-each lus klopt volgens mij wel.

Nog een vraagje, hoe krijg ik de boel juist op een schermpje op dit forum met inspringende delen?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 16 november 2004 @ 18:03:
Sorry, hoor ROBIII, ben nog maar een beginner.
Dat is geen excuus om niet te hoeven zoeken, we hebben het allemaal moeten leren ;) Maar ik ben ook helemaal niet boos (toegegeven: mijn post klinkt wat chagerijniger dan bedoeld :> ). Het is hier gewoon gebruikelijk dat je zelf laat zien wat je allemaal geprobeerd hebt, wat er dan niet aan werkt, en waar je vermoedt dat je fout zit. Als je hier een joekel van een XSL dumpt, gaan wij ons daar niet blind op staren (zeker niet als je die code tags niet gebruikt). Als je alleen het stukje had gedumpt waar het probleem (volgens jou) in zit, was het al een stuk makkelijker geweest voor ons om je te helpen... Snappie? :)
Verwijderd schreef op dinsdag 16 november 2004 @ 18:03:
Had net de hele code mét inspringende tekst ingevoerd, maar deze hele opmaak is links uitgelijnd door het tekstveld, denk ik.
Dat komt omdat je geen [code] en [/code] tags gebruikt.
Verwijderd schreef op dinsdag 16 november 2004 @ 18:03:
In ieder geval is het document well-formed en valid. Heb dat allemaal al gecheckt.
Dat geloof ik meteen. Dat zal ook niet het probleem zijn.
Verwijderd schreef op dinsdag 16 november 2004 @ 18:03:
Het gaat erom dat ik bij sortering ofwel slechts 1 resultaat krijg ofwel álle resultaten direct ná elkaar i.p.v. onder elkaar.
Ik zie die xsl:sort anders nergens terug :? Hoe sorteer je dan?
Verwijderd schreef op dinsdag 16 november 2004 @ 18:03:
dus:
code:
1
2
3
4
<td>
       <!-- dit geeft alle resultaten, maar niet onder elkaar-->
       <xsl:apply-templates select="tekst/verbum"/>
</td>


terwijl:

code:
1
2
3
4
5
6
7
<xsl:template match="livius">
       <xsl:for-each select="tekst">
       <xsl:value-of select="subst"/>
       <br/>
       </xsl:for-each>
<br/>
</xsl:template>

alle resultaten zou moeten geven onder elkaar, maar dit niet doet. Weet ook niet waarom; de code zelf met de for-each lus klopt volgens mij wel.
Dat 2e voorbeeld ziet er prima uit op het eerste gezicht. Zou inderdaad een line break moeten opleveren na iedere "subst" node... Maak er eens dit van:
code:
1
2
3
4
5
6
7
<xsl:template match="livius">
       AAA<xsl:for-each select="tekst">
       BBB<xsl:value-of select="subst"/>
       <br/>CCC
       </xsl:for-each>DDD
<br/>
</xsl:template>

Wat zie je dan?
Verwijderd schreef op dinsdag 16 november 2004 @ 18:03:
Nog een vraagje, hoe krijg ik de boel juist op een schermpje op dit forum met inspringende delen?
Zie hierboven in deze post ergens :Y)

[ Voor 34% gewijzigd door RobIII op 16-11-2004 18:19 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Heb het net eens geprobeerd met xsl:sort (zie onder), maar elke kolom werd weer met 1 resultaat gevuld en weet nu niet hoe ik hier een break-commando in kan krijgen. Ik zal je laatste suggestie ook eens proberen.

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
27
28
29
30
    <xsl:template match="/">
        <html>
            <h1 align="center">
                Sortering op zn, ww, bijw en ptc</h1>
            <style>
    body {
    background-color: lightblue;
    }</style>
            <body>
                <table border="1" cellpadding="4" cellspacing="0">
                    <tr>
                        <th>Substantivum</th>
                        <th>Verbum</th>
                        <th>Adverbum</th>
                        <th>Participium</th>
                    </tr>
                    <xsl:for-each select="latijn/livius">
                    <xsl:sort select="livius/tekst"/>
                    <tr>
                    <td><xsl:value-of select="tekst/subst"/></td>
                                        <td><xsl:value-of select="tekst/verbum"/></td>
                    <td><xsl:value-of select="tekst/adv"/></td>
                    <td><xsl:value-of select="tekst/ptc"/></td>
                    </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
    </xsl:stylesheet>

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 16 november 2004 @ 18:31:
Heb het net eens geprobeerd met xsl:sort (zie onder), maar elke kolom werd weer met 1 resultaat gevuld en weet nu niet hoe ik hier een break-commando in kan krijgen. Ik zal je laatste suggestie ook eens proberen.
Het probleem (geen break) staat los van de sortering lijkt me. Verder is het geen break "commando" maar een break "element" of "tag" ;) . Ik ben erg benieuwd naar de output van mijn suggestie.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
In de kolom Substantivum kwam het volgende te staan:
AAA BBBaugurium
CCC DDD

Dat 'augurium' is het eerste zn uit mijn tekst.

Verwijderd

Topicstarter
Heb m'n XSL-stylesheet nog eens ingekort en nu wel in code gezet. De sortering werkt wel, maar geeft helaas in elke kolom maar 1 waarde, waar er juist meerdere waarden onder elkaar zouden moeten komen te staan, ondanks het feit dat er linebreaks ingevoegd zijn.

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- dit is het begin van het xsl en html-gedeelte -->
    <xsl:template match="/">
        <html>
            <h1 align="center">
                Sortering op zn, ww, bijw en ptc</h1>
            <style>
    body {
    background-color: lightblue;
    }</style>
            <body>
                <table border="1" cellpadding="4" cellspacing="0">
                        <tr>
                            <th>Substantivum</th>
                            <th>Verbum</th>
                            <th>Adverbum</th>
                            <th>Participium</th>
                        </tr>
                        <xsl:apply-templates select="latijn/livius"/>
                </table>
            </body>
        </html>
</xsl:template>
<!-- het html en xsl gedeelte wordt afgesloten en een sjabloon wordt gedefinieerd-->

<xsl:template match="livius">
        <tr>
            <td>
    <xsl:for-each select="tekst">
    <xsl:value-of select="subst"/>
    <br/>
    </xsl:for-each>
            </td>
            <td>
    <xsl:for-each select="tekst">
    <xsl:value-of select="verbum"/>
    <br/>
    </xsl:for-each>
            </td>
            <td>
    <xsl:for-each select="tekst">
    <xsl:value-of select="adv"/>
    <br/>
    </xsl:for-each>
            </td>
            <td>
    <xsl:for-each select="tekst">
    <xsl:value-of select="ptc"/>
    <br/>
    </xsl:for-each>
            </td>           
        </tr>
</xsl:template>
</xsl:stylesheet>

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 16 november 2004 @ 20:23:
Heb m'n XSL-stylesheet nog eens ingekort en nu wel in code gezet. De sortering werkt wel, maar geeft helaas in elke kolom maar 1 waarde, waar er juist meerdere waarden onder elkaar zouden moeten komen te staan, ondanks het feit dat er linebreaks ingevoegd zijn.
Heb je de HTML output al eens bekeken? Zit daar niks geks in?
Heb je ook een XML bestand dat er bij hoort? Dan kan ik het hier eens proberen...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
hier is mijn xml-bestand: Sorry dat de tekst zo langgerekt is. Dat heeft XMLShell vanzelf gedaan. Het stond eerst kort bij elkaar, maar goed.
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="sorteringTEST.xsl"?>
<!DOCTYPE latijn [
<!ELEMENT latijn (livius+)>
<!ELEMENT livius (titel, liber, caput, paragraaf, tekst, vertaling, bronvermelding)>
<!ELEMENT titel (#PCDATA)>
<!ELEMENT liber (#PCDATA)>
<!ELEMENT caput (#PCDATA)>
<!ELEMENT paragraaf (#PCDATA)>
<!ELEMENT tekst (tijdsbepaling*| eigennaam+ | subst+ | verbum+ | telw+ | adv+ | ptc+ | prep+ | pron_refl+ | pron_indef+ | pron_poss+ | pron_dem+ | cj+ |adj+| leesteken+)*>

<!ELEMENT tijdsbepaling (#PCDATA)>
<!ELEMENT eigennaam (#PCDATA)>
<!ELEMENT subst (#PCDATA)>  <!-- substantivum, zelfstandig naamwoord-->
<!ELEMENT verbum (#PCDATA)> <!-- werkwoord-->
<!ELEMENT telw (#PCDATA)>
<!ELEMENT adv (#PCDATA)>    <!-- adverbium, bijwoord-->
<!ELEMENT ptc (#PCDATA)>    <!-- participium -->
<!ELEMENT prep (#PCDATA)>   <!-- prepositie, voorzetsel -->
<!ELEMENT pron_refl (#PCDATA)> <!-- pronomen reflexivum, wederkerend voornaamwoord-->
<!ELEMENT pron_indef (#PCDATA)> <!-- pronomen indefinitum, onbepaald voornaamwoord-->
<!ELEMENT pron_poss (#PCDATA)>  <!-- pronomen possessivum, bezittelijk voornaamwoord-->
<!ELEMENT pron_dem (#PCDATA)>   <!-- pronomen demonstrativum, aanwijzend voornaamwoord-->
<!ELEMENT cj (#PCDATA)> <!-- conjunctie, voegwoord-->
<!ELEMENT adj (#PCDATA)>    <!-- adjectivum, bijvoeglijk naamwoord-->
<!ELEMENT leesteken (#PCDATA)>  <!-- omdat leestekens niet in de oorspronkelijke tekst stonden, zijn deze apart toegevoegd-->

<!ELEMENT vertaling (#PCDATA)>
<!ELEMENT bronvermelding (vnaam, anaam, datum)>
<!ELEMENT vnaam (#PCDATA)>
<!ELEMENT anaam (#PCDATA)>
<!ELEMENT datum (#PCDATA)>
]>
<!-- einde DTD, begin XML-document-->
<latijn>
    <livius>
        <titel>Ab urbe condita/ Sinds de stichting van de stad</titel>
        <liber>Een</liber>
        <caput>Zeven</caput>
        <paragraaf>1-3</paragraaf>
        <tekst>
            <tijdsbepaling>priori</tijdsbepaling>
            <eigennaam>Remo</eigennaam>
            <subst>augurium</subst>
            <verbum>venisse</verbum>
            <verbum>fertur</verbum>
            <leesteken>,</leesteken>
            <telw>sex</telw>
            <subst>vultures</subst>
            <leesteken>,</leesteken>
            <adv>iamque</adv>
            <ptc>nuntiato</ptc>
            <subst>augurio</subst>
            <prep>cum</prep>
            <telw>duplex</telw>
            <subst>numerus</subst>
            <eigennaam>Romulo</eigennaam>
            <pron_refl>se</pron_refl>
            <verbum>ostendisset</verbum>
            <leesteken>,</leesteken>
            <pron_indef>utrumque</pron_indef>
            <subst>regem</subst>
            <pron_poss>sua</pron_poss>
            <subst>multitudo</subst>
            <verbum>consalutaverat</verbum>
            <leesteken>:</leesteken>
            <subst>tempore</subst>
            <pron_dem>illi</pron_dem>
            <ptc>praecepto</ptc>
            <leesteken>,</leesteken>
            <cj>at</cj>
            <pron_dem>hi</pron_dem>
            <subst>numero</subst>
            <subst>avium</subst>
            <subst>regnum</subst>
            <verbum>trahebant</verbum>
            <leesteken>.</leesteken>
            <adv>inde</adv>
            <cj>cum</cj>
            <subst>altercatione</subst>
            <verbum>congressi</verbum>
            <subst>certamine</subst>
            <subst>irarum</subst>
            <prep>ad</prep>
            <subst>caedem</subst>
            <verbum>vertuntur</verbum>
            <leesteken>;</leesteken>
            <adv>ibi</adv>
            <prep>in</prep>
            <subst>turba</subst>
            <ptc>ictus</ptc>
            <eigennaam>Remus</eigennaam>
            <verbum>cecidit</verbum>
            <leesteken>.</leesteken>
            <ptc>vulgatior</ptc>
            <subst>fama</subst>
            <verbum>est</verbum>
            <subst>ludibrio</subst>
            <subst>fratris</subst>
            <eigennaam>Remum</eigennaam>
            <adj>novos</adj>
            <verbum>transiluisse</verbum>
            <subst>muros</subst>
            <leesteken>;</leesteken>
            <adv>inde</adv>
            <prep>ab</prep>
            <ptc>irato</ptc>
            <eigennaam>Romulo</eigennaam>
            <leesteken>,</leesteken>
            <cj>cum</cj>
            <subst>verbis</subst>
            <adv>quoque</adv>
            <ptc>increpitans</ptc>
            <verbum>adiecisset</verbum>
            <leesteken>'</leesteken>
            <adv>sic</adv>
            <adv>deinde</adv>
            <leesteken>,</leesteken>
            <pron_indef>quicumque</pron_indef>
            <pron_indef>alius</pron_indef>
            <verbum>transiliet</verbum>
            <subst>moenia</subst>
            <pron_poss>mea</pron_poss>
            <leesteken>'</leesteken>
            <leesteken>,</leesteken>
            <ptc>interfectum</ptc>
            <leesteken>.</leesteken>
            <pron_dem>ita</pron_dem>
            <adj>solus</adj>
            <ptc>potitus</ptc>
            <subst>imperio</subst>
            <eigennaam>Romulus</eigennaam>
            <leesteken>;</leesteken>
            <ptc>condita</ptc>
            <subst>urbs</subst>
            <subst>conditoris</subst>
            <subst>nomine</subst>
            <ptc>appellata</ptc>
            <leesteken>.</leesteken>
        </tekst>
        <vertaling>
                Volgens de overlevering deed zich eerst aan Remus een teken voor: er kwamen zes gieren aanvliegen.
                    Juist was dit bekendgemaakt, toen zich aan Romulus tweemaal zoveel gieren vertoonden. Ieder werd door zijn eigen volgelingen tot koning uitgeroepen: 
                de ene partij maakte aanspraak op de eer vanwege de prioriteit en de andere vanwege het aantal van de vogels. Er ontstond een heftige woordenstrijd die, toen de woede hoger en hoger 
                oplaaide, eindigde in moord en doodslag; in dat tumult werd Remus dodelijk getroffen. Beter bekend is het verhaal dat Remus, om zijn broer te plagen, over de nieuwe muren 
                sprong en dat Romulus hem in woede daarover doodde, terwijl hij hem toeschreeuwde: 'Zo zal het voortaan iedereen vergaan die over mijn muren springt!'
                    Nu had Romulus alleen de macht in handen en de stad die gesticht werd ontleende haar naam aan de stichter.</vertaling>
        <bronvermelding>
            <vnaam>Janoesch</vnaam>
            <anaam>K</anaam>
            <datum>16-11-2004</datum>
        </bronvermelding>
    </livius>
</latijn>

Verwijderd

Topicstarter
Probleeem blijft de sortering...

Verwijderd

Hmmm, je snapt helaas niet veel van XSL.
Anyway, ik ga je helpen.

Even terug naar het oorspronkelijke probleem: "alles komt achter elkaar te staan."
Waarom?
Omdat je templates aanroept , bijvoorbeeld:

code:
1
<xsl:apply-templates select="tekst/verbum"/>


Maar dit template bestaat helemaal niet. Ik zie nergens een template:

code:
1
<xsl:template match="tekst/verbum">


in je StyleSheet.

Het gevolg is dat je XML processor dan maar uit pure wanhoop zijn default actie gaat doen die hij moet doen als jij hem een niet-bestaand template laat uitvoeren. En die default actie is (rara): alles achter elkaar uitprinten.

Duidelijk zo?

Nog een tip: gebruik nooit een FOR-EACH.
Stylesheets werken met Templates.
Bijna altijd is het gebruik van de FOR-EACH een teken dat je iets fundamenteel fout doet.
De gevallen waarin een FOR-EACH zinvol (let wel; niet nodig maar zinvol) kan zijn, zijn zeer zeldzaam.

[ Voor 6% gewijzigd door Verwijderd op 17-11-2004 09:59 ]


Verwijderd

Topicstarter
Wat zou je dan beter kunnen gebruiken dan FOR-EACH? <xsl:sort> of zo?

Verwijderd

Topicstarter
Ik wist dat er veel dingen niet klopten, dus heb ik gisteravond gesleuteld aan het XSL-bestand en deze om 20.23 gepost. Wat zou hierin dan de fout kunnen zijn, als ik vragen mag?

Verwijderd

Sorteren doe je zó :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/latijn/livius">
        <html>
            <body>
                <xsl:apply-templates select="tekst"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="tekst">
        <xsl:apply-templates select="subst">
            <xsl:sort select="."/>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="subst">
        <br>
            <xsl:value-of select="."/>
        </br>
    </xsl:template>
</xsl:stylesheet>



Als je in plaats van FOR EACH, gewoon apply-templates gebruikt, zet je een belangrijke stap op het pad naar verlichting.

SORT is voor het sorteren.

Ik zal proberen zometeen je versie van 20:23 te bekijken, maar ik denk dat je je data nooit in een tabel zult kunnen krijgen, want je hebt geen regels, alleen kolommen die niets met elkaar te maken hebben.

  • Redshark
  • Registratie: Mei 2002
  • Laatst online: 13:08
Ik weet niet of ik het nu goed begrijp allemaal want ik ben net wakker. Maar gaat het er nu om dat er meerdere tabelrijen worden aangemaakt met de XSL-code die TS hier neer heeft gezet?
Dat werkt gewoon prima, de enige reden waarom het niet zou lukken is omdat er in het voorbeeld XML-bestand wat hier gepost is maar 1 keer een <livius>-node in staat. Verder werkt het prima als ik het ff snel copy paste.

FF nog een vraag aan saghws: waarom geen For-each, wat zou daar fout aan zijn? ik gebruik het regelmatig, net als vele anderen hier. Maar als er een goede reden voor is om het te vermijden zou ik daar graag wat meer over weten.

Verwijderd

Ik weet niets van HTML en dat wil ik graag zo houden, daarom hierbij het complete antwoord maar dan zonder TABLE:

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
27
28
29
30
31
32
33
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <h1 align="center">Sortering op zn, ww, bijw en ptc</h1>
            <style>body {background-color: lightblue;}</style>
            <body>
                <H2>Substantium</H2>
                <xsl:apply-templates select="/latijn/livius/tekst/subst">
                    <xsl:sort select="."/>
                </xsl:apply-templates>
                <H2>Verbum</H2>
                <xsl:apply-templates select="/latijn/livius/tekst/verbum">
                    <xsl:sort select="."/>
                </xsl:apply-templates>
                <H2>Adverbum</H2>
                <xsl:apply-templates select="/latijn/livius/tekst/adv">
                    <xsl:sort select="."/>
                </xsl:apply-templates>
                <H2>Participium</H2>
                <xsl:apply-templates select="/latijn/livius/tekst/ptc">
                    <xsl:sort select="."/>
                </xsl:apply-templates>
            </body>
        </html>
    </xsl:template>
    
    <xsl:template match="/latijn/livius/tekst/subst|/latijn/livius/tekst/verbum|/latijn/livius/tekst/adv|/latijn/livius/tekst/ptc">
        <br>
            <xsl:value-of select="."/>
        </br>
    </xsl:template>
</xsl:stylesheet>


Hiermee moet je mijns inziens verder zelf wel uit de voeten kunnen.
Overigens vind ook ik dat je eens een goed boek over XSL zou moeten bestuderen
bijvoorbeeld "XSLT Programmers Reference"van de onvolprezen Michael Kay.

Verwijderd

Reden om FOR-EACH te vermijden is:

(ik citeer Michael Kay)

"apply-templates ties the stylesheet less strongly to the detailed structure of the source document and makes it easier to write a stylesheet that can acoomodate some flexibility in the structure that can be encountered."

Ik vergelijk de FOR-EACH in een StyleSheet met de GoTo in traditionele programmeer talen: leuk dat het kan, maar probeer 'm te vermijden en je programma wordt een stuk duidelijker (en daardoor beter te onderhouden)

En een tabel met maar één regel is denk ik niet wat de OP werkelijk wilde...
Ik weet verder niet hoe je in HTML een tabel kun maken met in elke kolom een ander aantal "rijen".

Volgens mij wil de OP zoiets genereren:

code:
1
2
3
4
5
6
7
1    2     3

a    x     k
b    y     l
c    z     m
d          n
           o


Hmmm, ik heb geen idee hoe je dat zou moeten aanpakken in HTML, zoals gezegd, ik weet niets van HTML en dat wil ik graag zo houden.

  • Redshark
  • Registratie: Mei 2002
  • Laatst online: 13:08
Verwijderd schreef op woensdag 17 november 2004 @ 11:33:
Reden om FOR-EACH te vermijden is:

Ik vergelijk de FOR-EACH in een StyleSheet met de GoTo in traditionele programmeer talen: leuk dat het kan, maar probeer 'm te vermijden en je programma wordt een stuk duidelijker (en daardoor beter te onderhouden)
Dat is nog eens een mooie vergelijking en maakt meteen een boel zaken duidelijk :) Ik heb het boekje er maar weer eens bijgepakt (en afgestoft :P) tbv wat extra theortische kennis :)

Verwijderd

Nou, vooruit dan maar, hoewel ik niets van HTML weet (en dat wil ik graag zo houden) hieronder dan toch een geheel compleet antwoord, dus met TABLE.
Maar alleen omdat ik denk (hoop?) dat Janoesch een vrouwmens is, en ik ben een sucker voor babes.

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>

    <xsl:template match="/">
        <html>
            <h1 align="center">Sortering op zn, ww, bijw en ptc</h1>
            <style>body {background-color: lightblue;}</style>
            <body>
                <table border="1" cellpadding="4" cellspacing="0">
                    <tr>
                        <th>Substantium</th>
                        <th>Verbum</th>
                        <th>Adverbum</th>
                        <th>Participium</th>
                    </tr>
                    <tr>
                        <td>
                            <xsl:apply-templates select="/latijn/livius/tekst/subst">
                                <xsl:sort select="."/>
                            </xsl:apply-templates>
                        </td>
                        <td>
                            <xsl:apply-templates select="/latijn/livius/tekst/verbum">
                                <xsl:sort select="."/>
                            </xsl:apply-templates>
                        </td>
                        <td>
                            <xsl:apply-templates select="/latijn/livius/tekst/adv">
                                <xsl:sort select="."/>
                            </xsl:apply-templates>
                        </td>
                        <td>
                            <xsl:apply-templates select="/latijn/livius/tekst/ptc">
                                <xsl:sort select="."/>
                            </xsl:apply-templates>
                        </td>
                    </tr>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="/latijn/livius/tekst/subst|/latijn/livius/tekst/verbum|/latijn/livius/tekst/adv|/latijn/livius/tekst/ptc">
        <br>
            <xsl:value-of select="."/>
        </br>
    </xsl:template>
</xsl:stylesheet>



Volgens mij is ditr precies wat de TS wilde.
Het neigt naar verwennerij, maar goed, ik vind Style Sheets nou eenmaal leuk.

Verwijderd

Topicstarter
Thanx! Begrijp het nu veel beter! :)
Pagina: 1