Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / динамическая группировка с помощью XSLT и JavaScript / 4 сообщений из 4, страница 1 из 1
22.06.2010, 13:12
    #36700407
altum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамическая группировка с помощью XSLT и JavaScript
Здравствуйте! Помогите, пожалуйста, советом.

Есть задача: при клике менять группировку элементов.
XML файл (xml.xml):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<?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:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
<?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 таким образом:

Код: plaintext
1.
2.
$('#on_vid').click(function(){
	$('#list #body').transform({xml:'xml.xml', xsl:'xsl.xsl', xslParams:{nameGroup:'vid'}})
})

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

P.S.
значение параметра может быть только строкой
...
Рейтинг: 0 / 0
22.06.2010, 14:07
    #36700562
Andry Trushin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамическая группировка с помощью XSLT и JavaScript
altum,
не совсем понимаю твою задачу.

1. ты используешь ключи, значит это не сортировка а группировка, т.к. на выходе ты получаешь не полный сет записей. Если так и надо, то ключи надо строить на все поля, чтобы уметь групировать по ним.

2. не совсем понятен смысл xsl:if, так написать было не проще?

Код: plaintext
1.
2.
<xsl:template match="/bodyData/planshets">
    <xsl:apply-templates  select="item[key('country_val',country)]"/>
</xsl:template>

3. ну и хотя-бы накидай выход, который ты хочешь получить.
Я так понимаю, что с жиКвери у тебя проблем нет, проблемы именно с трансформацией...
...
Рейтинг: 0 / 0
22.06.2010, 22:49
    #36701872
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамическая группировка с помощью XSLT и JavaScript
Как-то так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<?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>
...
Рейтинг: 0 / 0
23.06.2010, 09:09
    #36702172
altum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамическая группировка с помощью XSLT и JavaScript
_Vasilisk_

ГЕНИАЛЬНО!! Работает!! Спасибо!!

Ещё подсказали способ с помощью группировки Мюнха
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<?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>

Andry Trushin
1. ну так я и написал altumЕсть задача: при клике менять группировку элементов
2. хорошо, учту. спасибо
3. ну если попробовать запустить тот код, который я опубликовал, то, думаю, будет понятно какой вид я хочу

Всем спасибо!!
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / динамическая группировка с помощью XSLT и JavaScript / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]