как пропустить повторяющиеся узлы

Alexandre

PHPПенсионер
как пропустить повторяющиеся узлы

помогите написать xpath для выбора множества узлов, но с пропуском повторяющихся
(аналог select distinct )
Пример xml:
PHP:
<root>
    <node id="1">name1</node>
    <node id="2">name2</node>
    <node id="1">name1</node>
    <node id="2">name2</node>
    <node id="3">name3</node>
</root>
надо обработать узлы только с неповторяющимися id (т.е. id=1,2,3)

-~{}~ 30.06.04 17:13:

а если быть точнее, то выдать список
name1
name2
name3
 

chameleon

Новичок
Мюнчем:
PHP:
<xsl:key name="nodes" match="/root/node" use="@id"/>
<xsl:apply-templates select="/root/node[generate-id(.)=
                   generate-id(key('nodes', @id))]"/>
не тестил, но вроде оно.
 

chameleon

Новичок
это сморя как применить :)..

PHP:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="nodes" match="/root/node" use="@id"/>
<xsl:template match="/">
<ul>
	<xsl:apply-templates select="/root/node[generate-id(.)=generate-id(key('nodes', @id))]"/>
</ul>
</xsl:template>
<xsl:template match="node">
	<li><xsl:apply-templates/></li>
</xsl:template>
</xsl:stylesheet>
 

slach

Новичок
что значит не заработало ??

generate-id()

без точки попробуй
 

jian

Guest
xml

Код:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="uniq.xsl"?>
<root> 
    <node id="1">name1</node> 
    <node id="2">name2</node> 
    <node id="1">name1</node> 
    <node id="2">name2</node> 
    <node id="3">name3</node> 
</root>
xsl

Код:
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
 <xsl:apply-templates select="root/node/@id"/>
</xsl:template>

<xsl:template match="@id">
 <xsl:if test="not(preceding::node/@id = .)">
  <xsl:value-of select=".."/><br/>
 </xsl:if>
</xsl:template>

</xsl:stylesheet>
 

Alexandre

PHPПенсионер
jian спасибо, красивое решение
но почему-то не отобразило

[chamelion] у мненя то же не получилось

а вот рабочий вариант (мне подсказали :confused: )
PHP:
  <?xml version="1.0" encoding="koi8-r" ?> 
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="nodes">
 <html>
 <body>
 <xsl:for-each select="node">
 <xsl:if test="count(preceding-sibling::node[@id=current()/@id])=0">
  <li>
  <xsl:value-of select="./text()" /> 
  </li> 
  </xsl:if>
  </xsl:for-each>
  </body>
  </html>
  </xsl:template>
  </xsl:stylesheet>
но все равно всем спасибо :)
 

chameleon

Новичок
...и я и jian предоставили _рабочие_ решения,
а вот ваше:
1. Не очень красивый (имхо)
2. Не рабочий по отношению к любому исходному дереву (вообще без корневого шаблона).
 

Alexandre

PHPПенсионер
slach
что значит не заработало ?? generate-id()
без точки попробуй
вот что пишет
Не допускается использование здесь ключевого слова xsl:key.

-~{}~ 02.07.04 11:40:

а может я что-то недопонимаю
PHP:
<?xml version="1.0" encoding="koi8-r"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="nodes">
<html>
<body>

<xsl:key name="nodes" match="/root/node" use="@id"/> 
<xsl:apply-templates select="/root/node[generate-id(.)= 
                   generate-id(key('nodes', @id))]"/>


</body>
</html>
</xsl:template>
</xsl:stylesheet>
-~{}~ 02.07.04 11:44:

chameleon
...и я и jian предоставили _рабочие_ решения,
а вот ваше:
1. Не очень красивый (имхо)
2. Не рабочий по отношению к любому исходному дереву (вообще без корневого шаблона).
согласен это я лоханулся при проверке, не те так был корневой узел обозван

-~{}~ 02.07.04 11:46:

jian - самое красивое решение
еще раз спасибо
 

chameleon

Новичок
Автор оригинала: Alexandre
вот что пишет
Не допускается использование здесь ключевого слова xsl:key.
а может я что-то недопонимаю
Точно недопонимаете..
елемент xsl:key я вляется дочерним по отношению к xsl:stylesheet... а вы его куда засунули?....ей богу, нужен был простой copy/paste...
 

slach

Новичок
оно медленное у него
красивое и классическое это как раз группировка ...

попробуйте его решение на 1000 элементах хотя бы
 
Сверху