трабла с группировкой

Kirill

Новичок
трабла с группировкой

Уважаемые, не поможете с шаблном:
XML:
<list>
<food>
<category name="category" id="1">
<item name="name" producer="producer1"/>
<item name="name2" producer="producer2"/>
<item name="name3" producer="producer2"/>
<item name="name4" producer="producer1"/>
</category>
<category name="category45" id="51">
<item name="name5" producer="producer1"/>
<item name="name6" producer="producer2"/>
<item name="name7" producer="producer2"/>
<item name="name8" producer="producer1"/>
</category>
</food>
<clothes>
<item name="name345" producer="producer1"/>
<item name="name66" producer="producer2"/>
<item name="name77" producer="producer2"/>
<item name="name87" producer="producer4"/>
</clothes>
</list>

Нужно чтобы была общая таблица в виде:
Сначала питание:
продукты дробятся по категориям (т.е. загаловок категории - затем идут продукты), в одежде такого нет - сначала загаловок с одеждой - затем пошла вся одежда. В каждой группе продукты (питание/одежда) должны быть сгруппированы по производителям (@producer).
Делаю так:



PHP:
<xsl:key name="src" match="item" use="@producer"/>

<xsl:template match="list">
		<div class="products">
			<table cellspacing="0" cellpadding="0" width="100%">
				<xsl:apply-templates select="food"/>
				<xsl:apply-templates select="clothes"/>
			</table>				
		</div>
</xsl:template>

<xsl:template match="food">
	<tr>
		<td colspan="5">питание</td>
	</tr>
	<tr class="product_head">
		<td width="50">&#160;</td>
		<td width="100%">Товар</td>
		<td>Упаковка</td>
		<td>Цена</td>						
		<td>&#160;</td>
	</tr>
	<xsl:apply-templates select="category"/>	
</xsl:template>

<xsl:template match="category">
	<tr>
		<td colspan="5" class="cat_head"><xsl:value-of select="@name"/></td>
	</tr>	
	<xsl:for-each select="item[generate-id()=generate-id(key('src',@producer))]">
		<xsl:sort select="@producer" data-type="text" order="ascending" />
		<tr>
			<td colspan="5" class="product_producer">
				<xsl:value-of select="@producer"/>
			</td>
		</tr>
		<xsl:for-each select="key('src',@producer)">
			<xsl:apply-templates select=".">
				<xsl:with-param name="pos" select="position()"/>
			</xsl:apply-templates>
		</xsl:for-each>
	</xsl:for-each>							
</xsl:template>

<xsl:template match="category/item">
	<tr>
		item_tpl
	</tr>
</xsl:template>
Далее идет шаблон для clothes - аналогично.
Если убрать clothes и оставить только food, затем запустит вышеуказанный шаблон то в 1 категории окажутся производители и продукты, которых нету в 1 категории, а в какой-нибудь последней может не оказаться продуктов вообще, т.к. они все окажутся распиханными по другим категориям. По - ключу выбираются все продукты, которые удовлетворяют условию @producer, а на родительскую категорию ключ не реагирует. Никто не подскажет как это поправить?

-~{}~ 20.01.07 00:06:

p.s. про случай, когда есть ещё шаблон clothes я не говорю :), но следует учесть что это возможно
 

jian

Новичок
esli bi vi dali jelaemii resultat v HTML - bilo bi bistee..

-~{}~ 20.01.07 16:48:

how about this?

Код:
<?xml version="1.0" encoding="windows-1251"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" indent="yes" /> 

<xsl:key name="src" match="item" use="concat(name(..), ../@name, @producer)"/> 

<xsl:template match="/"> 
        <div class="products"> 
            <table border="1" cellspacing="0" cellpadding="0" width="100%"> 
					    <xsl:apply-templates select="list/food"/> 
					    <xsl:apply-templates select="list/clothes"/> 
            </table>
        </div> 
</xsl:template> 

<xsl:template match="clothes"> 
    <tr> 
        <td>prikid</td> 
        <td><br/></td> 
        <td><br/></td> 
        <td><br/></td> 
    </tr>
		    <xsl:apply-templates 
		    select="item[generate-id()=generate-id(key('src',concat(name(..), ../@name, @producer))[1])]"/> 

</xsl:template> 

<xsl:template match="food"> 
    <tr> 
        <td>jratva</td> 
        <td><br/></td> 
        <td><br/></td> 
        <td><br/></td> 
    </tr> 
		    <xsl:apply-templates select="category"/> 
</xsl:template> 

<xsl:template match="category"> 
    <tr> 
        <td><br/></td> 
        <td><xsl:value-of select="@name"/></td> 
        <td><br/></td> 
        <td><br/></td> 
    </tr> 
		    <xsl:apply-templates 
		    select="item[generate-id()=generate-id(key('src',concat(name(..), ../@name, @producer))[1])]"/> 
</xsl:template> 

<xsl:template match="item"> 
    <tr> 
        <td><br/></td> 
        <td><br/></td> 
        <td><xsl:value-of select="@producer"/></td> 
        <td><br/></td> 
    </tr> 
		    <xsl:apply-templates 
		    select="key('src',concat(name(..), ../@name, @producer))" mode="ebat"/> 
        
</xsl:template> 

<xsl:template match="item" mode="ebat"> 
    <tr> 
        <td><br/></td> 
        <td><br/></td> 
        <td><br/></td> 
        <td>
        <xsl:value-of select="@name"/>_
        <xsl:value-of select="@producer"/>
        </td> 
    </tr> 
</xsl:template> 



</xsl:stylesheet>
 
Сверху