powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / удаление повторяющихся строк
7 сообщений из 7, страница 1 из 1
удаление повторяющихся строк
    #35756171
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Читал несколько тем о том, как игнорировать повторяющиеся ноды, в частности:
Группировка? и XLS + убрать дублирующие ноды . Моя задача несколько отличается, дело в том, что мне нужно получить из неполностью дублирующейся ветки некоторые данные, а потом ее проигнорировать.

Имею 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.
<queryResult>
  ...
  <result>
    <row>
      <Имя>Иван</Имя>
      <Фамилия>Иванов</Фамилия>
      <Количество> 5 </Количество>
      <Дата> 12 . 01 . 2009 </Дата>
    </row>
    <row>
      <Имя>Петр</Имя>
      <Фамилия>Петров</Фамилия>
      <Количество> 2 </Количество>
      <Дата> 10 . 01 . 2009 </Дата>
    </row>
    <row>
      <Имя>Иван</Имя>
      <Фамилия>Иванов</Фамилия>
      <Количество> 3 </Количество>
      <Дата> 12 . 01 . 2009 </Дата>
    </row>
  ...
  </result>
</queryResult>

Я вывожу эти данные в таблицу и, чтобы не дублировать всю строку, хочу вывести все значения тега <Количество> через запятую при обработке первой строки из набора дублирующихся.

Вот, как я пытаюсь это сделать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml"/>
  <xsl:template match="/queryResult">
    <xsl:for-each select="result/row">
      <xsl:if test="not(preceding-sibling::row/Имя = Имя and preceding-sibling::row/Фамилия = Фамилия"/>
        <Row>
	    <Cell><xsl:value-of select="Имя"/></Cell>
	    <Cell><xsl:value-of select="Фамилия"/></Cell>
	    <Cell><xsl:value-of select="Количество"/>
	      <xsl:if test="following-sibling::row/Имя = Имя and following-sibling::row/Фамилия = Фамилия">
	         <xsl:text>, </xsl:text><xsl:value-of select="following-sibling::row/Количество"/>
	      </xsl:if></Cell>
	    <Cell><xsl:value-of select="Дата"/></Cell>
	</Row>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Условие
Код: plaintext
"following-sibling::row/Имя = Имя and following-sibling::row/Фамилия = Фамилия"
выдает true и false совершенно непредсказуемым способом.

Условие
Код: plaintext
"not(preceding-sibling::row/Имя = Имя and preceding-sibling::row/Фамилия = Фамилия"
вобще не работает, я проверял значения, там всегда первая нода. Помогите, пожалуйста, разобраться?


У меня есть подозрение, что выбранный мною способ не совсем подходит к задаче, т.к. повторяющихся строк может быть больше двух, а я захватываю только 2.
Мне кажется, наиболее подходящий алгоритм приведен в XLS + убрать дублирующие ноды . Пожалуйста, помогите мне преобразовать его для моих нужд?
...
Рейтинг: 0 / 0
удаление повторяющихся строк
    #35756236
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
"not(preceding-sibling::row/Имя = current()/Имя and preceding-sibling::row/Фамилия = current()/Фамилия"
...
Рейтинг: 0 / 0
удаление повторяющихся строк
    #35756237
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вернее даже так
Код: plaintext
"not(preceding-sibling::row[Имя = current()/Имя and Фамилия = current()/Фамилия]"
...
Рейтинг: 0 / 0
удаление повторяющихся строк
    #35756362
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слушайте , мне одному кажется что в
_Vasilisk_"not(preceding-sibling::row[Имя = current()/Имя and Фамилия = current()/Фамилия]"
закрывающей круглой скобки нехватает?
это первое.
второе, смущает вот это:
Код: plaintext
1.
  <xsl:template match="/queryResult">
    <xsl:for-each select="result/row">
