I cant seem to get this nested for loop to work correctly, I want to print all of the tracks on the EP in the row with the EP name and other details. Everything from the first for-each loop displays correctly but nothing is pulled through for the for-each loop to get the tracks.
Here is my XML
<dalehoward>
<ep>
<name>Letters EP</name>
<year>2012</year>
<label>Static Audio</label>
<image>letters.jpg</image>
<tracks>
<track number="1">
<tname>Letters</tname>
<length>6.35</length>
</track>
<track number="2">
<tname>Later</tname>
<length>7.56</length>
</track>
<track number="3">
<tname>'89 Flava</tname>
<length>7:38</length>
</track>
<track number="4">
<tname>Safe Presentation</tname>
<length>7.55</length>
</track>
</tracks>
</ep>
<ep>
<name>Inner City EP</name>
<year>2012</year>
<label>Lost My Dog</label>
<image>innercity.jpg</image>
<tracks>
<track number="1">
<tname>C'Mon</tname>
<length>7.15</length>
</track>
<track number="2">
<tname>Koppabird</tname>
<length>6.27</length>
</track>
<track number="3">
<tname>Inner City</tname>
<length>8:50</length>
</track>
<track number="4">
<tname>You Can</tname>
<length>8:16</length>
</track>
<tracks>
</ep>
<dalehoward>
and here is the XSLT
<xsl:variable name="imagefolder" select="'xml/images/'" />
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1" width="100%">
<tr bgcolor="#9acd32">
<th style="text-align:left">Title</th>
<th style="text-align:left">Year</th>
<th style="text-align:left">Label</th>
<th style="text-align:left">Tracks</th>
<th style="text-align:left">Artwork</th>
</tr>
<xsl:for-each select="dalehoward/ep">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="year"/></td>
<td><xsl:value-of select="label"/></td>
<td>testtext<xsl:for-each select="dalehoward/ep/tracks">
<xsl:value-of select="tname"/><br />
<xsl:value-of select="length"/> <br /><br />
</xsl:for-each></td>
<td><img width="150px" height="150px"><xsl:attribute name="src">
<xsl:copy-of select="$imagefolder"/>
<xsl:value-of select="image"/>
</xsl:attribute></img></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Thanks a lot in advance for any help
You create an XSLT loop with the <xsl:for-each> tag. The value of the select attribute in this tag is an XPath expression that allows you to specify the data element to loop through. XPath expressions are constructed like file paths in an operating system, the forward slash (/) selects subdirectories.
There is no such a thing as break in an XSLT for-each loop. xsl:if/@test is pretty much all you can do. The other way would be to include this condition within the for-each/@select.
Returns the contents of the current group selected by xsl:for-each-group. Available in XSLT 2.0 and later versions. Available in all Saxon editions. current-group() ➔ item()*
The <xsl:for-each> element allows you to do looping in XSLT.
The outer loop puts you in the context of ep
. The context of the inner loop needs to be established from there (or as an absolute path, starting from the root) - so change:
<xsl:for-each select="dalehoward/ep/tracks">
to:
<xsl:for-each select="tracks/track">
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With