Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как подсчитать количество элементов в текущей группе? / 12 сообщений из 12, страница 1 из 1
18.01.2011, 19:59
    #37065375
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подсчитать количество элементов в текущей группе?
Сильно не пинайте, ну не силен я...
Использую известный метод группировки Мюнха.
Имеем xml

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0"?>
<list>
  <item id="aa" group="x"/>
  <item id="bb" group="y"/>
  <item id="ab" group="x"/>
  <item id="ba" group="z"/>
  <item id="cc" group="y"/>
  <item id="ac" group="y"/>
  <item id="ca" group="x"/>
  <item id="dc" group="x"/>
  <item id="ad" group="z"/>
</list>

Хочу получить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?xml version="1.0"?>
<group-list>
  <group name="x" count="4">
    <item name="aa"/>
    <item name="ab"/>
    <item name="ca"/>
    <item name="dc"/>
  </group>
  <group name="y" count="3">
    <item name="bb"/>
    <item name="cc"/>
    <item name="ac"/>
  </group>
  <group name="z" count="2">
    <item name="ba"/>
    <item name="ad"/>
  </group>
</group-list>

Как подсчитать количество элементов в текущей группе?

Код: 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.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
  exclude-result-prefixes="xsl"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 >

<xsl:output method="xml" indent="yes"/>
<xsl:key name="group" match="item" use="@group"/>

<xsl:template match="list">
  <group-list>
    <xsl:apply-templates 
      select="item[generate-id(.) = generate-id(key('group',@group))]"
    />
  </group-list>
</xsl:template>
  
<xsl:template match="item">
  <group name="{@group}">
    <xsl:for-each select="key('group',@group)">
      <item name="{@id}"/>
    </xsl:for-each>
  </group>
</xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
18.01.2011, 20:48
    #37065426
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подсчитать количество элементов в текущей группе?
Код: plaintext
 <group name="{@group}" count="{count(key('group',@group))}">
...
Рейтинг: 0 / 0
18.01.2011, 20:50
    #37065429
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подсчитать количество элементов в текущей группе?
refreg
Код: plaintext
 <group name="{@group}" count="{count(key('group',@group))}">


Спасибо, а то экспериментировал со всякими выражениями..
...
Рейтинг: 0 / 0
18.01.2011, 20:58
    #37065436
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подсчитать количество элементов в текущей группе?
refreg
Код: plaintext
 <group name="{@group}" count="{count(key('group',@group))}">


Прошу прощения, а как будет выглядеть выражение суммы по какому-нибудь другому полю внутри группы?
Спасибо
...
Рейтинг: 0 / 0
18.01.2011, 21:24
    #37065456
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подсчитать количество элементов в текущей группе?
sp,

Не понятен вопрос count не сумма, а количество. Если количество, скажем, с id = "aa" то так:
Код: plaintext
count_id="{count(key('group',@group)[@id='aa'])}"
PS. есть и сумма - функция sum, ее желательно применять к числовым данным
...
Рейтинг: 0 / 0
18.01.2011, 21:53
    #37065490
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подсчитать количество элементов в текущей группе?
refregsp,

Не понятен вопрос count не сумма, а количество. Если количество, скажем, с id = "aa" то так:
Код: plaintext
count_id="{count(key('group',@group)[@id='aa'])}"
PS. есть и сумма - функция sum, ее желательно применять к числовым данным

Имелось в виду, что к примеру в исходном xml есть еще атрибут, к примеру Cost и необходимо подсчитать общую стоимость элементов в группе
...
Рейтинг: 0 / 0
18.01.2011, 21:58
    #37065498
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подсчитать количество элементов в текущей группе?
sp,

Код: plaintext
sum_cost="{sum(key('group',@group)/@cost)}"
...
Рейтинг: 0 / 0
18.01.2011, 22:04
    #37065508
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подсчитать количество элементов в текущей группе?
refregsp,

