Xpoint
   [напомнить пароль]

динамическая группировка с помощью XSLT и JavaScript

Метки: [без меток]
2010-06-22 11:15:29 [обр] Altum[досье]

Здравствуйте! Помогите, пожалуйста, советом.
Есть задача: при клике менять группировку элементов.
XML файл (xml.xml):

<?xml version='1.0' encoding='windows-1251'?>
<bodyData>

<planshets>
    <item>
        <name>test</name>
        <project>Project 2</project>
        <country>Россия</country>
        <vid>Вид 1</vid>
    </item>
    <item>
        <name>test</name>
        <project>Project 1</project>
        <country>Россия</country>
        <vid>Вид 2</vid>
    </item>
    <item>
        <name>test 2</name>
        <project>Project 2</project>
        <country>Украина</country>
        <vid>Вид 2</vid>
    </item>
   <item>
        <name>test 2</name>
        <project>Project 1</project>
        <country>Украина</country>
        <vid>Вид 2</vid>
    </item>
</planshets>

</bodyData>

XSL файл (xsl.xsl), который группирует по country:

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

    <xsl:param name="nameGroup" select="'country'" />

    <xsl:key name="country_val" match="/bodyData/planshets/item" use="country"/>

    <xsl:template match="/bodyData/planshets">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="item">
        <xsl:if test="not(country=preceding-sibling::item/country)" >

         <table width="95%">
                <tr>
                    <td>
                        <a href="javascript:void(0)" style="text-decoration:none;" class="title">

                            <xsl:value-of select="country"/>

                        </a>
                    </td>
                </tr>
            </table>
            <div class="profile-block-shown">

                    <xsl:apply-templates mode="second" select="key('country_val',country)" />

            </div>

      </xsl:if>
    </xsl:template>

    <xsl:template match="item" mode="second">

        <div align="center">

         <xsl:value-of select="$name_val"/>

        </div>
    </xsl:template>
</xsl:stylesheet>

параметр nameGroup меняется с помощью JavaScript таким образом:

$('#on_vid').click(function(){
   $('#list #body').transform({xml:'xml.xml', xsl:'xsl.xsl', xslParams:{nameGroup:'vid'}})
})

Сам параметр меняет своё значение, но вот как сделать так, чтобы при изменении этого значения элементы группировались по другому (в примере, с country на vid)?
Перепробовал различные варианты, не помогло.

P.S.
значение параметра может быть только строкой

спустя 13 часов [обр] Lynn «Кофеман»(52/571)[досье]
Группировка (Стандартное решение: группировка Мюнха.)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>

    <xsl:param name="nameGroup" select="'country'"/>

    <xsl:key name="country" match="planshets/item" use="country"/>
    <xsl:key name="vid"     match="planshets/item" use="vid"/>

    <xsl:template match="planshets">
        <xsl:apply-templates select="item[generate-id(.) = generate-id(key($nameGroup, *[name() = $nameGroup]))]"/>
    </xsl:template>

    <xsl:template match="item">
         <table width="95%">
            <tr>
                <td>
                    <a href="javascript:void(0)" style="text-decoration:none;" class="title">
                        <xsl:value-of select="*[name() = $nameGroup]"/>
                    </a>
                </td>
            </tr>
        </table>
        <div class="profile-block-shown">
            <xsl:apply-templates mode="second" select="key($nameGroup, *[name() = $nameGroup])" />
        </div>
    </xsl:template>

    <xsl:template match="item" mode="second">
        <div align="center">
            <xsl:value-of select="name"/>
        </div>
    </xsl:template>
</xsl:stylesheet>
спустя 7 часов [обр] Altum[досье]

спасибо!! работает!

ещё подсказали такой способ

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

    <xsl:param name="nameGroup" select="'country'" />

    <xsl:template match="/bodyData/planshets">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="item">
        <xsl:variable name="cur_val" select="*[name() = $nameGroup]"/>
        <xsl:if test="not(preceding-sibling::item/*[name() = $nameGroup and . = $cur_val])" >
   <table width="95%">
                <tr>
                    <td>
                        <a href="javascript:void(0)" style="text-decoration:none;" class="title">
                            <xsl:value-of select="*[name() = $nameGroup]"/>
                        </a>
                    </td>
                </tr>
            </table>
            <div class="profile-block-shown">
                <xsl:apply-templates mode="second" select="/bodyData/planshets/item[*[name() = $nameGroup and . = $cur_val]]" />
            </div>
   </xsl:if>
    </xsl:template>

    <xsl:template match="item" mode="second">
        <div align="center">
     <xsl:value-of select="$name_val"/>
        </div>
    </xsl:template>
</xsl:stylesheet>
Powered by POEM™ Engine Copyright © 2002-2005