Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как отфильтровать одинаковые записи. / 9 сообщений из 9, страница 1 из 1
03.07.2009, 17:52
    #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
03.07.2009, 20:55
    #36073019
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отфильтровать одинаковые записи.
Ищите. Раз в две недели тут появляется такой вопрос.

С уважением, Vasilisk
...
Рейтинг: 0 / 0
06.07.2009, 10:54
    #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
02.10.2009, 23:29
    #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
02.10.2009, 23:49
    #36230538
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отфильтровать одинаковые записи.
Как пробовали? Что получается?

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

С уважением, Vasilisk
По аналогии с тем, что приводит выше автор темы.
Только вместо if'a использую when. И в одном случае просто вывожу, в другом - еще following::Model
В результате получается все хорошо, кроме того, что выводятся только два совпадения. И для моего примера - последний Ford Fusion игнорируется.
...
Рейтинг: 0 / 0
05.10.2009, 13:38
    #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
06.10.2009, 22:43
    #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
06.10.2009, 22:47
    #36236205
npl
npl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отфильтровать одинаковые записи.
ух ты! спасибо!!! я правда уже вопрос решила, внеся еще дополнительные проверки в свой код.
но кажется ваш вариант короче и элегантней. еще раз спасибо!
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как отфильтровать одинаковые записи. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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