xslt: сумма дочерних элементов в дереве (nested sets)

jer

...
xslt: сумма дочерних элементов в дереве (nested sets)

есть дерево описанное в виде nested sets:
PHP:
<tree>
<node id="1" level="1" left_key="1" right_key="8" items="3">dept1</node>
<node id="2" level="2" left_key="2" right_key="5" items="1">dept2</node>
<node id="3" level="3" left_key="3" right_key="4" items="23">dept3</node>
<node id="4" level="2" left_key="6" right_key="7" items="5">dept4</node>

и т.д...
</tree>
к каждом узлу привязано определенное количество товаров. нужно вывести дерево и чтобы у каждого раздела выводилось не только кол-во товаров привязанное именно к нему, но и кол-во товаров дочерних элементов.

т.е. сейчас выводится так:
PHP:
dept1 (3)
  dept2 (1)
    dept3 (23)
  dept4 (5)
а надо

PHP:
dept1 (32)
  dept2 (24)
    dept3 (23)
  dept4 (5)
вывожу дерево примерно так:

PHP:
<xsl:template match="tree">
  <xsl:apply-templates select="node"/>
</xsl:template>

<xsl:template match="node">
  <xsl:variable name="left_key" select="@left_key"/>
  <xsl:variable name="right_key" select="@right_key"/>
  <img src="1x1.gif" width="{@level*10}"/>
  <xsl:value-of select="."/>
  (<xsl:value-of select="<xsl:value-of select="sum(/root/tree[@left_key &gt;= $left_key and @right_key &lt;= $right_key]/@items)"/>"/>)
  <br/>
</xsl:template>
с xpath не очень хорошо знаком. подскажите, плиз, в чем не прав?
 

Voldar

Новичок
А в чем смысл деланья этого таким непростым образом?
Я о том, что если nested sets, то зачем XML, а если все-же XML, то почему не сделать дерево именно средствами XML-я, он же вложенность элементов только так позволяет...
 

jer

...
дерево хранится в базе именно в nested sets, формирование xml-я нет возможности изменить. имхо в xslt - это сделать достаточно просто. только вот пару винтиков надо где-то подкрутить.
 

Voldar

Новичок
Код:
<xsl:template match="node">
  <xsl:variable name="left_key" select="@left_key"/>
  <xsl:variable name="right_key" select="@right_key"/>
  <img src="1x1.gif" width="{@level*10}"/>
  <xsl:value-of select="."/>
  (<xsl:value-of select="sum(//node[@left_key &gt;= $left_key and @right_key &lt;= $right_key]/@items)"/> )
  <br/>
</xsl:template>
Я так понимаю надо что-то типа такого.

-~{}~ 09.03.05 20:28:

Только я не понимаю, как у тебя получился результат dept1 (27) (3+1+23+5 = 32).
 

jer

...
так это тоже самое, вроде...

-~{}~ 09.03.05 20:38:

да, я ошибся, сорри - исправил в оригинальном посте
 

Voldar

Новичок
Нет. У меня, кстати, сработало и выдало
Код:
dept1 (32)
  dept2 (24)
    dept3 (23)
  dept4 (5)
На всякий случай привожу полный XSL-ник:

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

<xsl:template match="node">
  <xsl:variable name="left_key" select="@left_key"/>
  <xsl:variable name="right_key" select="@right_key"/>
  <img src="1x1.gif" width="{@level*10}"/>
  <xsl:value-of select="."/>
  (<xsl:value-of select="sum(//node[@left_key &gt;= $left_key and @right_key &lt;= $right_key]/@items)"/> )
  <br/>
</xsl:template>
</xsl:stylesheet
-~{}~ 09.03.05 20:43:

Значит этот вариант работает правильно. У вас просто синтаксически xsl был нерабочий.
Кроме того я сумирую //node[трам-пам-пам]/@items, а вы почему-то /root/tree[трам-пам-пам]/@items, хотя у tree никаких @items нет.
 

jer

...
хм... да, тут я описАлся.
и правда работает, и мой вариант тоже :)
большое спасибо за помощь, Voldar!!!
а то так бы и тупил ;(((, хотя все было практически верно.
thanks a lot!
 
Сверху