powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / перебор элементов с заменой значения
19 сообщений из 19, страница 1 из 1
перебор элементов с заменой значения
    #36204253
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
День добрый. Бьюсь с XSLT. Начинающий. Может дадите внятный пример на тему перебор элементов с заменой значений к примеру такая ситуация, имеется 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.
<?xml version='1.0' encoding='UTF-8'?>
<doc>
<row>
	<city>NY</city>
	<name>Иван</name>
	<number> 111111 </number>
</row>
<row>
	<city>NY</city>
	<name>Иван</name>
	<number> 222222 </number>
</row>
<row>
	<city>Chicago</city>
	<name>Иван</name>
	<number> 333333 </number>
</row>
<row>
	<city>Chicago</city>
	<name>Иван</name>
	<number> 444444 </number>
</row>
</doc>

на выходе допустим

NY Иван 111111
- - 222222
Chicago - 333333
- - 444444

то есть смысл я думаю ясен, если значение равно предыдущему то -, если нет то пишем само значение, в общем-то алгоритм как бы ясен, но я не могу воспроизвести его в xsl, то ли folowwing-sibling юзать, то ли переменные ввести, в общем подскажите пожалуйста, буду весьма признателен.
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36205468
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда скорее preceding-sibling

С уважением, Vasilisk
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36207164
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я это и имел ввиду, может поможете куском кода? просто для примера, буду весьма признателен
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36208739
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasosесли значение равно предыдущему
Т.е. проверяется равенство не с любым предшествующим, а только с предыдущим
Код: 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.
<?xml version="1.0" encoding="windows-1251"?> 
<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 
  <xsl:template match="/doc">
    <root>
      <xsl:apply-templates select="*"/>
    </root>
  </xsl:template>

  <xsl:template match="row">
    <tr>
      <xsl:apply-templates select="*">
        <xsl:with-param name="pos" select="position()"/>
      </xsl:apply-templates>
    </tr>
  </xsl:template>

  <xsl:template match="*">
    <xsl:param name="pos"/>
    <td>
      <xsl:choose>
        <xsl:when test="../../row[$pos - 1]/*[local-name() = local-name(current())] = current()">
          <xsl:value-of select="'-'"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="."/>
        </xsl:otherwise>
      </xsl:choose>
    </td>
  </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36209643
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромное спасибо за пример, будем-с дальше курить XSLT
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36213053
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще такой вопрос по ходу появился, сделал эту заменну при помощи sibling, шаблон формируется динамически, так вот что будет с сортировкой в таком случае(динамическая)? просто у меня она работает некорректно, не могу разобратся с чем это связано
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36213718
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibling кладет на сортировку. И возвращает предыдущие ноды как они лежат в файле. Извратиться можно. Но нужно ли? Т.к. ресурсозатратность шаблона возрастет на порядок.

С уважением, Vasilisk
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36214466
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за разъяснение, буду крутить position().
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36215351
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не пойму как получить значение определенного тега, точнее какой путь к нему должен быть

что-то вроде /doc/row[position()]/city/text()
но естественно это неверно, спасибо ваш шаблон рабочий, но хотелось бы перейти к конкретному разбору, чтобы сравнивать каждый тег с предыдущим по отдельности, может быть мне немного подсобите? буду признателен
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36215781
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо, с этим уже разобрался, но опять какая-то ерунда с сортировкой......:(
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36216254
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
position() тоже кладет на сортировку Я же говорю - нужно извращаться, если нужна сортировка. Подумайте, так ли она Вам нужна?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36217401
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну приказали - делаю :), так а как же быть? На путь истинный может дадите пинок?;)
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36218425
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, например, одним шаблоном отсортировать ноды и запихать их все в переменную. А потом фильтровать уже по этой переменной. Т.е. что-то типа такого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<xsl:variable name="sorted_nodes">
  <xsl:apply-templates select="*" mode="sort">
    <xsl:sort ..../>
  </xsl:apply-templates>
</xsl:variable>

<xsl:apply-templates select="ms:node-set($sorted_nodes)"/>

<xsl:template match="*" mode="sort">
  <xsl:element name="{local-name()}">
    <xsl:apply-templates select="*" mode="sort"/>
  </xsl:element>
</xsl:template>

С уважением, Vasilisk
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36222248
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
большое спасибо за подсказку, буду смотреть это направление.
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36224953
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм...а почему нумерация строк работает? она у меня тоже через position() сделана и не мешает динамической сортировке...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?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:template match='/'>
<xsl:apply-templates select='doc'/>
</xsl:template>
<xsl:template match='doc'>
<table border='1'>
<thead><th onclick="javascript:createSort('n_gruzp','2');">Грузоподьемность</th>
<th onclick="javascript:createSort('n_ispr','2');">Исправность\nТС</th>
<th onclick="javascript:createSort('n_priziz','2');">Планируется\nизъятие</th>
...cut
</thead>
<xsl:for-each select='row'>
<xsl:sort select='/doc/row/n_gruzp' data-type='text'/>
<xsl:variable name='pos' select='position()'/>
<xsl:variable name='pos_prev' select='position()-1'/>
<tr>
<td align='left'>
<xsl:choose>
<xsl:when test='/doc/row[$pos]/n_gruzp=/doc/row[$pos_prev]/n_gruzp'>*повтор*</xsl:when><xsl:otherwise><xsl:value-of select='/doc/row[$pos]/n_gruzp'/></xsl:otherwise></xsl:choose></td>
...cut
я смотрю firebug'ом, значение строки
Код: plaintext
<xsl:sort select='/doc/row/n_gruzp' data-type='text'/>
меняется, но результат почему то не отображается...
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36226327
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasosхм...а почему нумерация строк работает? она у меня тоже через position() сделана и не мешает динамической сортировке...Карма такая
vasos
Код: plaintext
<xsl:variable name='pos' select='position()'/>
Получаем позицию узла в списке узлов, отсортированных по данному критерию
vasos
Код: plaintext
<xsl:when test='/doc/row[$pos]/n_gruzp=/doc/row[$pos_prev]/n_gruzp'>

А тут уже узлы row не сортированы
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36227165
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм...понятненько и все же как быть-то тогда....совсем не хочется менять структуру всего xsl ибо формируется весьма сложным образом....
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36228462
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же сказал как. Записываете в переменную сортированный список узлов и натравливаете шаблон на эту переменную.

С уважением, Vasilisk
...
Рейтинг: 0 / 0
перебор элементов с заменой значения
    #36234939
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уф, спасибо за помощь, вроде отказались от сортировке на клиенте :)
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / перебор элементов с заменой значения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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