Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как сделать xsl-сортировку? / 10 сообщений из 10, страница 1 из 1
17.06.2014, 17:11
    #38672088
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать xsl-сортировку?
XML-документ представляет из себя три раздела со списками:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<root>
    <discipline>
        <row DisciplineID="8562" Name="Информатика" />
    </discipline>
    <students>
        <row StudentID="2830" LastName="Пупкин" SumResult="90"/>
    </students>
    <balls>
        <row StudentID="2830" DisciplineID="8562" Result="90" />
    </balls>
</root>


Его нужно развернуть в такую html-табличку:

Студент Баллы за предмет 1Баллы за предмет 2 ...Баллы за предмет N Сумма баллов
Отсортировать ее нужно сначала по по колонке с суммой баллов, а потом по баллам 1, 2, N.
C суммой проблем нет, сортирую перед созданием xml-документа по SumResult, а вот можно ли что-то в xsl сделать с сортировкой по остальным колонкам, если SumResult одинаковый?
...
Рейтинг: 0 / 0
17.06.2014, 23:22
    #38672434
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать xsl-сортировку?
Antonariy,

Дык <xsl:sort> можно указывать более одного раза
...
Рейтинг: 0 / 0
18.06.2014, 06:39
    #38672498
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать xsl-сортировку?
Это понятно, непонятно как отсортировать один набор данных по данным другого.
...
Рейтинг: 0 / 0
18.06.2014, 11:20
    #38672701
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать xsl-сортировку?
Antonariy,

Понял проблему. Я такие задачи решаю через промежуточный node-set(). Т.е. вначале формируешь набор узлов вида
Код: xml
1.
<Student информатика="78" сумма="295/>

А потом уже их выводиишь на страницу с сортировкой
...
Рейтинг: 0 / 0
19.06.2014, 13:35
    #38674269
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать xsl-сортировку?
Что-то не выходит каменный цветок.

Данные такие:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<GOODS>
  <row EntranceCampaignID="26" MetricID="49" ExecFormID="3" GoodsID="9321" Name_RU="Русский язык" Priority="1" /> 
  <row EntranceCampaignID="26" MetricID="49" ExecFormID="3" GoodsID="9322" Name_RU="Обществознание" Priority="2" /> 
  <row EntranceCampaignID="26" MetricID="49" ExecFormID="3" GoodsID="9324" Name_RU="История" Priority="3" /> 
</GOODS>
<STUDENTS>
  <row EntranceCampaignID="26" MetricID="49" ExecFormID="3" OrderGoodsStudentID="101581" LastName_RU="Полусаев" SumResult="215" /> 
  <row EntranceCampaignID="26" MetricID="49" ExecFormID="3" OrderGoodsStudentID="101540" LastName_RU="Пустовойтова" SumResult="139" /> 
</STUDENTS>
<PRELIMINARY>
  <row EntranceCampaignID="26" MetricID="49" ExecFormID="3" OrderGoodsStudentID="101540" GoodsID="9321" Result="70" Type="2" /> 
  <row EntranceCampaignID="26" MetricID="49" ExecFormID="3" OrderGoodsStudentID="101540" GoodsID="9322" Result="69" Type="2" /> 
  <row EntranceCampaignID="26" MetricID="49" ExecFormID="3" OrderGoodsStudentID="101581" GoodsID="9321" Result="73" Type="2" /> 
  <row EntranceCampaignID="26" MetricID="49" ExecFormID="3" OrderGoodsStudentID="101581" GoodsID="9322" Result="73" Type="2" /> 
  <row EntranceCampaignID="26" MetricID="49" ExecFormID="3" OrderGoodsStudentID="101581" GoodsID="9324" Result="69" Type="2" /> 
</PRELIMINARY>


что делаю:

