Развертывание данных в ввиде таблицы

Alexandre

PHPПенсионер
Развертывание данных в ввиде таблицы

есть данные:
PHP:
<root>
<row  group="A" operaor="Misha" count=23  >
<row  group="B" operaor="Misha" count=32  >
<row  group="C" operaor="Misha" count=13  >
<row  group="A" operaor="Lesha" count=34  >
<row  group="B" operaor="Lesha" count=53  >
<row  group="C" operaor="Lesha" count=61  >
<row  group="A" operaor="Vasay" count=34  >
<row  group="B" operaor="Vasay" count=53  >
<row  group="C" operaor="Vasay" count=61  >
</root>
Нужно построить след. таблицу, при том, известны только перечень групп, Имена Операторов заранее неизвестны:
Код:
operator/group        A        B          C

Misha                  23      32         13
Lesha                  34      53         61
Vasya                  34      53         61
подскажите как написать XSLT
 

slach

Новичок
хоть бы XML валидный привел чтоли =)

XML
<?xml version="1.0"?>
PHP:
<root>
<row group="A" operator="Misha" count="23"/>
<row group="B" operator="Misha" count="32"/>
<row group="C" operator="Misha" count="13"/>
<row group="A" operator="Lesha" count="34"/>
<row group="B" operator="Lesha" count="53"/>
<row group="C" operator="Lesha" count="61"/>
<row group="A" operator="Vasay" count="34"/>
<row group="B" operator="Vasay" count="53"/>
<row group="C" operator="Vasay" count="61"/>
</root>
XSLT
<?xml version="1.0" ?>
PHP:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="windows-1251" method="html" indent="no"/>
<xsl:key name="group_idx" match="/root/row" use="@group"/>
<xsl:variable name="unique_group" select="/root/row[generate-id()=generate-id(key('group_idx',@group))]"/>

<xsl:key name="operator_idx" match="/root/row" use="@operator"/>
<xsl:variable name="unique_operator" select="/root/row[generate-id()=generate-id(key('operator_idx',@operator))]"/>

<xsl:template name="main" match="/root">
 <table width="100%" border="0">
 <tr>
  <td>operator/group</td>

  <xsl:for-each select="$unique_group">
   <td><xsl:value-of select="@group"/></td>
  </xsl:for-each>

 </tr>

 <xsl:for-each select="$unique_operator">
 <tr>

  <xsl:apply-templates select="/root/row[@operator=current()/@operator]" mode="count">
   <xsl:sort select="@group"/>
  </xsl:apply-templates>

 </tr>
 </xsl:for-each>

 </table>
</xsl:template>

<xsl:template match="/root/row" mode="count">
 <td><xsl:value-of select="@count"/></td>
</xsl:template>

</xsl:stylesheet>
 

Alexandre

PHPПенсионер
slachвсе ОК - спасибо огромное, именно то, что мне нужно, только есть маленький недочет:
вот при отсутствии узла данных, например
PHP:
<root> 
<row group="A" operator="Misha" count="23"/> 
<row group="B" operator="Misha" count="32"/> 
<row group="C" operator="Misha" count="13"/> 
<!--  group="A" operator="Lesha"  -->
<row group="B" operator="Lesha" count="53"/> 
<row group="C" operator="Lesha" count="61"/> 
<row group="A" operator="Vasay" count="34"/> 
<row group="B" operator="Vasay" count="53"/> 
<row group="C" operator="Vasay" count="61"/> 
</root>
происходит смещение:
Код:
operator/group        A        B          C

Misha                  23      32         13
Lesha                  [b]53      61[/b]
Vasya                  34      53         61
но я постараюсь этот недочет вывести путем введения фиктивных узлов <row group="А" operator="Lesha" count=""/>
 

jian

Guest
Код:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output encoding="utf-8" method="html" indent="no"/> 

<xsl:template match="/"> 
<table width="100%" border="1"> 
<tr> 
  <td>operator/group</td> 
  <td>a</td> 
  <td>b</td> 
  <td>c</td> 
</tr> 
<xsl:apply-templates select="root/row"/>
</table> 
</xsl:template> 

<xsl:template match="row" > 
<xsl:if test="not(preceding-sibling::row/@operator = @operator)">
<xsl:variable name="curr_ope" select="@operator"/>
<tr> 
   <td><xsl:value-of select="$curr_ope"/></td> 
   <td><xsl:value-of select="../row[@operator=$curr_ope][@group='A']/@count"/></td> 
   <td><xsl:value-of select="../row[@operator=$curr_ope][@group='B']/@count"/></td> 
   <td><xsl:value-of select="../row[@operator=$curr_ope][@group='C']/@count"/></td> 
</tr> 
</xsl:if>
</xsl:template> 

</xsl:stylesheet>
hehe
 

Alexandre

PHPПенсионер
но я постараюсь этот недочет вывести путем введения фиктивных узлов
кстати введение фиктивных узлов - не такая уж простая задача, как оказалось с первого раза.
jian посмотрю твой вариант. А вообще интерестный подход, спасибо.
 

Alexandre

PHPПенсионер
jian что то не пошло, но я эту проблему решил обработкой в скрипте с использованием массивов.
 
Сверху