powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как отфильтровать одинаковые записи.
9 сообщений из 9, страница 1 из 1
Как отфильтровать одинаковые записи.
    #36072820
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой xml
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<divisions>
    <division>
        <name>aaa</name>
    </division>
    <division>
        <name>bbb</name>
    </division>
    <division>
        <name>aaa</name>
    </division>
</divisions>

Нужно вывести наименования всех подразделений, но без повторений. то есть вот такое преобразование:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html" omit-xml-declaration="yes" encoding="utf-8"/>

    <xsl:template match="/">
        <xsl:for-each select="//division">
            <xsl:value-of select="name"/>
            <br/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

не подходит. Так как на выходе получается:

aaa
bbb
aaa


а нужно:

aaa
bbb


В общем, подскажите, как отсечь подразделения с одинаковыми именами.
...
Рейтинг: 0 / 0
Как отфильтровать одинаковые записи.
    #36073019
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ищите. Раз в две недели тут появляется такой вопрос.

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Как отфильтровать одинаковые записи.
    #36074527
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблему решил так:

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

    <xsl:output method="html" omit-xml-declaration="yes" encoding="utf-8"/>

    <xsl:template match="/">
        <xsl:for-each select="//division">

            <xsl:variable name="current_name">
                <xsl:value-of select="name"/>
            </xsl:variable>
            
            <xsl:if test="not (./following-sibling::division[name = $current_name])">
                <xsl:value-of select="name"/>
                 <br/>
            </xsl:if>
           

        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
Как отфильтровать одинаковые записи.
    #36230527
npl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
npl
Гость
Вроде бы задача похожа. Но не очень получается. Прошу помочь...
Дано:
Код: 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.
 <Cars>
   <Car>
        <Name>Nissan</Name>
   </Car>
   <Car>
        <Name>Toyota</Name>
   </Car>
   <Car>
        <Name>Ford</Name>
        <Model>Focus</Model>
   </Car>
   <Car>
        <Name>Suzuki</Name>
        <Model>Swift</Model>
   </Car>
   <Car>
        <Name>Ford</Name>
        <Model>Fiesta</Model>
   </Car>
   <Car>
        <Name>Ford</Name>
        <Model>Fusion</Model>
   </Car>

 </Cars>


Нужно получить:
Код: plaintext
Nissan, Toyota, Ford [Focus,Fiesta,Fusion], Suzuki[Swift]
...
Рейтинг: 0 / 0
Как отфильтровать одинаковые записи.
    #36230538
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как пробовали? Что получается?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Как отфильтровать одинаковые записи.
    #36230553
npl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
npl
Гость
_Vasilisk_Как пробовали? Что получается?

С уважением, Vasilisk
По аналогии с тем, что приводит выше автор темы.
Только вместо if'a использую when. И в одном случае просто вывожу, в другом - еще following::Model
В результате получается все хорошо, кроме того, что выводятся только два совпадения. И для моего примера - последний Ford Fusion игнорируется.
...
Рейтинг: 0 / 0
Как отфильтровать одинаковые записи.
    #36232659
npl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
npl
Гость
Вот что-то такое удалось сделать. Но это работает корректно только, если Car'ов с одинаковым Name не более 2ух штук..
Код: 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.
30.
31.
32.
33.
<xsl:template match='Cars'> 
     <xsl:for-each select="Car">

            <xsl:variable name="cur_name">
                <xsl:value-of select="Name"/>
            </xsl:variable>
	
            <xsl:choose> 
    	      
                 <xsl:when test="(./following-sibling::Car[Name = $cur_name]) and not(./preceding-sibling::Car[Name = $cur_name])">

	      	    <xsl:value-of select="Name"/>
		    <xsl:value-of select="concat('[',Model,',')"/>
				
 	 	    <xsl:value-of select="concat( following::Model, ']')"/>

                </xsl:when>

                <xsl:otherwise>
	      	    <xsl:if test="not(./preceding-sibling::Car[Name = $cur_name])">

	      	         <xsl:value-of select="Name"/>
		
	      	         <xsl:if test="string-length(Model) != 0">
	      	                 <xsl:value-of select="concat('(',Model,')')"/>
	      	         </xsl:if>
	      	    </xsl:if>

                </xsl:otherwise> 

        </xsl:choose> 
           
    </xsl:for-each>
</xsl:template>
...
Рейтинг: 0 / 0
Как отфильтровать одинаковые записи.
    #36236199
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот и код. А вот, как надо
Код: 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.
30.
31.
32.
33.
34.
35.
  <xsl:template match="Cars">
    <xsl:call-template name="format">
      <xsl:with-param name="val">
        <xsl:apply-templates select="Car"/>
      </xsl:with-param>
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="Car">
    <xsl:if test="not(preceding-sibling::Car[Name = current()/Name])">
      <xsl:variable name="models">
        <xsl:call-template name="format">
          <xsl:with-param name="val">
            <xsl:apply-templates select="../Car[Name = current()/Name]" mode="name"/>
          </xsl:with-param>
        </xsl:call-template>
      </xsl:variable>
      <xsl:value-of select="Name"/>
      <xsl:if test="$models !=''">
        <xsl:value-of select="concat(' [', $models, ']')"/>
      </xsl:if>
      <xsl:value-of select="', '"/>
    </xsl:if>
  </xsl:template>

  <xsl:template match="Car" mode="name">
    <xsl:value-of select="concat(Model, ', ')"/>
  </xsl:template>

  <xsl:template name="format">
    <xsl:param name="val"/>
    <xsl:if test="$val != ''">
      <xsl:value-of select="substring($val, 1, string-length($val) - 2)"/>
    </xsl:if>
  </xsl:template>

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


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