Разбивка по группам в XSLT

Drakon

Новичок
Разбивка по группам в XSLT

Стоит такая задача: есть DomDocument со списком картинок. В XSLT нужно его трансформировать так, чтобы получилась таблица по 3 картинки в строке.

Вот список картинок:

Код:
<categ_imagesList>
<imageInfo id="69740" width="170" height="255" group_id="0"/>
<imageInfo id="69741" width="170" height="255" group_id="0"/>
<imageInfo id="69742" width="170" height="255" group_id="0"/>
<imageInfo id="69743" width="170" height="255" group_id="1"/>
</categ_imagesList>
group_id - это я уже в PHP сделал номер строки, в которой будет картинка.


Нашёл в одной книжке группировку элементов:

Код:
<xsl:key name="group_ids" match="imageInfo" use="@group_id"/>

<xsl:template match="categ_imagesList">
<table>
<xsl:apply-templates select="imageInfo[generate-id(.)=generate-id(key('group_ids',@group_id))]"/>
</table>
</xsl:template>

<xsl:template match="imageInfo">
<tr>
    <xsl:copy-of select="key('group_ids',@group_id)"/>
</tr>
</xsl:template>
Получил такое:
Код:
<table>
<tr>
<imageInfo id="69740" width="170" height="255" group_id="0"/>
<imageInfo id="69741" width="170" height="255" group_id="0"/>
<imageInfo id="69742" width="170" height="255" group_id="0"/>
</tr>
<tr>
<imageInfo id="69743" width="170" height="255" group_id="1"/>
</tr>
</table>
Всю голову сломал, пока понял... Но теперь встал вопрос - как применить шаблон ко всем imageInfo (типа там поставить теги <td>, <img>, </td>) перед тем, как их группировать?

-~{}~ 15.10.06 03:30:

Усё, придумал... Там вместо xsl:copy-of надо xsl:for-each.
 

denver

?>Скриптер
Фу. Вам вручили микроскоп, а вы смотрите в него с другой стороны и настраиваете фокусировку. На звёзды что-ли?

for-each сразу надо было делать. А group_id как ни крути относится к оформлению, значит PHP о нем по определению не должен знать. Посмотри функции position() и current()
 

Alexandre

PHPПенсионер
Drakon раз у тебя все получилось, значить - сделал правильно,
а чтоб раставить теги - <td>, <img>, </td> необходимо просто применить шаблон к твоему шаблону, т.е. вместо <xsl:copy-of >
использовать <xsl:call-template >
 

denver

?>Скриптер
Alexandre
Drakon раз у тебя все получилось, значить - сделал правильно,
А что, неплохая идея, ведь легче номер колонки указать в XML пэхапой, а также нужный цвет строки (в таблице зебра), ведь в XSLT может получиться, а может и не получиться определть чет/нечет, остаток от деления на три и т.п.
Браво.
 

Alexandre

PHPПенсионер
denver чет /нечет делается на ура... и теких решений море
по аналогии можно разбить и на три колонки. Если эту функцию (определения номера колонки) передать пхп, то гемера будет на много меньше.
 

Drakon

Новичок
Короче, чтобы не было вопросов и чтобы на эту тему в дальнейшем кидать линк нубам как я - вот два варианта выполнения (разбивка в строки по 3):


1. Через ключи + запись в PHP номера строки
Исходный XML:
Код:
<categ_imagesList>
	<imageInfo id="69740" row_number="0"/>
	<imageInfo id="69741" row_number="0"/>
	<imageInfo id="69742" row_number="0"/>
	<imageInfo id="69743" row_number="1"/>
</categ_imagesList>
XSL:
Код:
<xsl:key name="row_numbers" match="imageInfo" use="@row_number"/>

<xsl:template match="categ_imagesList">
	<table>
		<xsl:apply-templates 
			select="imageInfo[generate-id(.)=generate-id(key('row_numbers',@row_number))]"/>
	</table>
</xsl:template>

<xsl:template match="imageInfo">
<tr>
    <xsl:for-each select="key('row_numbers',@row_number)">
	<td><img><xsl:attribute name="src">/images/<xsl:value-of select="@id"/>.jpg</img></td>
    </xsl:for-each>
</tr>
</xsl:template>
2. Через обычный for-each:
Исходный XML:
Код:
<categ_imagesList>
	<imageInfo id="69740"/>
	<imageInfo id="69741"/>
	<imageInfo id="69742"/>
	<imageInfo id="69743"/>
</categ_imagesList>
XSL:
Код:
<xsl:template match="categ_imagesList">
<table>
<xsl:for-each select="imageInfo">
<xsl:if test='(position() mod 3) = 1'>
<tr>
 	<xsl:variable name="cur_position"><xsl:value-of select="position()" /></xsl:variable>

	<xsl:apply-templates select="../imageInfo[position() >= $cur_position and position() &lt; $cur_position+3]"/>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>

<xsl:template match="imageInfo">
<td><img><xsl:attribute name="src">/images/<xsl:value-of select="@id"/>.jpg</img></td>
</xsl:template>
-~{}~ 16.10.06 15:55:
 
Сверху