Il y a un bug dans la sortie suggéré, comme <img/>
éléments doivent avoir alt
attributs dans toutes les versions de HTML où ils sont présents.
De toute façon ce qui suit le fait, mais sans les attributs qui peuvent être faits à partir de CSS à la place (juste pour réduire la taille). les rajoutant si désiré est trivial:
<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>
qui précède suppose que vous voulez que le chemin du fichier utilisé directement, en ajoutant le code pour le transformer en quelque sorte (dire en prenant la dernière partie du chemin en utilisant substring-after()
) n'est pas une extension difficile, en supposant que cette transformation n'est pas compliquée elle-même.
Edit:
Moi-même et JohnB vont dans le territoire plus ici, les suffixes ci-dessus pour répondre à la question initiale.
Ajouté pour donner une réponse plus complète à la question de JohnB. Ce qui suit est le code équivalent utilisant for-each au lieu de apply-templates. En théorie, une implémentation séquentielle et basée sur une machine d'état d'un processeur XSLT devrait traiter de la même façon, bien que vous puissiez trouver des différences dans la pratique (si vous me disiez qu'ils étaient différents avec un processeur donné, je parierais un peu étant légèrement plus rapide avec le traitement séquentiel et légèrement plus lent avec le traitement de machine-état, mais je parierais seulement une très petite quantité).
Notez que nous ne pouvons pas réutiliser le modèle par défaut pour l'image. Sur le côté positif, si nous avons un autre modèle par défaut pour la photo ailleurs (si cela faisait partie d'une feuille de style beaucoup plus compliquée), nous n'avons pas besoin d'être intelligent pour les différencier, ce qui est la principale pencherait vers-chacun.
<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>
Bonne question (+1). Voir ma réponse pour une solution complète qui est dans l'esprit de XSLT et pour une explication de tous les moments significatifs de la solution. :) –