Код: plaintext
sum_cost="{sum(key('group',@group)/@cost)}"


Спасибо, очень выручили!
...
Рейтинг: 0 / 0
16.05.2011, 02:18
    #37261842
gelov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подсчитать количество элементов в текущей группе?
Подскажите, пожалуйста, уже не знаю что делать. Имеется файл xml
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?xml version="1.0" encoding="UTF-8"?>
<quiz>
    <subject name="Geography">
        <query difficulty="A"> <question>some question</question> <answer>some answer</answer> </query>
        <query difficulty="B"> <question>some question</question> <answer>some answer</answer> </query>
        <query difficulty="B"> <question>some question</question> <answer>some answer</answer> </query>
        <query difficulty="B"> <question>some question</question> <answer>some answer</answer> </query>
        <query difficulty="C"> <question>some question</question> <answer>some answer</answer> </query>
        <query difficulty="C"> <question>some question</question> <answer>some answer</answer> </query>
    </subject>
    <subject name="People">
        <query difficulty="A"> <question>some question</question> <answer>some answer</answer> </query>
        <query difficulty="A"> <question>some question</question> <answer>some answer</answer> </query>
        <query difficulty="B"> <question>some question</question> <answer>some answer</answer> </query>
        <query difficulty="C"> <question>some question</question> <answer>some answer</answer> </query>
        <query difficulty="C"> <question>some question</question> <answer>some answer</answer> </query>
    </subject>
</quiz>

Хочу получить

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="utf-8"?>
<table>
   <tr>
      <th scope="row">Geography</th>
      <td>C2</td>
      <td>B3</td>
      <td>A1</td>
   </tr>
   <tr>
      <th scope="row">People</th>
   </tr>
      <td>C2</td>
      <td>B1</td>
      <td>A2</td>
   </tr>
</table>

текущий XSL почему-то считает difficulty во всём файле (т.е. А3 B4 C4) и показывает результат только в первой группе (Geography), а не в каждой группе subject. Как это исправить?

Код: 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.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:key name="difficult" match="query" use="@difficulty"/>

    <xsl:template match="quiz">
        <table>
            <xsl:apply-templates select="subject" />
        </table>
    </xsl:template>
    
    <xsl:template match="subject">
        <tr>
            <th scope="row">
                <xsl:value-of select="@name"/> 
            </th>
            <xsl:for-each select="query[generate-id()=generate-id(key('difficult',@difficulty))]">
                    <xsl:sort select="@difficulty" order="descending"/>
                <td>
                    <xsl:value-of select="@difficulty"/>
                    <xsl:value-of select="count(key('difficult',@difficulty))"/>
                </td>
            </xsl:for-each>
        
        </tr>
    </xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
16.05.2011, 08:52
    #37261942
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подсчитать количество элементов в текущей группе?
gelov,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<xsl:template match="subject">
	<xsl:variable name="cur_subject_name" select="@name"/>
	<tr>
		<th scope="row">
			<xsl:value-of select="@name"/>
		</th>
		<xsl:for-each select="query[generate-id()=generate-id(key('difficult',@difficulty)[../@name=$cur_subject_name])]">
			<xsl:sort select="@difficulty" order="descending"/>
			<td>
				<xsl:value-of select="@difficulty"/>
				<xsl:value-of select="count(key('difficult',@difficulty)[../@name=$cur_subject_name])"/>
			</td>
		</xsl:for-each>
	</tr>
</xsl:template>
...
Рейтинг: 0 / 0
29.06.2011, 23:28
    #37329767
gelov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подсчитать количество элементов в текущей группе?
refreg, Большое спасибо!!!!!! ^_^
...
Рейтинг: 0 / 0
30.06.2011, 17:15
    #37331120
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подсчитать количество элементов в текущей группе?
gelovrefreg, Большое спасибо!!!!!! ^_^
большое спасибо))
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как подсчитать количество элементов в текущей группе? / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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