powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как сделать xsl-сортировку?
10 сообщений из 10, страница 1 из 1
Как сделать xsl-сортировку?
    #38672088
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как сделать xsl-сортировку?
    #38672434
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

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

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

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

Данные такие:
Код: 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
Как сделать xsl-сортировку?
    #38674331
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и есть.

Добавил в контекст временного документа остальные данные, заработало.
...
Рейтинг: 0 / 0
Как сделать xsl-сортировку?
    #38674847
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariymode="tr" не выводится из-за контекста msxsl:node-set($unsorted) что ли? Типа он получается вне документа?Да. У тебя получается два несвязанных дерева. И работая с одним нужно явно указывать, что хочешь обратиться к другому
...
Рейтинг: 0 / 0
Как сделать xsl-сортировку?
    #38674853
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_ И работая с одним нужно явно указывать, что хочешь обратиться к другомуХочу :) Как указать?
...
Рейтинг: 0 / 0
Как сделать xsl-сортировку?
    #38675821
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как сделать xsl-сортировку?
    #38676054
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или так
Код: 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
10 сообщений из 10, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как сделать xsl-сортировку?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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