ну для начала слеш в первой строке,
третье кодировка - если utf-8 , то с 99% уверенностью с рускими тегами ничего работать не будет.
Тестинг показал что оснавная загвозка идет в первом условии.
Немного не то что ты хотел, но все же:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml"/>
        <xsl:template match="queryResult">
            <xsl:for-each select="result/row">
                <xsl:if test="following-sibling::row/Имя = Имя and following-sibling::row/Фамилия = Фамилия">
                    
                <Row>
                    <Cell><xsl:value-of select="Имя"/></Cell>
                    <Cell><xsl:value-of select="Фамилия"/></Cell>
                    <Cell><xsl:value-of select="Количество"/>
                        <xsl:if test="following-sibling::row/Имя = Имя and following-sibling::row/Фамилия = Фамилия">
                            <xsl:text>, </xsl:text><xsl:value-of select="following-sibling::row/Количество"/>
                        </xsl:if></Cell>
                    <Cell><xsl:value-of select="Дата"/></Cell>
                </Row>
                </xsl:if>
            </xsl:for-each>
        </xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
удаление повторяющихся строк
    #35756364
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в общем складывается впечатление что ты ось используешь не в том направлении, то есть надо обходить братьев ниже, а ты как будто пытаешься искать в тех что раньше, хотя... могу и ошибаться
...
Рейтинг: 0 / 0
удаление повторяющихся строк
    #35756752
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Используя условие, предложенное _Vasilisk_ , преобразовал свою xsl-ку к следующему виду:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml"/>
  <xsl:template match="/queryResult">
       <xsl:for-each select="result/row">
	<xsl:if test="not(preceding-sibling::row[Имя = current()/Имя and Фамилия = current()/Фамилия])">
		<Row>
                          <Cell><xsl:value-of select="Имя"/></Cell>
                          <Cell><xsl:value-of select="Фамилия"/></Cell>
                          <Cell><xsl:value-of select="Количество"/>
		           <xsl:if test="(following-sibling::row[Имя = current()/Имя and Фамилия = current()/Фамилия])">
			       <xsl:text>, </xsl:text><xsl:value-of select="following-sibling::row[Имя = current()/Имя and Фамилия = current()/Фамилия]/Количество"/>
		           </xsl:if></Cell>
                          <Cell><xsl:value-of select="Дата"/></Cell>
		</Row>
	</xsl:if>
        </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

SuSaа в общем складывается впечатление что ты ось используешь не в том направлении, то есть надо обходить братьев ниже, а ты как будто пытаешься искать в тех что раньше, хотя... могу и ошибаться
Первым условием xsl:if я отсекаю повторяющиеся строки(теперь оно работает).Вторым xsl:if я выбираю нужную мне информацию из идущей далее дублирующей строки. Загвоздка в том, что в предложенной реализации я выбираю нужную мне информацию только из первой дублирующей строки, а остальные просто отсекаются первым xsl:if. Как избавиться от этого ограничения?

SuSaтретье кодировка - если utf-8 , то с 99% уверенностью с рускими тегами ничего работать не будет.
Работает с русскими тегами. это факт :)

Чем вас не устраивает строчка <xsl:template match="/queryResult"> ?
Я использую ее вместо <xsl:template match="/">, чтобы не писать лишнего в путях.
...
Рейтинг: 0 / 0
удаление повторяющихся строк
    #35760087
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался, как выбирать нужную мне информацию из всех похожих братьев. Заменил условие
Код: plaintext
1.
2.
		           <xsl:if test="(following-sibling::row[Имя = current()/Имя and Фамилия = current()/Фамилия])">
			       <xsl:text>, </xsl:text><xsl:value-of select="following-sibling::row[Имя = current()/Имя and Фамилия = current()/Фамилия]/Количество"/>
		           </xsl:if>
на следующее:
Код: plaintext
1.
2.
3.
		           <xsl:for-each select="following-sibling::row[Имя = current()/Имя and Фамилия = current()/Фамилия]">
			       <xsl:text>, </xsl:text><xsl:value-of select="Количество"/>
		           </xsl:for-each>
и как это я сразу не догадался.. :))
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / удаление повторяющихся строк
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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