Код: xml
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.
44.
          <tbody>
            <xsl:variable name="unsorted">
              <xsl:apply-templates select="STUDENTS/*" mode="tosort"/>
            </xsl:variable>
            <xsl:for-each select="msxsl:node-set($unsorted)/*">
              <xsl:sort select="sum" order="descending"/>
              <xsl:sort select="r1" order="descending"/>
              <xsl:sort select="r2" order="descending"/>
              <xsl:sort select="r3" order="descending"/>

              <xsl:variable name="id" select="id"/>

              <!-- это выводится -->
              <xsl:value-of select="$id"/>.

              <!-- а это нет -->
              <xsl:apply-templates select="//STUDENTS/*[@OrderGoodsStudentID = $id]" mode="tr"/>
            </xsl:for-each>
          </tbody>

      <xsl:template match="STUDENTS/*" mode="tosort">
        <xsl:variable name="ogs" select="@OrderGoodsStudentID"/>
        <student>
          <id><xsl:value-of select="@OrderGoodsStudentID"/></id>
          <sum><xsl:value-of select="@SumResult"/></sum>
          <xsl:for-each select="/UWS/GOODS/*">
            <xsl:element name="r{position()}">
              <xsl:value-of select="/UWS/PRELIMINARY/*[@OrderGoodsStudentID = $ogs][@GoodsID = current()/@GoodsID]/@Result"/>
            </xsl:element>
          </xsl:for-each>
        </student>
      </xsl:template>

      <xsl:template match="STUDENTS/*" mode="tr">
        <xsl:variable name="ogs" select="@OrderGoodsStudentID"/>
        <tr>
          <td><xsl:value-of select="position()"/></td>
          <td><xsl:value-of select="@LastName_RU"/></td>
          <xsl:for-each select="/UWS/GOODS/*">
            <td><xsl:value-of select="/UWS/PRELIMINARY/*[@OrderGoodsStudentID = $ogs][@GoodsID = current()/@GoodsID]/@Result"/></td>
          </xsl:for-each>
          <td><xsl:value-of select="@SumResult"/></td>
        </tr>
      </xsl:template>



mode="tr" не выводится из-за контекста msxsl:node-set($unsorted) что ли? Типа он получается вне документа?
...
Рейтинг: 0 / 0
19.06.2014, 14:11
    #38674331
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать xsl-сортировку?
Так и есть.

Добавил в контекст временного документа остальные данные, заработало.
...
Рейтинг: 0 / 0
20.06.2014, 02:45
    #38674847
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать xsl-сортировку?
Antonariymode="tr" не выводится из-за контекста msxsl:node-set($unsorted) что ли? Типа он получается вне документа?Да. У тебя получается два несвязанных дерева. И работая с одним нужно явно указывать, что хочешь обратиться к другому
...
Рейтинг: 0 / 0
20.06.2014, 03:26
    #38674853
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать xsl-сортировку?
_Vasilisk_ И работая с одним нужно явно указывать, что хочешь обратиться к другомуХочу :) Как указать?
...
Рейтинг: 0 / 0
20.06.2014, 17:39
    #38675821
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать xsl-сортировку?
Antonariy_Vasilisk_И работая с одним нужно явно указывать, что хочешь обратиться к другомуХочу :) Как указать?
Код: xml
1.
2.
3.
4.
5.
<xsl:variable name="doc" select="/"/>
<xsl:for-each select="msxsl:node-set($unsorted)/*">
  ...........
  <xsl:apply-templates select="$doc//STUDENTS/*[@OrderGoodsStudentID = $id]" mode="tr"/>
</xsl:for-each>
...
Рейтинг: 0 / 0
21.06.2014, 00:05
    #38676054
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать xsl-сортировку?
или так
Код: xml
1.
2.
3.
4.
5.
<xsl:variable name="list" select="//STUDENTS"/>
<xsl:for-each select="msxsl:node-set($unsorted)/*">
  ...........
  <xsl:apply-templates select="$list/*[@OrderGoodsStudentID = $id]" mode="tr"/>
</xsl:for-each>
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как сделать xsl-сортировку? / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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