[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
Hello,
The following stylesheet does what I need, but I find it very ugly.
The quantity of <foto/> is not determined.
I would like to generate a "photo index", i.e. a picture containing small versions of all photos, arranged by rows of 8 photos.
I can make it dynamically adaptable by simply sticking the photos one to the other, but I'd prefer to have the image arranged as a table, with eight cells per row.
Additionally, I would like to add blank cells at the end so that the last row is complete.
Eventually (not done on this stylesheet), I may want to add a "logo" image at the end, as if one more photo was present on the XML source.
Here's the "beast":
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html><body>
<table border="0" cellpadding="0" cellspacing="0">
<xsl:for-each select="fotos/foto[(@id mod 8) = 1]">
<xsl:sort order="ascending" select="@id" data-type="number" />
<tr>
<xsl:apply-templates select="../foto[@id>=current()/@id][current()/@id+8>@id]">
<xsl:sort order="ascending" select="@id" data-type="number" />
</xsl:apply-templates>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][1])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][2])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][3])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][4])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][5])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][6])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][7])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][8])">
<td> </td>
</xsl:if>
</tr>
</xsl:for-each>
</table>
</body></html>
</xsl:template>
</xsl:stylesheet>
Comments on what I dislike:
I dislike using [(@id mod 8) = 1], but I am afraid I cannot do that much differently.
I dislike the ../[@id>=current()/@id][current()/@id+8>@id] couple of conditions which give me the eight <foto/> that are to be in the same row as the first one. I am pretty sure that it can be done better.
But what I especially dislike (like in hate) the way I completed the last (or any photo-missing intermediate) row. That is, the eight xsl:if conditions that fill the right of the row.
Moreover, I dislike the fact that I count on the IDs not only for order but also for placement. I would like to be able to remove a photo if I wish, without changing the other photo's ID.
So, for this last reason, I'm afraid a serious change has to be done to the stylesheet. But I could not think of how to do it when I wrote the stylesheet yesterday.
Any hints? Maybe keys may help? If so, how?
Thank you very much.
Antonio Fiol
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
[xsl] Making groups of N elements --> Photo index
Subject: [xsl] Making groups of N elements --> Photo index From: Antonio Fiol <fiol@xxxxxxxxxx> Date: Wed, 12 Jun 2002 11:00:59 +0200 |
Hello,
The following stylesheet does what I need, but I find it very ugly.
The idea is that I have an unsorted XML source as: <fotos> <foto id="3" /> <foto id="1" /> <foto id="2" /> ... <foto id="NNN" /> </fotos>
The quantity of <foto/> is not determined.
I would like to generate a "photo index", i.e. a picture containing small versions of all photos, arranged by rows of 8 photos.
I can make it dynamically adaptable by simply sticking the photos one to the other, but I'd prefer to have the image arranged as a table, with eight cells per row.
Additionally, I would like to add blank cells at the end so that the last row is complete.
Eventually (not done on this stylesheet), I may want to add a "logo" image at the end, as if one more photo was present on the XML source.
Here's the "beast":
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html><body>
<table border="0" cellpadding="0" cellspacing="0">
<xsl:for-each select="fotos/foto[(@id mod 8) = 1]">
<xsl:sort order="ascending" select="@id" data-type="number" />
<tr>
<xsl:apply-templates select="../foto[@id>=current()/@id][current()/@id+8>@id]">
<xsl:sort order="ascending" select="@id" data-type="number" />
</xsl:apply-templates>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][1])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][2])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][3])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][4])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][5])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][6])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][7])">
<td> </td>
</xsl:if>
<xsl:if test="not(../foto[@id>=current()/@id][current()/@id+8>@id][8])">
<td> </td>
</xsl:if>
</tr>
</xsl:for-each>
</table>
</body></html>
</xsl:template>
<xsl:template match="foto"> <td><a href="{@id}.jpg"><img border="0" src="{@id}.small.jpg" /></a></td> </xsl:template>
</xsl:stylesheet>
Comments on what I dislike:
I dislike using [(@id mod 8) = 1], but I am afraid I cannot do that much differently.
I dislike the ../[@id>=current()/@id][current()/@id+8>@id] couple of conditions which give me the eight <foto/> that are to be in the same row as the first one. I am pretty sure that it can be done better.
But what I especially dislike (like in hate) the way I completed the last (or any photo-missing intermediate) row. That is, the eight xsl:if conditions that fill the right of the row.
Moreover, I dislike the fact that I count on the IDs not only for order but also for placement. I would like to be able to remove a photo if I wish, without changing the other photo's ID.
So, for this last reason, I'm afraid a serious change has to be done to the stylesheet. But I could not think of how to do it when I wrote the stylesheet yesterday.
Any hints? Maybe keys may help? If so, how?
Thank you very much.
Antonio Fiol
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Re: Date Parsing (Was: Do, Jarkko . Moilanen | Thread | RE: [xsl] Making groups of N elemen, Michael Kay |
RE: [xsl] Grouping and Sorting on v, TSchutzerWeissmann | Date | RE: [xsl] Removing Newlines, Michael Kay |
Month |
Keywords