В предложенном выводе есть ошибка, поскольку элементы <img/>
должны иметь атрибуты alt
в каждой версии HTML, в которой они присутствуют.
В любом случае следующее делает это, но без тех атрибутов, которые можно сделать из CSS вместо этого (просто чтобы уменьшить размер). Добавление их обратно, если необходимо, тривиально:
<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>
Выше предполагается, что вы хотите, чтобы путь от файла использовался напрямую, добавление кода для его преобразования каким-либо образом (скажем, взятие только последней части пути с использованием substring-after()
) не является сложным расширением, предполагая, что указанное преобразование не является Сам не усложняю.
Edit:
Я и ДжонБ идем на дальнейшую территорию, всего этого достаточно, чтобы ответить на оригинальный вопрос.
Добавлено, чтобы дать более полный ответ на вопрос Джона Б. Ниже приведен эквивалентный код, использующий for-each вместо apply-templates. Теоретически и последовательная реализация, и реализация на основе конечного автомата процессора XSLT должны одинаково справляться с этим, хотя на практике вы можете найти различия (если вы скажете, что они отличаются от данного процессора, я бы поставил на него небольшую сумму) немного быстрее с последовательной обработкой и немного медленнее с конечным автоматом, но я бы поставил только очень небольшую сумму).
Обратите внимание, что мы не можем повторно использовать шаблон по умолчанию для рис. С другой стороны, если у нас есть другой шаблон по умолчанию для pic в другом месте (если это было частью гораздо более сложной таблицы стилей), нам не нужно быть умным, чтобы различать их, что является основным временем, когда я лично склонялся бы к каждому.
<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>