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

Есть задача: при клике менять группировку элементов.
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
динамическая группировка с помощью XSLT и JavaScript
    #36700562
Andry Trushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
динамическая группировка с помощью XSLT и JavaScript
    #36701872
Фотография _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="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
динамическая группировка с помощью XSLT и JavaScript
    #36702172
altum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_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
4 сообщений из 4, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / динамическая группировка с помощью XSLT и JavaScript
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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