Toon posts:

[XML] for-each probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Na het zelf twee uur geprobeerd te hebben met behulp van w3schools en weet ik wat allemaal voor sites vraag ik het hier maar.

Ik heb een simpele xml file met een aantal albums erin. Die wil ik d.m.v. een xsl file laten zien. Dit zijn de files:

xml:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<album>
    <albumtitle>Darkness and Hope</albumtitle>
    <artist>Moonspell</artist>
    <trk>01. Darkness and Hope</trk>
    <trk>02. Firewalking</trk>
    <trk>03. Nocturna</trk>
    <trk>04. Heartsheaped Abyss</trk>
    <trk>05. Devilred</trk>
    <trk>06. Ghostsong</trk>
    <trk>07. Rapaces</trk>
    <trk>08. Made of Storm</trk>
    <trk>09. How we became fire</trk>
    <trk>10. Than the Serpents in my Hands</trk>
    <trk>11. Os Senhores da Guerra</trk>
</album>


xsl:
code:
1
2
3
4
5
6
    <TABLE border="1" style="border-collapse: collapse;">
        <xsl:for-each select="collectie/album[artist='Moonspell']">     
        <TH><xsl:value-of select="albumtitle"/></TH>        
        <TR><TD><xsl:value-of select="trk"/></TD></TR>
        </xsl:for-each>
   </TABLE>



Als ik dit uitvoer dan krijg ik echter alleen de title van het album en de eerste track, terwijl ik 1x de titel wil zien en alle tracks. Ik heb al vanalles geprobeerd, een aparte for-each voor de tracks maar het werkt geen van allen. Hoe kan ik dit doen, heeft iemand een tip of een site waar ik het antwoord kan vinden?

Verwijderd

Ten eerst zou ik de albumtitle buiten de for-each plaatsen.
Ten tweede zou ik de trk's in een appart item doen, aangezien dat de oorzaak is van je fout. XML zoekt nu alle items op die in album zitten waar de artiest lovefist is. En van albumtitle is dat er maar 1 dus hij stopt.
XML:
1
2
3
4
5
[tracks]
 [trk]1[/trk]
 [trk]2[/trk]
 [trk]3[/trk]
[/tracks]

Verwijderd

Je moet een tweede for-each lus maken:
code:
1
2
3
4
5
6
7
8
    <TABLE border="1" style="border-collapse: collapse;">
        <xsl:for-each select="collectie/album[artist='Moonspell']">
    <TH><xsl:value-of select="albumtitle"/></TH>
        <xsl:for-each select="trk">
                <TR><TD><xsl:value-of select="."/></TD></TR>
        </xsl:for-each>
        </xsl:for-each>
   </TABLE>

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Het probleem ligt heel ergens anders (edit: niet tov Flussieke)

Je doet per album bijvoorbeeld dit:

code:
1
2
3
<TR><TD>
   <xsl:value-of select="trk"/>
</TD></TR>


Je hebt zo dus altijd 1 track per album. value-of bepaalt namelijk een waarde van je XPath expressie in het select attribuut, maar je wilt juist iets doen met alle tracks.

De oplossing:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<xsl:template match="collection">
   <xsl:apply-templates select="album[artist='Moonspell']"/>
</xsl:template>
 
<xsl:template match="album">
   <TH><xsl:value-of select="albumtitle/text()"/></TH>
   <xsl:apply-templates select="trk"/>
</xsl:template>
  
<xsl:template match="trk">
   <TR><TD><xsl:value-of select="text()"/></TD></TR>
</xsl:template>

Gebruik dus vooral ook meerdere templates!

[ Voor 59% gewijzigd door mbravenboer op 26-05-2003 14:18 ]

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
mbravenboer; ik snap hoe het moet werken maar ik krijg dit terug:

code:
1
Keyword xsl:template may not be used here.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Tja, wat is "here".

Het lijkt erop dat je de hoofd structuur van een XSL Transformatie niet goed (door) hebt. Bestudeer een goede tutorial, of post de structuur van je transformatie hier als je denkt dat je het stadium van een tutorial al voorbij bent....

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1