C'è un bug nel uscita suggerita, come <img/>
elementi devono avere alt
attributi in ogni versione di HTML, in cui sono presenti.
In ogni caso ciò che segue è questo, ma senza quegli attributi che possono essere fatti da CSS invece (solo per mantenere le dimensioni in giù). L'aggiunta di nuovo in se lo si desidera è banale:
<xsl:template match="pics">
<table>
<xsl:apply-templates select="pic[position() mod 3 = 1]"/>
</table>
</xsl:template>
<xsl:template match="pic[position() mod 3 = 1]">
<tr>
<td>
<xsl:if test="2 > count(following-sibling::pic)">
<xsl:attribute name="colspan">
<xsl:value-of select="3 - count(following-sibling::pic)"/>
</xsl:attribute>
</xsl:if>
<img src="{.}" alt="" />
</td>
<xsl:apply-templates select="following-sibling::pic[3 > position()]" />
</tr>
</xsl:template>
<xsl:template match="pic">
<td><img src="{.}" alt=""/></td>
</xsl:template>
È possibile che questo presuppone che si desidera che il percorso dal file utilizzato direttamente, l'aggiunta di codice per trasformarlo in qualche modo (dire prendendo solo l'ultima parte del percorso utilizzando substring-after()
) non è un'estensione difficile, supponendo che la trasformazione non sia complicata.
Edit:
Io e JohnB stanno andando in ulteriori territori qui, i suffissi di cui sopra per rispondere alla domanda iniziale.
Aggiunto per dare una risposta più completa alla domanda di JohnB. Quanto segue è il codice equivalente che utilizza per-invece di template di applicazione. In teoria, un'implementazione sequenziale e basata sullo stato macchina di un processore XSLT dovrebbe comportarsi in modo identico, anche se potresti trovare differenze nella pratica (se tu mi dicessi che erano diversi con un determinato processore, scommetterei una piccola somma su di esso essere leggermente più veloce con l'elaborazione sequenziale e leggermente più lento con l'elaborazione a macchina di stato, ma scommetterei solo una piccola quantità).
Si noti che non è possibile riutilizzare il modello predefinito per l'immagine. Sul lato positivo, se abbiamo un diverso modello predefinito per le immagini altrove (se questo fosse parte di un foglio di stile molto più complicato), non abbiamo bisogno di essere intelligenti per distinguere tra loro, che è il momento principale in cui personalmente si inclinerebbe verso-ciascuno.
<xsl:template match="pics">
<table>
<xsl:for-each select="pic[position() mod 3 = 1]">
<tr>
<td>
<xsl:if test="2 > count(following-sibling::pic)">
<xsl:attribute name="colspan">
<xsl:value-of select="3 - count(following-sibling::pic)"/>
</xsl:attribute>
</xsl:if>
<img src="{.}" alt="" />
</td>
<xsl:for-each select="following-sibling::pic[3 > position()]">
<td><img src="{.}" alt=""/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
fonte
2010-08-08 15:26:04
Buona domanda (+1). Vedi la mia risposta per una soluzione completa che è nello spirito di XSLT e per una spiegazione di tutti i momenti significativi della soluzione. :) –